Я следую Примеры Майкрософт и получаю сообщение об ошибке при запуске в 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.
Странно, что с первого раза работает нормально. Если я переключаю порядок, второй всегда терпит неудачу с этим сообщением. Любые идеи, почему это ошибочно?
моя настройка = win7, ps5.1 ///// я НЕ ПОЛУЧАЮ эту ошибку, когда общий улов 1-й - я получаю Catch block must be the last catch block.
- чего и следовало ожидать, поскольку общий улов предназначен для «ни одного из предыдущих совпадений» . ///// я подозреваю, что у вас опечатка ИЛИ недопустимый символ, который заставляет PoSh думать, что catch
не совпадает с предыдущим try
.
@Lee_Dailey Я буквально скопировал текст из своего вопроса и получаю ошибку при втором улове.
какую версию PoSh вы используете?
@Lee_Dailey 5.1.14393.2879
Я потерян. [вздох ...] ваш код, скопированный в мое окно ISE, работает правильно. когда я переворачиваю два блока catch
, я получаю ошибку Catch block must be the last catch block.
- как и ожидалось.
@Lee_Dailey Разобрался с проблемой. В основном это была ошибка пользователя. Это первое, что мне не удалось просто вставить в окно PowerShell и запустить.
@UnhandledExcepSean - спасибо за публикацию исправления ... я до сих пор не понимаю, ПОЧЕМУ это ... но вы заставили его работать, и это главная проблема. [ухмылка]
@Lee_Dailey Я понял, это из-за PSReadline
. Смотрите мой ответ ниже.
@UnhandledExcepSean - о. мой. Боже... спасибо, что обратили на это мое внимание! [ухмылка]
Уловы для конкретного типа всегда должны располагаться перед всеми, поэтому ожидайте ошибки, если вы измените порядок уловов выше. Однако ошибка, которую вы получаете, не соответствует моим ожиданиям, поэтому я могу только предположить, что у вас где-то есть синтаксическая опечатка. Единственный способ воспроизвести это — выполнить блок 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
в качестве рекомендуемого Только способа вставки.
Этот синтаксис работает, согласно эта тема. Я не могу воспроизвести на Powershell v4. Какая у вас версия Powershell?