Powershell等同于Linux true命令

时间:2019-03-26 12:58:44

标签: powershell boolean exit-code

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

我已经在Google周围搜索,使用过Get-help *true*,但找不到任何相关内容。

Thx

2 个答案:

答案 0 :(得分:4)

简而言之:

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

  • 由于PowerShell的条件和错误处理与bash之类的POSIX类似外壳程序有很大不同,因此不需要它们。

Unix实用程序true的主要用途是在您故意忽略前一个命令的失败(通过< em> nonzero 退出代码),例如 POSIX之类的外壳程序,例如0 ,例如在条件语句中或带有未处理失败中止选项set -e实际上。
bash或其对应的true都不产生任何输出-它们的唯一目的是设置退出代码

PowerShell本身不使用退出代码(尽管您可以使用false设置退出代码以使外部呼叫者受益),并且其条件不会< / em>对他们采取行动

  • PowerShell的自动exit <n>变量在摘要上类似于POSIX类shell中的$?,但它报告的是 Boolean >,而类似POSIX的shell报告退出代码;类似于POSIX的外壳中包含$?的{​​{1}}类似于PowerShell中包含$?的{​​{1}}。

  • PowerShell永远不会对0 隐式地起作用,但是您可以在PowerShell条件条件中显式地使用它,因此以下两个-为了简化而设计-命令等效:

    $?

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

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


类似POSIX的外壳中的条件与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' } 这样的类似 POSIX的外壳中,条件操作在命令的退出代码上运行,即(执行后)< em>状态信息 ,而不是其输出

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

简而言之:

  • 类似POSIX的外壳中的条件对不可见的退出代码起作用,并通过通过成功传递输出(stdout输出)。

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

两个shell均通过 error 输出(stderr)。


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

您可以使用自动$true变量,该变量的行为取决于手边的命令是PowerShell本地命令还是外部程序(例如Unix实用程序):

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

    • 这类似于POSIX类外壳程序(例如$?)中的内置$true变量,不同之处在于$false包含实际的退出代码< / em>;也就是说,执行外部程序后,在类似POSIX的外壳中包含$?的{​​{1}}与在PowerShell中包含bash的{​​{1}}相同。

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

    • 请注意,$LASTEXITCODE因此不一定告诉您给定命令是否认为其整体执行成功; exit <n>$?仅告诉您已报告一些错误。
    • 但是,您可以$true语句中包装命令调用,这可以帮助您非终止终止< / em>错误(默认情况下,只有后者会触发Write-Error块);

在PowerShell中使用$?并不常见,因为故障通常是通过
$?通用参数/ $false首选项变量和/或try { ... } catch { ... }语句。

也就是说,这些方法不能用于 外部程序 ,其中测试catch$?必须 来检测失败。
This GitHub discussionthis RFC draft要求将外部程序与PowerShell的错误处理更好地集成。

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

答案 1 :(得分:1)

您正在寻找的是the about_Automatic_Variables topic,其中描述了变量$true$false

我将此作为答案写出来,因为我想指出一个“陷阱”,我遇到了以下这些值:01等于$false和{{ 1}}。

$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的评估,因此可以安全地假设与bool常数的比较是true-y / false-y。 / p>

以下是与True比较的值(这使得以下比较返回$false):

$true

我发现对两个测试均未通过测试的唯一比较是$false -eq '' # Empty string $false -eq 0 # Zero $false -eq @() # Empty array (并非100%否是):

$null

在某些其他语言中,求得$false -eq $null # => False $true -eq $null # => False 的边际案例的最后一个例子是空的$false(或字典):

[hashtable]

总结@Joey在评论中的内容:

$true -eq @{} # => True