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