Команда PowerShell должна вернуться с кодом выхода> 0 в случае ошибки. Вы можете справиться с этим, как это:
set "DBSCRIPT=C:\Scripts\UpdateAppDB.ps1"
if exists %DBSCRIPT% (
powershell -Command %DBSCRIPT% || ( rem Error handling routines here )
) else (
echo "Script not found." >> C:\TestResults\TestLog.txt
exit
)
или как это (требуется задержка включена расширение):
setlocal EnableDelayedExpansion
set "DBSCRIPT=C:\Scripts\UpdateAppDB.ps1"
if exists %DBSCRIPT% (
powershell -Command %DBSCRIPT%
if !errorlevel! neq 0 ( rem Error handling routines here )
) else (
echo "Script not found." >> C:\TestResults\TestLog.txt
exit
)
В качестве примечания: так как вы хотите, чтобы запустить сценарий PowerShell, я хотел бы использовать вместо powershell -File "%DBSCRIPT%"
от powershell -Command "%DBSCRIPT%"
. Двойные кавычки вокруг переменной заботятся о потенциальных пространствах на пути.
Редактировать: Чтобы быть ясным, приведенный выше код обрабатывает ненулевые коды возврата либо из исполняемого файла PowerShell, либо из сценария PowerShell. Он не позволяет и не может заменить обработку ошибок внутри сценария PowerShell. Если вы хотите, чтобы скрипт PowerShell для завершения всех ошибок (и указать статус ошибки с ненулевым кодом завершения) вам необходимо, по крайней мере что-то вроде этого в сценарии PowerShell:
$ErrorActionPreference = "Stop"
try {
# ...
# rest of your code here
# ...
} catch {
Write-Error $_
exit 1
}
ли Powershell установить * errorlevel *, для которого вы можете проверить? 'if errorlevel 1 goto BAD'. Это может потребовать от вас «CALL» POWERSHELL, если он иначе не вернется. –
Это не так, но если невозможно сделать что-то вроде try> catch в пакете, я могу изменить powershell, чтобы выбросить код выхода или что-то в этом роде. –
@SeanLong Да, ваш скрипт должен выйти с соответствующим кодом состояния. Пакет не имеет обработки исключений. Он может реагировать только на то, что вернула внешняя команда. –