28

我需要使用 PowerShell -Command "& scriptname" 运行脚本,如果我从 PowerShell 返回的退出代码与脚本本身返回的退出代码相同,我会非常喜欢它。不幸的是,如果脚本返回 0,PowerShell 返回 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>

使用 [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。有什么建议么?

4

3 回答 3

31

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

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

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

-FilePS:如果您只想运行脚本,请查看参数。但也知道return 1如果你有一个终止错误,-Command它不会。有关最后一个主题的更多信息,请参见此处

PS C:\test> powershell -File './foo.ps1'
PS C:\test> echo $lastexitcode
42
于 2013-08-23T21:56:38.027 回答
4

警告:如果您的 PowerShell 脚本返回的退出代码高于 65535,它们会翻转:

$exitCode = 65536
Exit $exitCode

如果下面的 CMD 调用上面的这个 PS1 脚本,你会得到一个 %errorlevel% of 0

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

并且退出代码 65537 会给你一个 1 的 %errorlevel% 等。

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

Cmd /c exit 86666

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

警告所有这一切:现在这种情况时断时续地发生,没有明显的原因。

于 2015-08-07T15:54:45.207 回答
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>
于 2013-08-23T21:58:30.640 回答