Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ms_windows_ms_sql:powershell_exe_files_in_try_catch [2021/05/25 09:33]
admin created
ms_windows_ms_sql:powershell_exe_files_in_try_catch [2021/05/25 10:45] (current)
admin
Line 1: Line 1:
-Powershell некорректно обрабатывает коды выхода из запущенных exe-файлов. \\ +**Powershell** некорректно обрабатывает коды выхода из запущенных нативных exe-файлов (не из командлетов). \\ 
-Допустим у нас есть команда, которая возвращает ошибку и мы хоти ее обработать с помощью **Try-Catch**. \\+Допустим у нас есть команда, которая запускает exe-файл и возвращает код отличный от 0 и мы хотим обработать эту ситуацию с помощью **Try-Catch**. \\
 Вопреки интуитивному ожиданию такая конструкция не сработает: Вопреки интуитивному ожиданию такая конструкция не сработает:
 <code> <code>
Line 12: Line 12:
   Wtite-Host "We got an error!!!"   Wtite-Host "We got an error!!!"
 }</code> }</code>
-Не сработает. Мы не получим сообщения **We got an error!!!** при ненулевом коде возврата из **run_buggy_executive.exe**, а запущены будут оба исполняемых файла (или команды).+Мы не получим сообщения **We got an error!!!** при ненулевом коде возврата из **run_buggy_executive.exe**, а запущены будут оба исполняемых файла (или команды).
 Как же быть? \\ Как же быть? \\
-Вариантов несколько (https://stackoverflow.com/questions/9948517/how-to-stop-a-powershell-script-on-the-first-error): +Вариантов фактически два (https://stackoverflow.com/questions/9948517/how-to-stop-a-powershell-script-on-the-first-error): 
-  * Вручную проверять код выхода: <code>try+  * Вручную проверять код выхода (код запуска и проверки можно обернуть в функцию, но фактически способ останется тем же): <code>try
 { {
   doSomething -arg myArg   doSomething -arg myArg
-  if (-not $?) {throw "Failed to doSomething"}+  if (-not $?) { Write-Error -Message "doSomething Failed...-ErrorAction Stop }
 } }
 catch  catch 
 { {
-  Write-Host -Message "We have a problem. $PSItem"+  Write-Error -Message "We have a problem. $PSItem" -ErrorAction Stop 
 +}</code> Тут важно обратить внимание на **-ErrorAction Stop** - без него будет просто отображение сообщения об ошибке, а не остановка. \\ Ну или можно использовать **throw** вместо **Write-Error -ErrorAction Stop** 
 +  * Второй вариант - гораздо более практичный, но очень неочевидный - это перенаправление **stderr** в **stdout**:<code>try 
 +
 +  doSomething -arg myArg 2>&
 +
 +catch  
 +
 +  Write-Error -Message "We have a problem. $PSItem" -ErrorAction Stop
 }</code> }</code>
- +В итоге - при ошибке код в блоке **Try** остановится на строке, которая вызвала ошибку и дальше исполнится блок **Catch**. 
-<code>+
  
  
  • ms_windows_ms_sql/powershell_exe_files_in_try_catch.txt
  • Last modified: 2021/05/25 10:45
  • by admin