Я пытаюсь найти наличие определенного свойства реестра и, если оно присутствует, установить значение переменной. Я буду выполнять последовательность If/Then/ElseIf, поэтому я не хочу оборачивать дыру в Try/Catch, чтобы учесть тот факт, что в PS5.1 Get-ItemPropertyValue
не поддерживает -errorAction:silentlyContinue
, поэтому я действительно хочу установить значение для выполнения блока кода, который включает попытку/улов с пустым уловом, что-то вроде этого...
if ($value = @{try {Get-ItemPropertyValue "Registry::$nameKey" -name:AdskProductCode}catch{}}) {
Я чувствую, что это возможно, и я близок и просто упускаю какой-то нюанс. Или, может быть, это глупая идея, и есть лучший подход? Основная причина сохранения try/catch внутри if/then/else заключается в том, что я буду искать AdskProductCode и не найду это свойство, я буду искать AdskPackageCode, и в каждом случае то, что я делаю со значением, отличается. Если try/catch оборачивает iff, то не найдя AdskProductCode, я полностью выгружаюсь, и я никогда не доберусь до else, если ищу AdskPackageCode. Если не будет хотя бы final else, а может и еще if, так что просто искать AdskPackageCode в улове не получится. Я мог бы каскадировать материал try/catch, но, боже мой, это уродливо.
Удалите литерал хеш-таблицы @{}
, окружающий блоки try
/catch
.
Давайте, черт возьми, я думал, что пытался if ($value = try {Get-ItemPropertyValue "Registry::$nameKey" -name:AdskProductCode}catch{}) { в первый раз, и это не сработало! Может быть, 30-градусная жара сегодня варит мой мозг.
to address the fact that in PS5.1 Get-ItemPropertyValue doesn't support -errorAction:silentlyContinue
Действительно, начиная с PowerShell Core 7.0.0-preview.1 / Windows PowerShell v5.1, Get-ItemPropertyValue
неожиданно сообщает об ошибке оператор-завершение, а не об ошибке бессрочный, и только последний тип ошибки можно контролировать с помощью общего параметра -ErrorAction
.
Это проблематичное поведение, ограниченное случаем, когда реестр стоимость (в отличие от содержащего ключ) не существует, описан в эта проблема GitHub.
try
/ catch
могут контролировать только ошибки прекращение, а использование пустого блока catch
для ошибки прекращение эквивалентно передаче -ErrorAction Ignore
командлету, выдающему ошибку бессрочный.
Ваша единственная проблема, как указывает Матиас Р. Джессен, заключалась в том, что вы по ошибке обернули свой оператор try
/ catch
в @{ ... }
— литерал хэш-таблицы, что само по себе вызвало ошибку завершения оператора.
Возможно, вы думали об $( ... )
, операторе подвыражения, который будет работать в этом случае, но его использование не обязательно, поэтому достаточно следующего:
if ($value = try { Get-ItemPropertyValue "Registry::$nameKey" -name:AdskProductCode } catch{}) { ...
То есть вы можете напрямую использовать оператор try
/catch
как выражение и, следовательно, присвоить его переменной.
Учитывая, что поведение Get-ItemPropertyValue
может - и, надеюсь, будет - в конечном итоге исправлено, я предлагаю другой подход:
Вместо этого используйте Get-ItemProperty
и получите доступ к интересующему имени значения результирующего объекта в качестве свойства:
if ($value = (Get-ItemProperty "Registry::$nameKey").AdskProductCode) { ...
Примечание:
"Registry::$nameKey"
действительно существует (т. е. может не существовать только реестр стоимость); чтобы игнорировать отсутствие ключевого пути, используйте -ErrorAction Ignore
.1
.Set-StrictMode -Version 2
или более поздняя версия, не используйте прямой доступ к свойствам и вместо этого используйте канал к Select-Object -ErrorAction Ignore -ExpandProperty AdskProductCode
.
не делай так. [ухмылка] сохраните результаты вашего 1-го звонка, используйте if, чтобы решить, хотите ли вы сделать 2-й звонок. вы делаете вещи НАМНОГО сложнее, чем нужно... сохраните результаты в $Vars и используйте их для принятия решений.