我需要使用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。有什么建议吗?
答案 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>