-command的退出代码与脚本的退出代码不同

时间:2013-08-23 20:03:54

标签: powershell exit-code

我需要使用PowerShell -Command“& scriptname”运行脚本,如果我从PowerShell返回的退出代码与脚本本身返回的退出代码相同,我真的很喜欢它。不幸的是,如果脚本返回0,PowerShell返回0,如果脚本返回任何非零值,则PowerShell返回1,如下所示:

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>

使用[Environment] :: Exit(42)几乎可以工作:

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>

除了以交互方式运行脚本时,它将退出整个shell。有什么建议吗?

3 个答案:

答案 0 :(得分:31)

如果您将要发送到-Command的部分视为脚本,您将会发现它永远不会有效。运行foo.ps1脚本的脚本没有退出调用,因此它不会返回退出代码。

如果您确实返回退出代码,它将执行您想要的操作。也可以将其从"更改为',否则在将字符串'发送'到第二个PowerShell之前将解析$lastexitcode,如果您从PowerShell运行它。

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

PS:如果您只想运行脚本,请查看-File参数。但是如果你有return 1的终止错误,也知道它不会-Command。有关上一个主题的更多信息,请参阅here

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

答案 1 :(得分:4)

CAVEAT:如果您的PowerShell脚本返回超过65535的exitcodes,则会翻转:

$exitCode = 65536
Exit $exitCode

如果以下CMD调用上面的PS1脚本,您将获得%strong错误百分比 0

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

和一个65537的exitcode会给你一个%errorlevel%1,等等。

同时,如果一个CMD调用另一个并且子脚本返回的错误级别高于65535,那么它通过就好了。

Cmd /c exit 86666

CMD将按预期返回%errorlevel%86666。

CAVEAT对所有这一切:现在这种情况一无所获发生。

答案 2 :(得分:1)

您是如何以交互方式调用脚本的?

我试过这个似乎工作正常,但我从DOS提示符调用它,而不是在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>