如何让PowerShell的Get-Item返回格式兼容的注册表路径?
解决PowerShell注册表路径不兼容问题
原命令始终返回$false:
Get-Item -Path "HKCU:\Software\*" | Test-Path "$($_.Name)\Test"
问题原因
Get-Item返回的注册表项Name属性是传统注册表路径格式(比如执行(Get-Item -Path "HKCU:\Software\Adobe").Name会得到HKEY_CURRENT_USER\Software\Adobe),而Test-Path等PowerShell cmdlet只识别PSDrive格式的注册表路径(比如HKCU:\Software\Adobe),所以即便目标路径实际存在,Test-Path也会返回$false。
解决方法
有两种简单有效的方式获取PowerShell兼容的注册表路径:
方式一:使用
PSPath属性
注册表项对象自带的PSPath属性包含完整的PSDrive格式路径,直接使用即可:Get-Item -Path "HKCU:\Software\*" | Test-Path "$($_.PSPath)\Test"如果需要纯路径(去掉
PSPath自带的Microsoft.PowerShell.Core\Registry::前缀),可以做个简单替换:Get-Item -Path "HKCU:\Software\*" | ForEach-Object { $compatiblePath = $_.PSPath -replace 'Microsoft.PowerShell.Core\\Registry::','' Test-Path "$compatiblePath\Test" }方式二:手动替换路径前缀
将传统根键名称替换为对应的PSDrive别名,比如HKEY_CURRENT_USER替换为HKCU:,HKEY_LOCAL_MACHINE替换为HKLM::Get-Item -Path "HKCU:\Software\*" | Test-Path "$($_.Name -replace '^HKEY_CURRENT_USER','HKCU:')\Test"
内容的提问来源于stack exchange,提问作者Strill
相关产品推荐
相关产品推荐

