PowerShell循环中REG DELETE如何处理带空格的注册表路径?
问题根源
你的代码失效主要有两个原因:
- PowerShell的字符串转义、拼接语法使用错误,你写的三引号加+号的拼接逻辑不符合PowerShell语法规范,生成的路径格式错误。
- 调用外部程序
reg.exe时,带空格的路径必须被双引号包裹才能被正确识别。
最优解决方法(推荐)
直接使用PowerShell原生的Remove-Item命令操作注册表,不需要调用外部exe,也不用额外处理引号问题:
Get-ChildItem "HKCU:\test" -Recurse | ForEach-Object { if((Get-ItemProperty -Path $_.PsPath) -match "Matching Value including Spaces") { # -Force参数对应reg delete的/f强制删除,-Recurse删除子项 Remove-Item -Path $_.PsPath -Force -Recurse } }
必须使用reg.exe的解决方法
如果你一定要调用reg.exe实现,两种正确的引号处理写法如下:
Get-ChildItem "HKCU:\test" -Recurse | ForEach-Object { if((Get-ItemProperty -Path $_.PsPath) -match "Matching Value including Spaces") { # 写法1:直接在传参时加转义的双引号,PowerShell中用`转义双引号 reg delete "`"$($_.PsPath)`"" /f # 写法2:先把带引号的路径存入变量 $regkey = "`"$($_.PsPath)`"" reg delete $regkey /f } }
补充说明
PowerShell的双引号字符串本身支持变量插值,不需要用+做字符串拼接,你原来的拼接写法是其他编程语言的习惯,在PowerShell中不需要这么使用。另外建议执行删除前先打印$_.PsPath确认路径符合预期,避免误删注册表。
内容的提问来源于stack exchange,提问作者tar
相关产品推荐
相关产品推荐

