我有这段代码,它找到了一个名为"c02ebc5353d9cd11975200aa004ae40e"的注册表项。这非常有效。但是,该变量还具有Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Office。完成时找到键的路径。如何删除 Microsoft.powershell.core\Registry:: 部分?
$path = ls 'HKCU:' -Recurse | where { $_.Name -like
'*c02ebc5353d9cd11975200aa004ae40e*' } | Select PSParentPath | ft -AutoSize -Wrap
我查看了在变量上使用 .replace 函数,如下所示:
$path.replace ("Microsoft.PowerShell.CoreRegistry::HKEY_CURRENT_USER", "HKU:")
我收到此错误:[Microsoft.PowerShell.Commands.Internal.Format.FormatStartData] does not contain a method named 'replace'.
.但是如果我在正常变量上执行此操作,则.replace
部分工作正常
任何帮助表示赞赏。
-
格式化 cmdlet 如
ft
(Format-Table
) 仅用于显示数据-不要将其输出用作后续处理的数据。- 从第一个命令中删除
| ft -AutoSize -Wrap
。 - 由于
ft
生成类型(如[Microsoft.PowerShell.Commands.Internal.Format.FormatStartData]
)的输出对象,这些对象没有.Replace()
方法,因此调用失败。
- 从第一个命令中删除
-
您正在寻找
[string]
型.Replace()
方法,但即使没有ft
调用,Select PSParentPath
也不会输出字符串,而是输出具有具有所需值的.PSParentPath
属性的包装器对象。要仅输出值,请使用-ExpandProperty
:- 使用
Select -ExpandProperty PSParentPath
跳过包装器对象并将.PSParentPath
值直接输出为字符串。
- 使用
将它们放在一起(使用Get-ChildItem
而不是别名ls
,Where-Object
而不是别名where
):
$path = Get-ChildItem HKCU: -Recurse | Where-Object {
$_.Name -like '*c02ebc5353d9cd11975200aa004ae40e*'
} | Select -ExpandProperty PSParentPath
$path.Replace("Microsoft.PowerShell.CoreRegistry::HKEY_CURRENT_USER", "HKCU:")
这是一个简化的替代解决方案,它:
假设仅将通配符模式应用于注册表项名称就足够了(
.Name
属性实际上报告完整键路径),在这种情况下,可以使用Get-ChildItem
的-Include
参数。使用 PowerShell 的
-replace
运算符,与.Replace()
字符串方法不同,该运算符对正则表达式进行操作,这可以实现更多功能;在手牌的情况下,它允许将匹配锚定在字符串^
的开头(但相反,需要转义正则表达式元字符,例如.
和与
)。
(Get-ChildItem HKCU: -Recurse -Include *c02ebc5353d9cd11975200aa004ae40e*)
.PSParentPath -replace '^Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER', 'HKCU:'