Powershell:函数中的$ LASTEXITCODE

blu*_*utt 14 powershell powershell-ise powershell-2.0

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

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

test
Write-Host "Last exitcode: $LASTEXITCODE"
Run Code Online (Sandbox Code Playgroud)

这个输出是

Ping request could not find host asdfs. Please check the name and try again.
Last exitcode: 
Last exitcode: 1
Run Code Online (Sandbox Code Playgroud)

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

这是我现在遇到的一个问题的概括,当我从一个函数中调用Win32 .exe并且$ LASTEXITCODE没有返回我在函数中期望的值时

man*_*lds 25

因为你不应该像这样设置自动变量.您正在创建一个局部变量并使其无效.删除该$LASTEXITCODE = $null行,您将获得预期的结果.或者你可以做到$global:LASTEXITCODE = $null


Mar*_* Ba 5

扩展已经写过的内容:

$LASTEXITCODE变量位于范围内 - 由 powershell 设置global

这就是为什么当您在终端中时,$lastexitcode = 0在调用某些内容之前进行设置,效果完全正常。在终端中,全局范围是本地范围是脚本范围。

但是,一旦您处于实际脚本或函数中,设置unqualified $LASTEXITCODE将创建一个具有该名称的本地/脚本范围变量,该变量将“隐藏”全局变量。

所以,如果你愿意的话,规则是:

  • 切勿在终端上设置$LASTEXITCODE = ...外部临时工作
  • 始终使用$global:LASTEXITCODE = ...重置它。
  • 优先读取 via... = $global:LASTEXITCODE以防止意外读取此变量的“隐藏”版本
  • 不过,不需要立即重构通过读取的$LASTEXITCODE脚本和函数。