Powershell 相当于 Linux true 命令

Powershell equivalent of Linux true command

Whosebug answer 解释了 Linux true 命令是什么。我的问题是,Powershell (v5/v6) 是否也提供了一个真正的命令?

我已经用谷歌搜索,使用了 Get-help *true*,但找不到任何相关信息。

感谢

您要查找的是 the about_Automatic_Variables topic,其中描述了变量 $true$false

我写这个作为答案是因为我想指出 "gotcha" 我 运行 处理这些值:01 等于$false$true

$false -eq 0 # => True
$false -eq $null # => False - not false-y?

$true -eq 1 # => True
$true -eq 2 # => True - appears to be truth-y

与此同时,字符串 'false' 不是。

$false -eq 'False' # => False

此外,由于某些原因,$false 等于一个空字符串:

$false -eq '' # => True
$false -eq [string]::Empty # => True

而字符串 'true' 等于 $true(实际上,任何非零数字和任何非空字符串都是):

$true -eq 'True' # => True

在探索编写此答案的过程中,我意识到很多 $true 比较的计算结果为 True,因此可以安全地假设与布尔常量的比较是 truth-y/false-y。

这是与 $false 进行比较的值(进行以下比较 return $true):

$false -eq ''  # Empty string
$false -eq 0   # Zero
$false -eq @() # Empty array

我发现唯一未能通过两者测试的比较是 $null(所以不是 100% false-y):

$false -eq $null # => False
$true -eq $null  # => False

在某些其他语言中计算结果为 $false 的最后一个示例边缘案例是一个空的 [hashtable](或字典):

$true -eq @{} # => True

总结一下评论中@Joey的内容:

╦═════════════════════╦═════════════════════════╗
║ Falsy               ║ Truthy                  ║
╠═════════════════════╬═════════════════════════╣
║ 0                   ║ Non-0                   ║
║ @()                 ║ @(1)                    ║
║ @(0)                ║ @(0, 1)                 ║
║ [string]::Empty     ║ Non-empty string        ║
║ $false              ║ $true                   ║
║ 0-backed enum value ║ Any non-0 enum value    ║
║ $null               ║ Any non-$null reference ║
╚═════════════════════╩═════════════════════════╝

简而言之:

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

  • 因为 PowerShell 的条件语句和错误处理与 POSIX 中的 shell 非常不同,例如 bash,因此不需要它们。

Unix 实用程序 true 的主要用途是在您故意忽略先前命令失败的情况下将退出代码重置为 0 (通过 非零 退出代码发出信号)在 POSIX-like shell 中,例如 bash,例如在条件语句中或使用 abort-on-unhandled-failures 选项 set -e 生效。
true 及其对应物 false 都不会产生任何 输出 - 它们的唯一目的是设置一个 退出代码

PowerShell 本身不使用退出代码(尽管您可以使用 exit <n> 为外部调用者设置它们),它的条件 作用于它们

  • PowerShell 的 automatic $? 变量 在抽象上类似于 $? 中的 POSIX-like shells,除了它报告了一个 Boolean,而 POSIX-like shells 报告了 exit code;即 $? 在 POSIX 中包含 0 类似于 shell 类似于 $? 在 PowerShell 中包含 $true

  • 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' }
    

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

继续阅读以获取背景信息。


POSIX-like shells 与 PowerShell

中的条件

POSIX-like shellsbash,条件语句作用于命令的退出代码,即(post-执行)状态信息,而不是它们的输出.

相比之下,PowerShell 条件语句对命令或表达式 output 进行操作,即 data,不是状态信息。

简而言之:

  • 条件 POSIX-like shells 作用于 不可见的退出代码 通过成功输出( stdout 输出)通过.

  • PowerShell 中的条件作用于成功输出,并在过程中消耗它

两个 shells 通过 error 输出 (stderr)。


如果您希望 PowerShell 有条件地作用于命令的(post-执行)状态(成功与失败):

您可以使用 automatic $? 变量,其行为取决于手头的命令是 PowerShell 本地命令还是外部程序,例如 Unix效用:

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

    • 这类似于 POSIX 中的内置 $? 变量,类似于 shell,例如 bash,除了 $? 包含实际的 退出代码 ;也就是说,$? 在类似 POSIX 的 shell 中包含 0 与执行外部命令后在 PowerShell 中包含 $true$? 相同程序。

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

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

在 PowerShell$? 的使用并不常见,因为通常使用
-ErrorAction 公共参数 / $ErrorActionPreference 偏好变量 and/or try { ... } catch { ... } 语句。

也就是说,这些方法不能用于外部程序,其中测试$?$LASTEXITCODE 必须 来检测故障。
This GitHub discussion and this RFC draft 呼吁更好地集成外部程序与 PowerShell 的错误处理。

有关 PowerShell 错误处理的全面概述,请参阅 this GitHub issue