Powershell 相当于 Linux true 命令

Moe*_*ald 2 powershell boolean exit-code

这个stackoverflow 答案解释了 Linux 真正的命令是什么。我的问题是,Powershell (v5/v6) 是否也提供真正的命令?

我已经用谷歌搜索过Get-help *true*,但找不到任何有关它的信息。

谢谢

mkl*_*nt0 5

简而言之:

  • 没有与truefalseUnix 实用程序等效的 PowerShell。

  • 由于 PowerShell 的条件和错误处理工作方式与 POSIX 类 shell(例如 )中的工作方式非常不同bash,因此不需要它们。

Unix 实用程序的主要用途true0是在您故意想要忽略POSIX 类 shell中先前命令的失败(通过非零退出代码表示)的情况下重置退出代码,例如在条件语句中或使用 abort- on-unhandled-failures 选项生效。或其对应项 均不产生任何输出- 它们的唯一目的是设置退出代码bashset -e
truefalse

PowerShell 本身不使用退出代码(尽管您可以使用 来设置它们以方便外部调用者exit <n>),并且它的条件不会它们起作用

  • PowerShell 的自动$?变量$?在抽象上与类 POSIX shell类似,只是它报告Boolean,而类 POSIX shell 报告退出代码;包含在类似 POSIX$?0shell 中类似于$?包含$true在 PowerShell 中。

  • $? PowerShell 从不隐式地执行操作,但您可以在 PowerShell 条件中显式地使用它,以便以下两个(为简单起见而设计)命令是等效的:

    # POSIX-like shells:
    # Event though the `ls` command fails `|| true` makes the overall
    # command succeed.
    if ls /nosuchfile || true; then echo success; fi
    
    # PowerShell:
    # `$?` would reflect `$false` after the failed `ls` command.
    # `$null = $null` is a dummy command that resets `$?` to `$true`
    # `$?` is then *output* for the `if` to test.
    if ($(ls /nosuchfile; $null = $null; $?)) { 'success' }
    
    Run Code Online (Sandbox Code Playgroud)

虽然 PowerShell 具有自动变量$true$false变量(概念上为常量),但它们是用于与输出(数据)进行比较的布尔,而不是设置不可见状态信息(退出代码)的命令

请继续阅读以了解背景信息。


类 POSIX shell 中的条件与 PowerShell 中的条件

类似 POSIX 的 shell中,例如bash,条件语句对命令的退出代码进行操作,即(执行后)状态信息,而不是它们的输出

相比之下,PowerShell条件对命令或表达式输出(即数据)进行操作,而不是对状态信息进行操作。

简而言之:

  • 类 POSIX shell 中的条件作用于不可见的退出代码,并通过.

  • PowerShell 中的条件作用于成功输出并在此过程中使用它。

两个 shell 都会传递错误输出 (stderr)。


如果您希望 PowerShell 条件对命令的(执行后)状态起作用(成功与失败)起作用:

您可以使用自动$?变量,其行为取决于当前的命令是 PowerShell 本机命令还是外部程序(例如 Unix 实用程序):

  • 外部程序:如果程序的退出代码为0$?则反映$true,否则$false

    • 这类似于 POSIX-like shell 中的内置$?变量(例如 )bash,只是$?其中包含实际的退出代码;也就是说,$?包含在类 POSIX shell 中与执行外部程序后包含在 PowerShell 中0是一样的。$?$true

      • 要获取 PowerShell 中的实际退出代码,请使用自动$LASTEXITCODE变量,它反映了最近执行的外部程序的退出代码(PowerShell 本机命令通常不设置退出代码,尽管您可以exit <n>在脚本中使用,主要用于报告退出代码给外部呼叫者)。
  • PowerShell 原生命令(cmdlet、函数、脚本):$?如果$true命令没有从根本上失败并且没有写入 PowerShell 的错误流(例如使用Write-Error;请注意,默认情况下外部程序的stderr输出不会写入 PowerShell 的错误流) 。

    • 请注意,$?因此不一定会告诉您给定命令是否认为其整体执行成功。$?仅仅$false告诉您报告了一些错误。
    • 但是,您可以将命令调用包装在try { ... } catch { ... }语句中,这有助于您区分非终止错误和终止错误(默认情况下只有后者触发catch块);

在 PowerShell 中使用$?并不常见,因为故障通常使用
-ErrorAction公共参数/首$ErrorActionPreference选项变量和/或try { ... } catch { ... }语句来处理故障。

也就是说,这些方法不能用于外部程序,因为外部程序必须进行测试才能$?$LASTEXITCODE检测故障。
此 GitHub 讨论此 RFC 草案呼吁将外部程序与 PowerShell 的错误处理更好地集成。

有关 PowerShell 错误处理的全面概述,请参阅此 GitHub 问题