2012-06-12 11 views
6

Pracuję nad skryptem instalacyjnym Mssql i chcę uzyskać wyniki cichej instalacji programu mssql. W moim skrypcie PowerShell uruchamiam to polecenie:Zwracanie kodu błędu z CMD do Powershell

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

Który powinien zwrócić 0 w przypadku niepowodzenia i 1 w przypadku przejścia. Niestety, nie otrzymuję żadnych danych wyjściowych. Jakieś pomysły?

+0

To nie jest to, jak '' && prace i nie można wybrać '' exit 0' lub wyjście 1 'po uruchomienie konfiguracji. Musisz przetestować 'ERRORLEVEL', który zwykle jest wykonywany w pliku wsadowym, który może następnie wyjść z odpowiednim kodem błędu. –

+0

Tak naprawdę to działa. '&&' działa po lewej stronie i jeśli jest to fałsz (polecenie nie powiodło się), to uruchamia prawą stronę '&&'. Grupy priorytetów operatorów "(lewy i średni) || Prawo ". Teraz, gdy o tym myślę, jeśli '||' jest warunkowe - lub działa tylko do prawdziwej wartości, to powinienem użyć '&' zamiast '||'. –

Odpowiedz

2

ten sposób można to zrobić: start jest właściwie aliasem Start-Process, więc trzeba spojrzeć na to dokumentacja, która jest o wiele inny niż cmd.exe na start. Możesz to zrobić:

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

Tak łatwo!

+0

Należy pamiętać, że po prostu zapisze to do potoku. Aby wywołać echo do StdOut, użyj polecenia cmdlet Write-Host. –

+0

To był fałszywy alarm. Jak się okazuje, działa to tylko po usunięciu części "start cmd"/c. Działało to dla mnie, ponieważ próbowałem obu w mojej sesji PowerShell.Gwizuk polecenia nadal nie zwraca niczego .. –

8

Alternatywą dla Start-Process jest bardziej składniowo zwięzły operator połączeń &.

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

Kod wyjścia będą zawarte w zmiennej wbudowanej $LASTEXITCODE tak:

Write-Host $LASTEXITCODE 

ten będzie zawierać kod zakończenia przebiegu programu, dzięki czemu nie są konieczne, aby uruchomić go z cmd.exe można po prostu zrobić:

& ping.exe doesnotexist ; Write-Host $LASTEXITCODE 

Stosowany do programu wiersza poleceń:

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

Lub po prostu:

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

W obu przypadkach $LASTEXITCODE powinno być 0 na sukces, inaczej niż zero (jeżeli zewnętrzny program został napisany poprawnie).

+0

Tak, ja zobaczyłem, że możesz to zrobić, ale chciałem, aby moje było w nowym oknie, więc potrzebowałem "Start-Process" –

0

Zbyt późno może, ale czy to pomaga?

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

można również wyraźnie zwróci kod błędu tak:

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