我有一个我认为是一个简单的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
值优先。