Variable = Выполненный блок скрипта с try/catch

Я пытаюсь найти наличие определенного свойства реестра и, если оно присутствует, установить значение переменной. Я буду выполнять последовательность 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, но, боже мой, это уродливо.

не делай так. [ухмылка] сохраните результаты вашего 1-го звонка, используйте if, чтобы решить, хотите ли вы сделать 2-й звонок. вы делаете вещи НАМНОГО сложнее, чем нужно... сохраните результаты в $Vars и используйте их для принятия решений.

Lee_Dailey 23.06.2019 21:21

Удалите литерал хеш-таблицы @{}, окружающий блоки try/catch.

Mathias R. Jessen 23.06.2019 21:27

Давайте, черт возьми, я думал, что пытался if ($value = try {Get-ItemPropertyValue "Registry::$nameKey" -name:AdskProductCode}catch{}) { в первый раз, и это не сработало! Может быть, 30-градусная жара сегодня варит мой мозг.

Gordon 23.06.2019 21:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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.

Другие вопросы по теме