Переменная = Выполнен блок скрипта с try / catch - PullRequest
1 голос
/ 23 июня 2019

Я пытаюсь найти наличие определенного свойства реестра и, если оно есть, установить значение переменной.Я буду делать последовательность If / Then / ElseIf, поэтому я не хочу оборачивать дыру в Try / Catch, чтобы учесть тот факт, что в PS5.1 Get-ItemPropertyValue не поддерживает -errorAction:silentlyContinue, поэтому яочень хочу установить значение для выполнения блока кода, который включает в себя try / catch с пустым catch, что-то вроде этого ...

if ($value = @{try {Get-ItemPropertyValue "Registry::$nameKey" -name:AdskProductCode}catch{}}) {

Я чувствую, что это возможно, и я близок и простопропуская некоторый нюанс.Или, может быть, это глупая идея, и есть лучший подход?Они являются основной причиной сохранения try / catch внутри if / then / else, потому что я буду искать AdskProductCode, а не найдя это свойство, я буду искать AdskPackageCode, и в каждом случае то, что я делаю со значением, отличается.Если try / catch завершает iff, то не обнаружение AdskProductCode полностью выводит меня из строя, и я никогда не добираюсь до остального, если ищу AdskPackageCode.В случае неудачи, что будет, по крайней мере, еще один финал, и, может быть, еще один, если так, просто поиск AdskPackageCode в улове не работает.Я мог бы каскадно пробовать и ловить, но, боже, это ужасно.

1 Ответ

0 голосов
/ 23 июня 2019

, чтобы учесть тот факт, что в PS5.1 Get-ItemPropertyValue не поддерживает -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 / *Оператор 1052 * в виде выражения и, следовательно, присвоение его переменной.


Учитывая, что поведение 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.
...