68

$?Powershell中的含义是什么?


编辑:TechNet以重言式回答,没有解释“成功”或“失败”的含义。

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

我假设 $? 会简单地测试 $LastExitCode 是否为 0,但我发现了一个反例$? 为假,但 $LastExitCode 为真。

4

4 回答 4

62

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这里,因为之前的命令不成功。

于 2012-05-17T10:40:01.760 回答
7

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

Get-Item -Path john -ErrorAction silentlycontinue;
if( -not $?)
{
    'could not find file.';
     exit
 }`
于 2012-08-08T22:48:46.730 回答
2

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

# run some command
# ...
if ((! $?) -and $ErrorAction -eq "Stop") { exit $LastExitCode }
于 2018-11-24T00:08:35.690 回答
1

我在 Windows Server 2019 中遇到过,$? 生成标准错误时可以设置为 false。在我的示例中,docker-compose 通过标准错误记录警告,因此尽管以 0 退出,$? 表示失败。

于 2019-11-11T04:05:55.783 回答