Вопрос по cmd, powershell – Возврат кода ошибки из CMD в Powershell

6

Я работаю над сценарием установки Mssql и хочу получить результаты автоматической установки mssql. В моем скрипте PowerShell я запускаю эту команду:

$result = (start cmd "/c D:\SQL2008R2\SQL2008R2\setup.exe /CONFIGURATIONFILE=sqlconfig.ini && exit 0 || exit 1")

Который должен вернуть 0 в случае сбоя и 1 в случае пропуска. К сожалению, я не получаю никаких выходных данных. Есть идеи?

Ну, это действительно так работает.&& запускает левую сторону, и если она ложна (команда не выполнена), то она запускает правую часть&&, Группы приоритетов операторов(Left && Middle) || Right, Теперь, когда я думаю об этом, если|| является условным или работает только до истинного значения, то я должен был на самом деле использовать& вместо||. Caleb Jares
Это не как&& работает, и вы не можете выбратьexit 0 или жеexit 1 после запуска установки Вы должны проверитьERRORLEVELи это обычно делается в пакетном файле, который затем может завершиться с соответствующим кодом ошибки. Ken White

Ваш Ответ

3   ответа
8

Start-Process это более синтаксически краткий оператор вызова&.

& cmd.exe /c 'ping.exe doesnotexist && exit 0 || exit 1'

Код выхода будет содержаться во встроенной переменной$LASTEXITCODE так:

Write-Host $LASTEXITCODE

Он будет содержать код завершения запуска программы, поэтому вам не нужно запускать его с помощью CMD.exe, который вы можете просто сделать:

& ping.exe doesnotexist ; Write-Host $LASTEXITCODE

Применяется к вашей программе командной строки:

& cmd.exe /c 'D:\SQL2008R2\SQL2008R2\setup.exe /CONFIGURATIONFILE=sqlconfig.ini && exit 0 || exit 1'

Или просто:

& D:\SQL2008R2\SQL2008R2\setup.exe /CONFIGURATIONFILE=sqlconfig.ini

В обоих случаях$LASTEXITCODE должен быть 0 для успеха, ненулевой в противном случае (если внешняя программа была написана правильно).

Да, я видел, что ты мог бы сделать это также. Я хотел, чтобы моя была в новом окне. Так что мне нужноStart-Process Caleb Jares
0

Может быть, слишком поздно, но поможет ли это?

start /WAIT cmd.exe /C "YOUR-COMMAND-HERE" & if errorlevel 1 echo 'error occurred'

Вы также можете явно вернуть код ошибки, например так:

start /WAIT cmd.exe /C "YOUR-COMMAND-HERE & exit MY-ERROR-CODE" & if errorlevel 1 echo 'error occurred'
2

Вот как вы это делаете:start на самом деле псевдонимStart-Processтак что вы должны смотреть наit's документация, которая сильно отличается от cmd.exestart, Так что вы можете сделать это:

(Start-Process -FilePath "cmd.exe /c ..." -Wait -Passthru).ExitCode

Так просто!

Имейте в виду, что это просто запишет это в конвейер. Если вы хотите отобразить его в StdOut, вы должны использовать командлет Write-Host.
Это был ложный позитив. Оказывается, это работает, только если вы удалитеstart cmd "/c часть. Это сработало для меня, потому что я пробовал оба в моей сессии PowerShell. Командная строка по-прежнему не возвращает ничего ... Caleb Jares

Похожие вопросы