我正在编写一些PowerShell脚本来进行一些构建自动化。我发现here echo $?会返回true或false,具体取决于之前的语句。我刚发现echo是 Write-Output 的别名。 写主机$?也有效。但我还不清楚 $?的工作原理。有人可以说一些关于这个的话。正在搜索echo $?在网上并没有给我太多。
答案 0 :(得分:5)
补充Martin Brandl's helpful answer以获取更详细的信息:
<强> TL;博士强>
自动变量 $?
(请参阅Get-Help about_Automatic Variables
)包含布尔,它反映是否任何非最新语句 中终止错误。
$?
,因此您必须在感兴趣的语句后立即检查,或保存以供日后检查。自动变量 $LASTEXITCODE
补充,记录最近执行的 特定退出代码 外部命令行实用程序 (例如findstr
)。
$LASTEXITCODE
补充$?
,$?
仅反映抽象外部实用程序的成功或失败 - 退出代码0
映射到{ {1}},$True
的任何非零退出代码 - 而$False
包含实际的退出代码。$LASTEXITCODE
仅针对外部命令行实用程序设置,因此其值通常保持有效的时间长于$LASTEXITCODE
,这是在每个语句之后设置的。围绕$?
的设置方式有很多细微之处,其值恰好表示:
$?
仅反映非终止错误的出现,因为默认情况下(更罕见的)终止错误终止当前命令行/脚本的执行,为了处理它们,您需要使用$?
(首选)或try / catch
(请参阅Get-Help about_Try_Catch_Finally
和Get-Help about_Trap
)。
trap
或常见cmdlet参数$ErrorActionPreference
(别名-ErrorAction
) - 请参阅Get-Help about_Preference_Variables
和Get-Help about_CommonParameters
。除非明确忽略(使用公共-EA
cmdlet参数),否则会自动收集所有非终止错误(以及捕获的终止错误){{ 1}}集合,按时间倒序排列;也就是说,元素-ErrorAction Ignore
包含最新的错误。
对于传递多个输入对象的命令,包含$Error
的 $Error[0]
仅告诉您处理至少一个< / em>输入对象失败。换句话说:输入对象的任何子集可能发生错误,包括所有。
$?
集合。 使用 非远程执行 cmdlet 将目标命令传递到其中 - 例如$False
,{{1} }和$Error
以及Invoke-Expression
没有 Start-Process
参数(不涉及远程处理 - 见下文) - Start-Job
仅反映是否可以在原则中调用目标命令,无论该命令是否报告错误。
Invoke-Command
将-ComputerName
设置为$?
(!),因为Invoke-Expression '1 / 0'
能够解析并调用表达式,即使表达本身失败了。$?
集合会告诉您目标命令报告的错误和错误。使用 远程处理(总是间接执行)cmdlet ,特别是$True
带有Invoke-Expression
参数(通常情况下) ,还使用隐式远程处理cmdlet,$Error
反映目标命令是否报告了任何错误。
一个简单示例(必须从提升控制台运行,并假设本地计算机已设置为远程处理):
Invoke-Command
,因为涉及远程处理,确实将-ComputerName
设置为$?
以反映目标命令Invoke-Command -ComputerName . { 1 / 0 }
的失败。
请注意,即使本地计算机($?
)是目标计算机,使用$False
也总是使用远程处理。
功能
请注意,根据设计,远程处理报告通常终止错误,这些错误作为非终止远程发生,可能是因为一个目标上的正常终止错误机器不会中止所有其他的处理。
DO反映1 / 0
中的错误的命令示例:
.
不反映-ComputerName
中的错误的命令示例:
$?
答案 1 :(得分:4)
您可以找到完整的标点符号表here。答案(取自图表):
上一次操作的执行状态($ true或$ false);对比 使用$ LastExitCode报告最后一个的退出代码 基于Windows的程序已执行。