Powershell:在函数中使用$LASTEXITCODE

18

嗨,我注意到以下代码片段存在一些奇怪的行为

function test
{
    $LASTEXITCODE = $null
    ping asdfs
    Write-Host "Last exitcode: $LASTEXITCODE"
}

test
Write-Host "Last exitcode: $LASTEXITCODE"
这的输出结果是什么?
Ping request could not find host asdfs. Please check the name and try again.
Last exitcode: 
Last exitcode: 1

为什么在test()函数中$LASTEXITCODE没有被设置?

这是我目前遇到的一个问题的泛化表述,当我从一个函数中调用Win32 .exe时,$LASTEXITCODE没有像我期望的那样从函数中返回值。

4个回答

30

因为你不应该像那样设置自动变量。你正在创建一个本地变量并将其置空。删除$LASTEXITCODE = $null行,就可以得到预期的结果。或者你可以执行$global:LASTEXITCODE = $null


5

为了延伸已经写过的内容:

$LASTEXITCODE 变量是由 Powershell 在 global 范围内设置和使用。

这就是为什么,当你在终端中设置 $lastexitcode = 0,然后调用一些东西时,它能够完全正常工作。在终端中,全局范围就是局部范围就是脚本范围。

但是,一旦你在实际脚本或函数中,设置未经修饰的 $LASTEXITCODE 将创建一个同名的局部/脚本作用域变量,并“遮蔽”全局变量。

因此,规则可以概括如下:

  • 永远不要在终端之外设置 $LASTEXITCODE = ...
  • 总是使用 $global:LASTEXITCODE = ... 进行重置。
  • 建议通过 ... = $global:LASTEXITCODE 进行读取,以防止意外读取“被遮蔽”的变量版本
  • 目前没有立即需要重构的脚本和函数,只要通过$LASTEXITCODE 进行读取即可。

4
您正在函数test的范围内分配一个值给$LASTEXITCODE,而实际上是已经被设置了。 输出的最后一行将$LASTEXITCODE列为1,因为您离开了test函数的范围,并且在该范围内分配给$LASTEXITCODE的值不再有任何意义。 正如manojlds所指出的,如果您想要达到这个结果,您可以直接在全局设定变量。

3

我不确定直接设置 $LASTEXITCODE 是否好...最好还是让系统内部处理:

cmd /c "exit 0" #Reset $LASTEXITCODE between runs while debugging

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接