【问题标题】:What is `$?` in Powershell?Powershell中的“$?”是什么?
【发布时间】:2012-05-24 22:26:34
【问题描述】:

$?在Powershell中是什么意思?


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

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

我假设 $?将简单地测试 $LastExitCode 是否为 0,但我发现 counter example where $?为假,但 $LastExitCode 为真。

【问题讨论】:

  • 在 Powershell 中,$? 是“自动变量”的一个示例。它帮助我了解了命名法。

标签: powershell


【解决方案1】:

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

但是,有一些注意事项和不明显的行为(例如,“成功”的确切含义)。我强烈建议阅读this article 以获得更全面的治疗。

例如,考虑调用 Get-ChildItem。

PS> Get-ChildItem 

PS> $? 
    True

$?将在调用 Get-ChildItem 成功时返回 True

但是,如果您在不存在的目录上调用 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,因为之前的命令没有成功。

【讨论】:

  • @MattHickford 命令是您使用 Powershell 执行的操作。例如,它可以是 cmdlet 或可执行文件。请参阅我添加的示例。
  • “成功”是什么意思?你认为这意味着“当且仅当 $LastExitCode 为 0”?
  • 我找到了一个反例 $?为 False 但 $LastExitCode 为 0。请参阅 stackoverflow.com/questions/10666101/…
  • 答案中的文章链接已失效。
  • @RobbVandaveer 谢谢 - 我现在已经链接到 archive.org。
【解决方案2】:

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

【讨论】:

  • 我很确定你刚刚把我从脑部血管爆炸中救了出来。我正在执行 Selenium 测试的 Jenkins 构建中运行 powershell 脚本。 Chrome 浏览器和网络驱动程序升级刚刚开始记录错误,但测试通过了。 $? 变量为 $False$LastExitCode 为零。这个构建已经失败了一段时间,这个答案终于确定了失败。基本上不要相信$?。请改用$LastExitCode
【解决方案3】:

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

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

【讨论】:

  • 你是说 $ErrorActionPreference 吗?
  • $?如果最后一个命令成功,则返回 true,否则返回 false。详细信息在这里:stackoverflow.com/a/10634171/1056566
  • 我知道。那不是我问的:)
【解决方案4】:

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

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

【讨论】:

  • 人们现在做什么?
  • @mikemaccana,在同一条船上......我认为 try/catch 语句。
  • try/catch 在 PS 中可用,但只有在出现终止错误时才会“捕获”异常。通常,cmdlet 不会终止执行,但会继续执行。在这些情况下,$?你是另一种选择吗?
猜你喜欢
  • 2010-10-05
  • 2010-11-09
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2016-07-25
  • 2011-07-18
相关资源
最近更新 更多