2013-08-23 152 views
21

我需要使用PowerShell命令“& scriptname”运行脚本,如果退出PowerShell的退出代码与退出代码相同,我真的很喜欢它脚本本身返回的退出代码。不幸的是,如下图所示PowerShell会返回0,如果脚本返回0,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> 

使用[环境] ::出口(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。有什么建议么?

+1

我想你想你'-command'脚本 – ProfessionalAmateur

回答

26

如果你看看你正在发送的部分 - 命令作为一个脚本,你会看到它永远不会工作。运行'foo.ps1'脚本的脚本没有退出调用,所以不会返回退出代码。

如果你确实返回退出代码,它会做你想做的。此外,它的“改变”,否则$ lastexitcode将得到解决之前,‘发送’字符串到第二PowerShell的,如果你从PowerShell中运行它

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

PS:如果你还检查了文件参数只是想运行一个脚本,但也知道它没有,如果你有一个终止错误的-Command不会。瞧here你是如何交互调用脚本返回1,更多的是最后一个话题。

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

用'$出口到lastexitcode'退出谢谢您的帮助!这几乎解决了我的问题。这个解决方案在命令行上工作,这是问题最初如何提出的,所以我会接受答案。不幸的是,我实际上发射了从java程序使用的Runtime.exec一个PowerShell PROCESSS,不管我怎么引用它,我得到的退出代码零。我也尝试用反引号(')转义$ $ lastexitcode,这也不起作用。 – ediven

+0

谢谢。你有没有尝试使用 - 文件而不是像我的第二个例子中的命令? –

+0

使用-File在没有其他手术的情况下无法正常工作,因为我们使用相同的代码来启动非PowerShell进程。它看起来像引用正在被Java代码弄糟,该代码试图根据需要自动引用事情。我认为这应该工作,一旦我解决了。再次感谢! – ediven

1

我已经试过这个,它似乎工作OK,但我把它从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> 
+0

它的工作原理是因为你使用-File而不是-Command作为问题 –

4

注意事项:如果你的PowerShell脚本返回高校exitcodes超过65535,他们翻身:

$exitCode = 65536 
Exit $exitCode 

如果下面的CMD调用此PS1上面的脚本,您将得到

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

和65537的退出码会给你1%的ERRORLEVEL%的%ERRORLEVEL%等等。

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

Cmd /c exit 86666 

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

CAVEAT到所有这些:现在这是发生和没有明显的原因。