[环境] ::需要退出(0),但是如何使用带有Invoke-Expression的脚本?

时间:2016-02-03 09:29:09

标签: powershell powershell-v2.0

似乎我在权力hell中有退出代码。

有很多主题关于为什么powershell在退出代码方面表现得很奇怪(对于语法错误等)。 退出代码和Parameter属性还存在一个很大的问题。例如 使用以下代码调用脚本

Param(
  [Parameter()]$a
)
exit 9999

在cmd.exe中返回退出代码 0 (例如echo %ERRORLEVEL%),无法正确处理返回代码。

最后一个解决方法是使用Environment :: Exit:

Param(
  [Parameter()]$a
)
[Environment]::Exit(9999)

现在问题是:我编写了一个包含大量Param定义的脚本,因此需要Environment::Exit才能运行。 该实用程序通过echo返回一个值,这是

的工作脚本
# dummy.ps1
Param(
  [Parameter()]$a
)

echo "foo 42"

[Environment]::Exit(10)

当然,我不需要退出此处,但真实世界的脚本要求在echo指示退出代码 10 {{1}后正确退出}和ps

通过cmd调用它返回42,一切都很好。

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

当我处于powershell提示符时,我想做类似的事情:

powershell -f dummy.ps1

但是环境::退出在Invoke-Expression之后关闭了我的提示,一切都消失了。 (即使我将此代码放在单独的$res = Invoke-Expression "& d:\dummy.ps1" echo $res 文件中)

是否存在整个事情按预期工作的情况? 再说一遍:我需要ps1ps的正确退出代码,因此cmdexit 10会失败。由于exit(10)的行为,没有其他退出代码比Environment :: Exit有效。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的事情 - 为了重新创建问题,请使用powershell.exe -version 2.0 -file blah.ps1执行

它是版本2.0 ...和参数。一旦你删除了[Parameter()],就会得到预期的退出代码。 参数(     #[参数(ParameterSetName = “研究所”)] [字符串] $研究所     [字符串] $研究所 ) 所以,这有效 - 换掉注释行,然后你总是得到一个0的退出代码......对于有人发帖,你应该永远不要使用EXIT?伙计,我们都有不同的要求..

我想我的解决方法是不使用参数,只是这样做 - 我必须让它在各种操作系统版本上保持一致,这意味着我有一个必须在2.0上工作的最低要求。