注册表项存在 true 的假输出



我有一个我认为是一个简单的Power shell脚本,我正在尝试运行。该脚本基本上将检查 RegKey 是否存在,并返回一个输出为 0 或 1 的值。

我遇到的问题是我的测试结果不一致。 例如,Reg 键不存在,并且执行脚本时返回正确的值 0。我手动将密钥添加到注册表并再次运行脚本,期望写入输出为 1,但返回的内容为 0。现在,如果我将 if 语句中的参数从 $null 更改为类似 $false 的内容,则返回正确的输出,直到我返回并重复我的测试过程。 我希望有人有时间看看我写的东西,并为我指出正确的方向。

New-PSDrive -PSProvider registry -Root HKEY_CLASSES_ROOT -Name HKCR
Test-Path -Path 'HKCR:InstallerUpgradeCodes59DD538593C91FA40B60EB02250187C0*'
if($path -eq $null) {Write-Output 0}
else
{Write-output 1} 
remove-psdrive -name HKCR
Test-Path
  • 像PowerShell中的所有Test-*cmdlet一样,返回一个布尔,即$true$false,所以你不应该将其与$null进行比较;相反,只需在条件中按原样使用它。

  • 无需创建 PowerShell 驱动器即可访问HKEY_CLASSES_ROOT配置单元[1];只需使用registry::PS 提供程序前缀即可访问本机注册表路径

因此:

if (Test-Path -Path registry::HKEY_CLASSES_ROOTInstallerUpgradeCodes59DD538593C91FA40B60EB02250187C0*) {
1  # same as: Write-Output 1
}
else {
0  # same as: Write-Output 0
}

相比之下,如果要获取通配符表达式匹配的特定键,请使用Get-Item

$path = Get-Item -Path registry::HKEY_CLASSES_ROOTInstallerUpgradeCodes59DD538593C91FA40B60EB02250187C0*
if ($null -eq $path) {  # Always place $null on the LHS
'not found'
}
else {
'found at least one'
}

[1] 请注意,HKEY_CLASSES_ROOT实际上是两个不同注册表子树的复合视图:计算机级HKEY_LOCAL_MACHINE:SoftwareClasses和用户级HKEY_CURRENT_USER:SoftwareClasses。也就是说,您可以在HKEY_CLASSES_ROOT中看到这些子树中的键的并集;如果两个位置都存在注册表,则HKEY_CURRENT_USER值优先。

最新更新