PowerShell Get-ItemProperty не находит DWORD в реестре

Я пытаюсь создать скрипт, который сначала проверяет, есть ли ключ в реестре, и если его нет; создает его.

$path = "HKCU:\Software\Microsoft\Office\16.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."
}

Что я ожидаю:

  • При запуске скрипта, если есть ключ с таким же именем, скрипт выдаст «Свойство уже существует».
  • При запуске скрипта, если нет ключа с таким же именем, скрипт создаст ключ и выведет «Создано».

Что происходит:

  • Если ключ существует, но имеет тип DWORD, сценарий просто выводит «Создано». Если я продолжаю запускать скрипт несколько раз, он все равно говорит «Создано».
  • Если я удалю ключ и создам его как тип SZ, скрипт будет работать так, как ожидалось.

В общем, по какой-то причине я не могу закодировать скрипт, чтобы также обнаруживать ключи типа DWORD.


person Atheos    schedule 08.08.2019    source источник


Ответы (1)


Проблема заключается в том, как вы проверяете наличие значения реестра. Вы получаете значение, расширяете его данные, а затем позволяете PowerShell оценивает данные в логическом контексте. Числовое значение 0 в этом контексте оценивается как $false, но строковое значение "0" оценивается как $true, поскольку это непустая строка. Точно так же ненулевое числовое значение будет оцениваться как $true, а строка "" будет оцениваться как $false.

Чтобы решить эту проблему, вам нужно проверить, действительно ли поиск в реестре возвращает непустой результат:

if ((Get-ItemProperty $path -Name $regkey -EA 0).$regkey -ne $null) {
    "Property already exists"
} else {
    Set-ItemProperty -Path $path -Name $regkey -Value $keyvalue
    Write-Output "Created key."
}
person Ansgar Wiechers    schedule 08.08.2019
comment
Конечно, я знал, что это было просто, но я не мог в жизни понять это. Спасибо не только за ответ, но и за прекрасное объяснение! - person Atheos; 08.08.2019