Powershell $LASTEXITCODE命令后未定义

Powershell $LASTEXITCODE命令后未定义,powershell,powershell-2.0,Powershell,Powershell 2.0,我快疯了,有人能解释一下为什么$lastexitcode的值没有定义吗 看看我的简单尝试:如果启动命令dir,我会得到正确的输出,因此$LASTEXITCODE必须为0 不幸的是,如果我尝试: $LASTEXITCODE 我没有任何返回值。 如果我在“diiiir”之类的命令或类似的不存在的命令之前给出,情况也是一样。$LASTEXITCODE仅由可执行文件或批处理文件在返回时设置。PowerShell命令可以使用$?。有关更多信息,请参阅。特别是$LASTEXITCODE由“遗留”可执行文件

我快疯了,有人能解释一下为什么$lastexitcode的值没有定义吗

看看我的简单尝试:如果启动命令dir,我会得到正确的输出,因此$LASTEXITCODE必须为0

不幸的是,如果我尝试:

$LASTEXITCODE
我没有任何返回值。
如果我在“diiiir”之类的命令或类似的不存在的命令之前给出,情况也是一样。

$LASTEXITCODE仅由可执行文件或批处理文件在返回时设置。PowerShell命令可以使用$?。有关更多信息,请参阅。

特别是$LASTEXITCODE由“遗留”可执行文件设置。。。它相当于旧的DOS/Windows%ERRORLEVEL%变量。以下是在PowerShell中管理$LASTEXITCODE的最佳方法:

cmd /c "exit 0" #Reset $LASTEXITCODE between runs while debugging
cmd /c "SetLASTEXITCODE.cmd"
从PowerShell调用时,批处理(.bat)/命令(.cmd)文件将对其进行设置:

exit /b <exitcode>
然后,从PowerShell调用命令文件:

cmd /c "exit 0" #Reset $LASTEXITCODE between runs while debugging
cmd /c "SetLASTEXITCODE.cmd"
输出应为:

exit /b 2
现在测试$LASTEXITCODE:

$LASTEXITCODE
输出为:

2
注意:在所谓的“遗留”可执行文件(也包括旧的.com文件)上,如果开发人员/程序员没有从编写exe的任何编程语言(通常通过API调用)设置ERRORLEVEL,则不会设置ERRORLEVEL/LASTEXITCODE!早在80年代初,我就开始写这些东西了,那时就像你的“dir”示例一样,它没有在(.com)或exe文件中设置ERRORLEVEL和外部命令,这是一个早已被遗忘的细节

最后一个例子。。。修改命令文件以包含以下内容并重复上述测试。。。它在命令文件中设置ERRORLEVEL,并在退出时使用%ERRORLEVEL%设置$LASTEXITCODE

cmd /c "exit /b 2"
echo %ERRORLEVEL%
exit /b %ERRORLEVEL%

玩得开心…

dir
不设置
$lastexitcode
。试试别的不知道为什么,但实际的可执行文件会这样做(比如
ping.exe
)。可能是因为内部命令不“需要”错误级别。找不到cmdlet,例如,
diIIIR
,也不会设置$LASTEXITCODE。@bzlm
dir
Get ChildItem
的别名。请参见
Get Alias dir
。因为它是PowerShell cmdlet,所以不会设置
$LASTEXITCODE
。但是运行
cmd/c dir
将失败,因为随后您将在cmd中执行内部
dir命令,而不是PowerShell
Get ChildItem