if($?){}是否有Powershell模式

Car*_*bon 0 syntax error-handling powershell

我发现自己将这些链接很多,例如:

do-cmd-one
if($?)
{
do-cmd-two
}
...
Run Code Online (Sandbox Code Playgroud)

然后最后:

if(!$?)
{
   exit 1
}
Run Code Online (Sandbox Code Playgroud)

我认为在Powershell中有这种模式,但我不知道。

mkl*_*nt0 6

PowerShell的7.0将推出类似于BASH的&&||运营商所谓的管道链运营商

它们不会被反向移植到Windows PowerShell,因为后者通常不会看到任何新功能。

目前,我尚不清楚GA 7.0版本是否仅会在一开始就将这些运算符作为可选实验功能公开。

您可以使用当前的v7 预览版(可从GitHub repo中获得)来测试行为。

简而言之,代替

do-cmd-one; if ($?) { do-cmd-two }
Run Code Online (Sandbox Code Playgroud)

您将能够写

do-cmd-one && do-cmd-two
Run Code Online (Sandbox Code Playgroud)

&&(AND)和||(OR)对每个命令的隐含成功状态进行隐式操作,如自动布尔变量所示$?

这对于外部程序可能会更加有用,这些外部程序的退出代码明确地表示$?$true(退出代码0)还是$false(任何非零退出代码)。

相比之下,对于PowerShell命令(cmdlet)$?仅反映命令是否整体失败(发生了语句终止错误)或是否报告了至少一个非终止错误。后者并不一定表示整体失败。
但是,有计划允许将PowerShell命令$?直接设置为有意的总体成功指示符。

另请注意,以下内容不适用于&&||

  • PowerShell的Test-*cmdlet的,因为它们通过信号测试结果输出一个布尔值,而不是设置$?; 例如,
    Test-Path $somePath || Write-Warning "File missing"将无法正常工作。

  • 出于同样的原因,布尔表达式;例如,
    $files.Count -gt 0 || write-warning 'No files found'将无法正常工作。

请参阅此答案以获取背景信息以及此GitHub问题中的讨论。


有一个语法警告:在撰写本文时,以下内容将无效

do-cmd-one || exit 1 # !! Currently does NOT work
Run Code Online (Sandbox Code Playgroud)

相反,你不得不包exit/ return/ throw中陈述$(...),所谓的子表达式运算符:

do-cmd-one || $(exit 1) # Note the need for $(...)
Run Code Online (Sandbox Code Playgroud)

这个GitHub问题要求$(...)放弃笨拙的需求-如果您同意,请在那里发表您的声音。