Ключ реестра существует True для ложного вывода - PullRequest
1 голос
/ 11 апреля 2020

У меня есть то, что я считаю простым сценарием Power Shell, который я пытаюсь запустить. Сценарий в основном проверяет существование RegKey и возвращает значение с выходным значением 0 или 1.

Проблема, с которой я столкнулся, заключается в том, что результаты моего теста не соответствуют друг другу. Ex. Ключ Reg не существует, и сценарий выполняется, возвращается правильное значение, 0. Я вручную добавляю ключ в реестр и снова запускаю сценарий, ожидая Write-Output 1, но возвращается 0. Теперь, если я изменю параметр в операторе if с $ null на что-то вроде $ false, вернется правильный вывод до тех пор, пока я не вернусь go и не повторю мой процесс тестирования. Я надеюсь, что у кого-то будет время взглянуть на то, что я написал, и указать мне правильное направление.

New-PSDrive -PSProvider registry -Root HKEY_CLASSES_ROOT -Name HKCR
Test-Path -Path 'HKCR:\Installer\UpgradeCodes\59DD538593C91FA40B60EB02250187C0*'
if($path -eq $null) {Write-Output 0}
else
{Write-output 1} 
 remove-psdrive -name HKCR

1 Ответ

3 голосов
/ 11 апреля 2020
  • Test-Path, как и все Test-* командлеты в PowerShell, возвращает значение Boolean , , т. Е. Либо $true или $false, поэтому не стоит сравнивать его с $null; вместо этого просто используйте его как есть в условном .

  • Нет необходимости создавать диск PowerShell, чтобы вы могли получить доступ к HKEY_CLASSES_ROOT кусту [1] ; Вы можете просто использовать префикс поставщика registry:: PS для доступа к собственному пути реестра .

Следовательно:

if (Test-Path -Path registry::HKEY_CLASSES_ROOT\Installer\UpgradeCodes\59DD538593C91FA40B60EB02250187C0*) {
  1  # same as: Write-Output 1
}
else {
  0  # same as: Write-Output 0
}

Если напротив, вы хотели получить заданные c ключи, которые соответствуют подстановочному выражению , использовать Get-Item:

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

[1] Обратите внимание, что HKEY_CLASSES_ROOT на самом деле представляет собой составное представление двух отдельных поддеревьев реестра: машинного уровня HKEY_LOCAL_MACHINE:\Software\Classes и пользовательского уровня HKEY_CURRENT_USER:\Software\Classes. То есть вы видите объединение ключей от этих поддеревьев в HKEY_CLASSES_ROOT; если реестр значение существует в обоих местоположениях, значение HKEY_CURRENT_USER имеет приоритет.

...