Powershell:函数中的$LASTEXITCODE

cclgggtu  于 2023-01-13  发布在  Shell
关注(0)|答案(4)|浏览(219)

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

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没有从函数中返回我期望的值

1tuwyuhd

1tuwyuhd1#

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

kmpatx3s

kmpatx3s2#

您在函数测试的作用域内将值赋给$LASTEXITCODE,它实际上是在该作用域内设置的。输出的最后一行将$LASTEXITCODE列为1,因为您离开了函数测试的作用域,并且在该作用域内赋给$LASTEXITCODE的值不再有任何意义。
正如manojlds已经指出的,如果你想获得这样的结果,你可以全局地设置变量。

xfb7svmp

xfb7svmp3#

我不确定是否喜欢直接设置$LASTEXITCODE......最好让系统内部来设置:

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

cwxwcias4#

扩展:扩展已经写过的东西:
$LASTEXITCODE变量存在于global作用域中,由powershell设置。
这就是为什么,当你 * 在终端中 *,在调用某个东西之前设置$lastexitcode = 0,工作的很好,在终端中全局作用域是本地作用域是脚本作用域。
但是,一旦您在实际脚本或函数中,设置 unqualified$LASTEXITCODE将创建一个同名的局部/脚本作用域变量,该变量将“遮蔽”全局作用域变量。
规则,如果你愿意,是:

  • 切勿将$LASTEXITCODE = ...设置在终端上的临时工作之外
  • 始终使用$global:LASTEXITCODE = ...进行重置。
  • 首选通过... = $global:LASTEXITCODE读取,以防止意外读取此变量的“阴影”版本
  • 不过,不需要立即重构通过$LASTEXITCODE * 读取 * 的脚本和函数。

相关问题