Moe*_*ald 2 powershell boolean exit-code
这个stackoverflow 答案解释了 Linux 真正的命令是什么。我的问题是,Powershell (v5/v6) 是否也提供真正的命令?
我已经用谷歌搜索过Get-help *true*
,但找不到任何有关它的信息。
谢谢
简而言之:
没有与true
和false
Unix 实用程序等效的 PowerShell。
由于 PowerShell 的条件和错误处理工作方式与 POSIX 类 shell(例如 )中的工作方式非常不同bash
,因此不需要它们。
Unix 实用程序的主要用途true
0
是在您故意想要忽略POSIX 类 shell中先前命令的失败(通过非零退出代码表示)的情况下重置退出代码,例如在条件语句中或使用 abort- on-unhandled-failures 选项生效。或其对应项
均不产生任何输出- 它们的唯一目的是设置退出代码。bash
set -e
true
false
PowerShell 本身不使用退出代码(尽管您可以使用 来设置它们以方便外部调用者exit <n>
),并且它的条件不会对它们起作用。
PowerShell 的自动$?
变量$?
在抽象上与类 POSIX shell类似,只是它报告Boolean,而类 POSIX shell 报告退出代码;包含在类似 POSIX$?
的0
shell 中类似于$?
包含$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中,例如bash
,条件语句对命令的退出代码进行操作,即(执行后)状态信息,而不是它们的输出。
相比之下,PowerShell条件对命令或表达式输出(即数据)进行操作,而不是对状态信息进行操作。
简而言之:
类 POSIX shell 中的条件作用于不可见的退出代码,并通过.
PowerShell 中的条件作用于成功输出并在此过程中使用它。
两个 shell 都会传递错误输出 (stderr)。
您可以使用自动$?
变量,其行为取决于当前的命令是 PowerShell 本机命令还是外部程序(例如 Unix 实用程序):
外部程序:如果程序的退出代码为0
,$?
则反映$true
,否则$false
这类似于 POSIX-like shell 中的内置$?
变量(例如 )bash
,只是$?
其中包含实际的退出代码;也就是说,$?
包含在类 POSIX shell 中与执行外部程序后包含在 PowerShell 中0
是一样的。$?
$true
$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 问题。
归档时间: |
|
查看次数: |
1489 次 |
最近记录: |