如何从相同的执行脚本中检查pipe道的成功/失败?
Get-VM -Name Machine | Get-Snapshot | Where {$_.Created -lt (Get-Date).AddDays(-1)} | Remove-Snapshot -Confirm:$false
我不需要什么比相当于$? 。
同意try … catch方法,但if($?){}也可以很好地工作,但不会捕获通常会完全抛出脚本的exception。
无论哪种方式,PowerShell的优势之一也是其弱点之一。 我正在谈stream水线。 是的,你可以通过pipe道传递对象,但是当脚本在生产环境中运行,你需要优雅地失败,创build一个有意义的日志,返回一个有意义的返回代码,甚至还要运行一个恢复工作,一个刚刚遇到的第50个对象,当还有另外70个对象的时候,这个工作并没有多大用处。
在制作脚本中,我强烈build议您分阶段进行“pipe道工作”。 也就是说,使用pipe道的权力来收集你的工作队列(Get-VM | Where-Object,blah,blah),并将其推送到一个对象数组中。
然后使用一个Foreach对象来遍历工作队列中的对象。 在Foreach-Object中,当涉及到Remove-Snapshot之类的事情时,请使用try … catch,并询问返回的exception对象以提供返回代码/日志文件/警报/恢复序列等。
那么,Powershell有$ ?,所以我假设问题是它只在退出时填充?
在处理运行代码中的错误时,最好的做法是使用Try / Catch块 。 出现问题时,“Try”块中的代码会自动故障转移到“Catch”,甚至更好的是,针对不同的exception可以有不同的catch块,因此您可以即时处理不同的问题。 很酷。
正如已经指出的那样,安全的方法是使用Try / Catch块:
try { Get-VM -Name Machine | Get-Snapshot | Where {$_.Created -lt (Get-Date).AddDays(-1)} | Remove-Snapshot -Confirm:$false } catch { # Rainbows, unicorns and error handling here }
如果将输出分配给一个variables,并且想要自己testing输出,可以将try / catch块放在一个子expression式中,失败时默认为$null或$false ,如下所示:
$results = $( try{Get-Something "MaybeNonexisting"} catch{$false} ) if(-not($results)) { # more unicorns Write-Host ("Something awful happened: {0}" -f $Error[0]) }