2014-11-05 2 views
1

Мне нужен способ, чтобы иметь возможность выпустить пакетный скрипт и записывать его в файл журнала, если сценарий powershell не работает по какой-либо причине.Вызов сценария powershell из пакетного сценария

Сейчас у меня есть что-то похожее на это:

SET DBSCRIPT=C:\Scripts\UpdateAppDB.ps1 
IF EXISTS %DBSCRIPT% (
    POWERSHELL -Command %DBSCRIPT% 
) ELSE (
    ECHO "Script not found." >> C:\TestResults\TestLog.txt` 
    EXIT 
) 

Есть ли способ обработки ошибок, которые могут возникнуть во время выполнения в PowerShell?

+0

ли Powershell установить * errorlevel *, для которого вы можете проверить? 'if errorlevel 1 goto BAD'. Это может потребовать от вас «CALL» POWERSHELL, если он иначе не вернется. –

+0

Это не так, но если невозможно сделать что-то вроде try> catch в пакете, я могу изменить powershell, чтобы выбросить код выхода или что-то в этом роде. –

+0

@SeanLong Да, ваш скрипт должен выйти с соответствующим кодом состояния. Пакет не имеет обработки исключений. Он может реагировать только на то, что вернула внешняя команда. –

ответ

2

Команда 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 
} 
+0

Я думаю, что 'ERRORLEVEL 'будет представлять то, что сам PowerShell вернул, а не то, что сделал скрипт PowerShell. Пока PowerShell запускается и пытается запустить файл сценария, 'ERRORLEVEL' будет' 0', независимо от ошибок в скрипте. – aphoria

+0

Исправить. Пакет не может заменить обработку ошибок внутри сценария PowerShell. Он может реагировать только на то, что возвращает скрипт. –

Смежные вопросы