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中有这种模式,但我不知道。
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问题要求$(...)放弃笨拙的需求-如果您同意,请在那里发表您的声音。