什么是’’?’在 Powershell?

ABc0在 Powershell 的意义是什么?


编辑: 同义反复的 TechNet 回答,没有解释什么是“成功”或“失败”的意思。

$?
包含上次操作的执行状态。如果最后一次操作成功,则包含 TRUE; 如果失败,则包含 FALSE。

我猜?将简单地测试 $LastExitCode 是否为0,但是我在哪里找到了一个 反例 $?$LastExitCode 为 True。

52746 次浏览

如果最后一个命令成功,则返回 true,否则返回 false

然而,也有一些警告和不明显的行为(例如“成功”的确切含义)。我强烈建议阅读 这篇文章以获得更全面的治疗。

例如,考虑调用 Get-ChildItem。

PS> Get-ChildItem


PS> $?
True

$? 将返回 True作为调用 Get-ChildItem 成功。

但是,如果对不存在的目录调用 Get-ChildItem,它将返回一个错误。

PS> Get-ChildItem \Some\Directory\Which\Does\Not\Exist
Get-ChildItem : Cannot find path 'C:\Some\Directory\Which\Does\Not\Exist' because it does not exist.


PS> $?
False

$? 将在这里返回 False,因为前面的命令不成功。

如果最后一个命令导致错误,则 $?将包含 $false。如果没有,它将包含 $true。在 PowerShell v1时代,这是一种常见的错误处理方法。例如,在脚本中,如果您想检查文件是否存在,然后打印一条自定义消息(如果不存在) ,您可以这样做:

Get-Item -Path john -ErrorAction silentlycontinue;
if( -not $?)
{
'could not find file.';
exit
}`

还可以使用 $LastExitCode参数访问最后一个命令的退出代码。

# run some command
# ...
if ((! $?) -and $ErrorAction -eq "Stop") { exit $LastExitCode }

我在 WindowsServer2019中遇到的问题,$?当生成标准错误时,可以设置为 false。在我的示例 docker 中,通过 Standard Error 组合日志警告,因此尽管退出时为0,$?意味着失败。

重要! ! ! 请注意朱尔斯 · 克莱门茨的回答。 $? 可以返回 false 甚至 $LastExitCode 返回0。

即使请求 $? 也会导致其内容发生变化。

一些命令导致 $? 为 false。 写入 $? = > 将首次返回“ false” 写入 $? = > 将第二次返回“ true”