看来我正在权力hell
退出代码。
关于为什么 powershell 的退出代码行为异常(语法错误等(有很多主题。此外,退出代码和Parameter
属性也存在一个大问题。例如使用以下代码调用脚本
Param(
[Parameter()]$a
)
exit 9999
返回 cmd 中的退出代码 0.exe(例如 echo %ERRORLEVEL%
(,使得无法正确处理返回代码。
最后一个解决方法是使用环境::退出:
Param(
[Parameter()]$a
)
[Environment]::Exit(9999)
现在的问题是:我编写了一个脚本,该脚本具有广泛的Param
定义,因此需要Environment::Exit
才能工作。此实用程序通过 echo 返回一个值,这是一个工作脚本
# dummy.ps1
Param(
[Parameter()]$a
)
echo "foo 42"
[Environment]::Exit(10)
当然,我在这里不需要退出,但现实世界的脚本要求它在echo
指示退出代码 10 的ps
和cmd
之后正确退出
通过 powershell -f dummy.ps1
调用它返回 42,一切都很好。
但问题是:我想在另一个脚本中重用此脚本,以便我可以正确使用回显值。
当我在powershell提示符下时,我想做这样的事情:
$res = Invoke-Expression "& d:dummy.ps1"
echo $res
但是环境::退出在调用表达式后关闭了我的提示,一切都消失了。(即使我把这段代码放在一个单独的ps1
文件中(
是否有整个事情按预期工作的场景?再次:我需要正确的退出代码来ps
和cmd
,以便exit 10
或exit(10)
在这里失败。由于[Parameter()]
的行为,除了环境::退出之外没有其他退出代码确实有效。
我遇到了同样的事情 - 为了重现问题,请使用 powershell 执行.exe -版本 2.0 - 文件 blah.ps1
这是2.0版... 和参数。 删除 [Parameter((] 后,您会按预期获得退出代码。帕拉姆( #[Parameter(ParameterSetName="inst"(][string]$inst [字符串]$inst)所以,这有效 - 换掉注释的行,然后你总是得到一个退出代码 0... 对于某人的发布,您永远不应该使用 EXIT? 伙计,我们都有不同的要求。
我想我的解决方法是不使用参数并以这种方式进行操作 - 我必须让它在各种操作系统版本上一致地工作,这意味着我有一个最低要求,它必须在 2.0 上运行。