2013-08-23 6 views
21

Ich muss ein Skript mit PowerShell-Befehl "& Skriptname" ausführen, und ich würde es wirklich mögen, wenn der Exitcode, den ich von PowerShell erhalten habe, derselbe ist Der Exit-Code, den das Skript selbst zurückgegeben hat. Leider gibt Powershell 0, wenn das Skript 0 zurückgibt, und 1, wenn das Skript jeden Wert ungleich Null zurückgibt, wie unten dargestellt:- Der Beendigungscode des Befehls ist nicht identisch mit dem Exitcode des Skripts

PS C:\test> cat foo.ps1 
exit 42 
PS C:\test> ./foo.ps1 
PS C:\test> echo $lastexitcode 
42 
PS C:\test> powershell -Command "exit 42" 
PS C:\test> echo $lastexitcode 
42 
PS C:\test> powershell -Command "& ./foo.ps1" 
PS C:\test> echo $lastexitcode 
1 
PS C:\test> 

mit [Environment] :: Exit (42) fast funktioniert:

PS C:\test> cat .\baz.ps1 
[Environment]::Exit(42) 
PS C:\test> powershell -Command "& ./baz.ps1" 
PS C:\test> echo $lastexitcode 
42 
PS C:\test> 

Außer wenn das Skript interaktiv ausgeführt wird, wird die gesamte Shell beendet. Irgendwelche Vorschläge?

+1

Ich glaube, Sie wollen mit 'exit $ lastexitcode' in Ihrem' -Command' Skript beenden – ProfessionalAmateur

Antwort

26

Wenn Sie sich den Teil ansehen, den Sie als Skript an -Command senden, werden Sie sehen, dass es niemals funktionieren würde. Das Skript, das das Skript "foo.ps1" ausführt, hat keinen Aufruf zum Beenden, sodass es keinen Beendigungscode zurückgibt.

Wenn Sie einen Exit-Code zurückgeben, wird es tun, was Sie wollen. ändern sie auch von "zu‘, sonst wird $ lastexitcode gelöst werden, bevor Sie ‚Senden‘ die Zeichenfolge an den zweiten Powershell, wenn Sie es von Powershell ausführen

PS C:\test> powershell -Command './foo.ps1; exit $LASTEXITCODE' 
PS C:\test> echo $lastexitcode 
42 

. PS: Auch die -File Parameter überprüfen, ob Sie sieht nur wollen, ein Skript auszuführen. Aber auch wissen, dass es nicht 1 zurück, wenn Sie einen Fehler mit Abbruch als -Command haben. here für mehr auf diesem letzten Thema.

PS C:\test> powershell -File './foo.ps1' 
PS C:\test> echo $lastexitcode 
42 
+0

Vielen Dank für Ihre Hilfe! Das löst fast mein Problem. Diese Lösung funktioniert in der Befehlszeile, so wie das Problem ursprünglich gestellt wurde, also akzeptiere ich die Antwort. Leider feuere ich tatsächlich einen Powershell-Prozess von einem Java-Prozess mit Runtime.exec ab, und egal, wie ich es zitiere, ich bekomme einen Exit-Code von Null. Ich habe auch versucht, den $ on $ lastexitcode mit einem Backtick (') zu umgehen, und das funktioniert auch nicht. – ediven

+0

Danke. Haben Sie versucht, in meinem zweiten Beispiel "Datei" anstelle von "Befehl" zu verwenden? –

+0

Die Verwendung von -File funktioniert nicht ohne eine andere Operation, da wir denselben Code verwenden, um Prozesse ohne PowerShell zu starten. Es sieht so aus, als würde das Quoting durch den Java-Code gestört, der versucht, Dinge automatisch nach Bedarf zu zitieren. Ich denke, es sollte funktionieren, sobald ich das durchschaue. Danke noch einmal! – ediven

1

wie werden Sie Ihr Skript interaktiv aufrufen?

Ich habe das versucht und es scheint zu funktionieren OK, aber ich nenne es von DOS-Eingabeaufforderung nicht innerhalb Powershell

C:\Temp>type foo.ps1 
exit 42 


C:\Temp>powershell -noprofile -nologo -noninteractive -executionpolicy Bypass -file .\foo.ps1 

C:\Temp>echo %errorlevel% 
42 

c:\Temp> 
+0

Es funktioniert, weil Sie -File anstelle von -Command wie in der Frage verwenden –

4

CAVEAT: Wenn Ihr Powershell-Skript exitcodes HÖHER ALS 65535 zurückgibt, sie rollen:

$exitCode = 65536 
Exit $exitCode 

Wenn das folgende CMD diese PS1 ruft Skript oben, Sie wird ein% Errorlevel% der bekommt 0

Powershell.exe "& 'MyPowershellScript.ps1' "; exit $LASTEXITCODE 
SET ERR=%ERRORLEVEL% 

und ein Exit-Wert von 65537 würden Sie einen% Errorlevel% von 1, etc.

In der Zwischenzeit, wenn ein CMD einen anderen aufruft und das Kind-Skript einen Fehlerlevel höher als 65535 zurückgibt, passiert es einfach gut.

Der CMD gibt einen% errorlevel% von 86666 erwartungsgemäß zurück.

CAVEAT zu all dem: Jetzt geschieht dies ohne ersichtlichen Grund ein und aus.

Verwandte Themen