Проблема множественного вылова PowerShell - PullRequest
1 голос
/ 29 мая 2019

Я слежу за примерами Microsoft и получаю сообщение об ошибке при запуске в 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: термин 'catch' не распознается как имя командлета, функции, сценарияфайл или работоспособная программа.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и попробуйте снова.

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

Ответы [ 3 ]

1 голос
/ 29 мая 2019

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

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

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

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

PSReadLine, если вход "завершен", например, он анализирует без исключения IncompleteParseException, то вход будет принят ...

[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 захотел перехватить нажатие правой кнопки мышиловушку мыши, для эмуляции функции буфера обмена Windows теперь потребуется PSReadline, чтобы использовать специальные API-интерфейсы Windows. Это идет вразрез с кросс-платформенной функциональностью «Core».вставлять как только рекомендуемый способ вставки.

0 голосов
/ 29 мая 2019

Итак, получается, что я не могу просто скопировать и вставить этот скрипт в командное окно 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
}
0 голосов
/ 29 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...