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



我有这段代码,它找到了一个名为"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而不是别名lsWhere-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:' 

相关内容

  • 没有找到相关文章

最新更新