【问题标题】:How to escape forward slash '/' in path with PowerShell如何使用 PowerShell 转义路径中的正斜杠“/”
【发布时间】:2021-10-14 22:04:03
【问题描述】:

最近,我编写了一个 powershell 脚本来处理注册表中的一些信息。但是当我使用 cmdlet 访问镜像中的注册表路径时

Get-ChildItem -Path 'HKLM:\SOFTWARE\Classes\MAPI/Attachment'

我收到错误信息:

Get-ChildItem:找不到路径“HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MAPI\Attachment”,因为它不存在。

我知道这是因为路径中的正斜杠/,但我想知道如何转义它,或者如何通过任何方法访问路径。

【问题讨论】:

  • 使用反勾号。您也可以只指定-LiteralPath
  • @AbrahamZinala 我已经用过-LiteralPath了,还是不行。
  • 不幸的是,您看到了一个错误/设计限制,在 PowerShell 7.2 中仍然存在:除了\ / 也被视为路径分隔符。虽然这种可互换的分隔符使用对 file-system 路径很有帮助,但它会导致注册表路径出现问题,因为 / 是键名中的合法字符。请参阅 [GitHub 问题 #5536](github.com/PowerShell/PowerShell/issues/…。用` 转义/ 不起作用;实用的解决方法是枚举父路径的键并按名称使用Where-Object 过滤。/cc @AbrahamZinala。

标签: powershell registry


【解决方案1】:

一个工作区,如果你真的想得到你可以使用的对象:

Get-ChildItem -Path 'HKLM:\SOFTWARE\Classes' | where {$_.name -like "*MAPI/Attachment"}

按照@mklement0 评论的建议提高效率:

Get-ChildItem -Path 'HKLM:\SOFTWARE\Classes' | where PSChildName -eq 'MAPI/Attachment'

【讨论】:

  • 这个可以用,可惜不能很好的用在脚本里。我的初衷是遍历注册表。
  • 这就是我称之为工作场所的原因。 ;)
  • 很好,不过为了提高鲁棒性,我建议where { $_.name -like "*\MAPI/Attachment" }(注意\ ),或者更有效一点,where { $_.PSChildName -eq 'MAPI/Attachment' }(简化语法:| where PSChildName -eq 'MAPI/Attachment'
  • @JPBlanc 我看到了@mklement0 的cmets,也许这是最好的办法,至少对于当前版本的powershell,谢谢!
【解决方案2】:

可以用 unicode 字符替换正斜杠:

Get-ChildItem -Path 'HKLM:\SOFTWARE\Classes\MAPI/Attachment'.Replace("/",[char]0x2215)

【讨论】:

  • 好像[char]0x2215而不是/,我试了下还是不行
  • 除了晦涩难懂之外,这仅在您在实际键名中使用此替换字符(DIVISION SLASH,U+2215)时才有效,而不仅仅是在查找时 - 这样做不是带有其他人定义的键的选项,例如在这种情况下。
猜你喜欢
  • 2014-08-29
  • 2012-07-10
  • 2018-10-01
  • 2012-11-16
  • 2020-11-20
  • 1970-01-01
  • 2012-08-30
  • 2017-03-16
  • 1970-01-01
相关资源
最近更新 更多