Проблема множественного улова PowerShell

Я следую Примеры Майкрософт и получаю сообщение об ошибке при запуске в PowerShell (5.1). Я не могу воспроизвести это в ISE.

$app = "notepad2354.exe"
try{
   iex $app
}
catch [System.Management.Automation.CommandNotFoundException]{
   write-host 'ERROR! The app file could not be found.'
}
catch {
   write-host 'ERROR! Unknown error when executing the step. Error: ' + $_.Exception.Message
}

Ошибка:

catch : The term 'catch' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Странно, что с первого раза работает нормально. Если я переключаю порядок, второй всегда терпит неудачу с этим сообщением. Любые идеи, почему это ошибочно?

Этот синтаксис работает, согласно эта тема. Я не могу воспроизвести на Powershell v4. Какая у вас версия Powershell?

Rich Moss 29.05.2019 21:05

моя настройка = win7, ps5.1 ///// я НЕ ПОЛУЧАЮ эту ошибку, когда общий улов 1-й - я получаю Catch block must be the last catch block. - чего и следовало ожидать, поскольку общий улов предназначен для «ни одного из предыдущих совпадений» . ///// я подозреваю, что у вас опечатка ИЛИ недопустимый символ, который заставляет PoSh думать, что catch не совпадает с предыдущим try.

Lee_Dailey 29.05.2019 21:23

@Lee_Dailey Я буквально скопировал текст из своего вопроса и получаю ошибку при втором улове.

UnhandledExcepSean 29.05.2019 21:27

какую версию PoSh вы используете?

Lee_Dailey 29.05.2019 21:28

@Lee_Dailey 5.1.14393.2879

UnhandledExcepSean 29.05.2019 21:29

Я потерян. [вздох ...] ваш код, скопированный в мое окно ISE, работает правильно. когда я переворачиваю два блока catch, я получаю ошибку Catch block must be the last catch block. - как и ожидалось.

Lee_Dailey 29.05.2019 21:35

@Lee_Dailey Разобрался с проблемой. В основном это была ошибка пользователя. Это первое, что мне не удалось просто вставить в окно PowerShell и запустить.

UnhandledExcepSean 29.05.2019 21:36

@UnhandledExcepSean - спасибо за публикацию исправления ... я до сих пор не понимаю, ПОЧЕМУ это ... но вы заставили его работать, и это главная проблема. [ухмылка]

Lee_Dailey 29.05.2019 21:50

@Lee_Dailey Я понял, это из-за PSReadline. Смотрите мой ответ ниже.

HAL9256 29.05.2019 22:40

@UnhandledExcepSean - о. мой. Боже... спасибо, что обратили на это мое внимание! [ухмылка]

Lee_Dailey 29.05.2019 22:45
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
10
4 043
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Уловы для конкретного типа всегда должны располагаться перед всеми, поэтому ожидайте ошибки, если вы измените порядок уловов выше. Однако ошибка, которую вы получаете, не соответствует моим ожиданиям, поэтому я могу только предположить, что у вас где-то есть синтаксическая опечатка. Единственный способ воспроизвести это — выполнить блок catch без попытки перед ним.

Итак, получается, что я не могу просто скопировать и вставить этот скрипт в командное окно PowerShell. Он работает в ISE и, как я только что узнал, работает внутри файла сценария Powershell.

Я предполагаю, что он обрабатывает try..catch как пакет и не читает всю вставленную команду перед выполнением. Вы можете обойти эту проблему, убедившись, что второй захват находится в той же строке, что и первый захват, например:

$app = "notepad2354.exe"
try{
   iex $app
}
catch [System.Management.Automation.CommandNotFoundException]{
   write-host 'ERROR! The app file could not be found.'
} catch {
   write-host 'ERROR! Unknown error when executing the step. Error: ' + $_.Exception.Message
}
Ответ принят как подходящий

Чтобы добавить к ответу @UnhandledExcepSean, где он увидел, что его проблема связана с копированием\вставкой в ​​​​консоль PowerShell.

Основная проблема заключается в том, что PSReadline изменил функцию вставки правой кнопкой мыши.

PSReadline, изначально предлагавшийся как устанавливаемый модуль для PowerShell v3 и v4, теперь входит в состав PowerShell v5+ и PowerShell Core 6+ по умолчанию. Это хороший модуль, который добавляет множество новых вещей, таких как подсветка синтаксиса, улучшенное многострочное редактирование и т. д.

Когда PSReadline импортируется, вставка правой кнопкой мыши не «работает», как ожидалось, см. проблему GitHub: Вставка правой кнопкой мыши должна работать в основном так же, как вставка Ctrl+v 579. Что происходит в:

PSReadLine, if the input is "complete", as in, it parses without an IncompleteParseException, then the input will be accepted...

[https://github.com/PowerShell/PSReadLine/issues/579#issuecomment-345824783]

По сути, вставка правой кнопкой мыши исходит от узла «GUI» терминала Windows PowerShell и передает символы в консоль PowerShell, где они перехватываются и интерпретируются PSReadline для обеспечения таких вещей, как подсветка синтаксиса. По мере поступления конечная фигурная скобка } + новая строка завершает оператор и выполняется. Второй оператор catch в новой строке выдает ошибку, потому что он действительно неверен сам по себе.

Вместо этого, если вы используете Ctrl+V для вставки, сработает описанное выше копирование/вставка кода делает. функция Ctrl+V сразу доставляет все содержимое буфера обмена в PSReadline, который интерпретирует все как единое целое, прежде чем продолжить выполнение.

Вы не видите, как это происходит в PowerShell ISE или скриптах, потому что вставка правой кнопкой мыши не происходит.

Ради интереса вы можете удалить PSReadline в сеансе консоли PowerShell:

Remove-Module PSReadline

И затем увидите, что вставка правой кнопкой мыши теперь работает как "ожидаемая".... Хотя все достоинства PSReadline тоже исчезли :-(

Поскольку функциональность щелчка правой кнопкой мыши является проблемой терминала Windows PowerShell, даже если PSReadline захочет перехватить хук правой кнопки мыши, для этого потребуется PSReadline теперь использовать специальные API Windows для эмуляции функции буфера обмена Windows. Это противоречит кросс-платформенной функциональности «Core». Это означает, что эта аномалия при щелчке правой кнопкой мыши, скорее всего, сохранится при вставке Ctrl+V в качестве рекомендуемого Только способа вставки.

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