[环境]::需要退出(0),但是我如何使用带有调用表达式的脚本



看来我正在权力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指示退出代码 10pscmd之后正确退出

通过 powershell -f dummy.ps1 调用它返回 42,一切都很好。

但问题是:我想在另一个脚本中重用此脚本,以便我可以正确使用回显值。

当我在powershell提示符下时,我想做这样的事情:

$res = Invoke-Expression "& d:dummy.ps1"
echo $res

但是环境::退出在调用表达式后关闭了我的提示,一切都消失了。(即使我把这段代码放在一个单独的ps1文件中(

是否有整个事情按预期工作的场景?再次:我需要正确的退出代码来pscmd,以便exit 10exit(10)在这里失败。由于[Parameter()]的行为,除了环境::退出之外没有其他退出代码确实有效。

我遇到了同样的事情 - 为了重现问题,请使用 powershell 执行.exe -版本 2.0 - 文件 blah.ps1

这是2.0版... 和参数。 删除 [Parameter((] 后,您会按预期获得退出代码。帕拉姆( #[Parameter(ParameterSetName="inst"(][string]$inst [字符串]$inst)所以,这有效 - 换掉注释的行,然后你总是得到一个退出代码 0... 对于某人的发布,您永远不应该使用 EXIT? 伙计,我们都有不同的要求。

我想我的解决方法是不使用参数并以这种方式进行操作 - 我必须让它在各种操作系统版本上一致地工作,这意味着我有一个最低要求,它必须在 2.0 上运行。

最新更新