PowerShell Get-ItemProperty 在注册表中找不到 DWORD
PowerShell Get-ItemProperty not finding DWORD in registry
我正在尝试创建一个脚本,首先检查注册表中是否有密钥,如果没有;创建它。
$path = "HKCU:\Software\Microsoft\Office.0\Common\Identity\"
$regkey = "Testkey"
$keyvalue = "0"
if ((Get-ItemProperty $path -Name $regkey -ea 0).$regkey) {
"Property already exists"
} else {
Set-ItemProperty -Path $path -Name $regkey -Value $keyvalue
Write-Output "Created key."
}
我的期望:
- 当运行脚本时,如果有同名键,脚本会输出"Property already exists".
- 当运行脚本时,如果没有同名的key,脚本会创建key并输出"Created".
会发生什么:
- 如果密钥存在,但类型为 DWORD,则脚本只输出 "Created"。如果我多次保留 运行 脚本,它仍然显示 "Created".
- 如果我删除密钥并将其创建为 SZ 类型,脚本将按预期运行。
基本上,出于某种原因,我无法编写脚本来发现 DWORD 类型的键。
问题在于您检查注册表值是否存在的方式。您正在获取值,扩展其数据,然后让 PowerShell evaluate the data 在布尔上下文中。在该上下文中,数值 0 的计算结果为 $false
,但字符串值“0”的计算结果为 $true
,因为它是一个非空字符串。同样,非零数值的计算结果为 $true
,字符串 "" 的计算结果为 $false
.
要解决此问题,您需要检查注册表查找是否确实 returns 非空结果:
if ((Get-ItemProperty $path -Name $regkey -EA 0).$regkey <b>-ne $null</b>) {
"Property already exists"
} else {
Set-ItemProperty -Path $path -Name $regkey -Value $keyvalue
Write-Output "Created key."
}
我正在尝试创建一个脚本,首先检查注册表中是否有密钥,如果没有;创建它。
$path = "HKCU:\Software\Microsoft\Office.0\Common\Identity\"
$regkey = "Testkey"
$keyvalue = "0"
if ((Get-ItemProperty $path -Name $regkey -ea 0).$regkey) {
"Property already exists"
} else {
Set-ItemProperty -Path $path -Name $regkey -Value $keyvalue
Write-Output "Created key."
}
我的期望:
- 当运行脚本时,如果有同名键,脚本会输出"Property already exists".
- 当运行脚本时,如果没有同名的key,脚本会创建key并输出"Created".
会发生什么:
- 如果密钥存在,但类型为 DWORD,则脚本只输出 "Created"。如果我多次保留 运行 脚本,它仍然显示 "Created".
- 如果我删除密钥并将其创建为 SZ 类型,脚本将按预期运行。
基本上,出于某种原因,我无法编写脚本来发现 DWORD 类型的键。
问题在于您检查注册表值是否存在的方式。您正在获取值,扩展其数据,然后让 PowerShell evaluate the data 在布尔上下文中。在该上下文中,数值 0 的计算结果为 $false
,但字符串值“0”的计算结果为 $true
,因为它是一个非空字符串。同样,非零数值的计算结果为 $true
,字符串 "" 的计算结果为 $false
.
要解决此问题,您需要检查注册表查找是否确实 returns 非空结果:
if ((Get-ItemProperty $path -Name $regkey -EA 0).$regkey <b>-ne $null</b>) {
"Property already exists"
} else {
Set-ItemProperty -Path $path -Name $regkey -Value $keyvalue
Write-Output "Created key."
}