Powershell - 使用字符串替换将完全限定的路径转换为基于PS驱动器的路径

时间:2018-04-19 00:01:30

标签: powershell replace path registry

我有这个代码,它找到一个名为“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部分可以正常工作

任何帮助表示感谢。

1 个答案:

答案 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代替别名lsWhere-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()的开头锚定匹配(但反过来需要转义正则表达式元数据,例如^. \

\