第一次使用Powershell Exception捕获帮助

时间:2017-11-28 15:12:30

标签: powershell error-handling exception-handling

我不是一个程序员,只是偶尔使用powershell来完成我的一些任务,因此,我的powershell脚本/命令中从未做过任何真正的错误处理。

我正在努力绕过我在下面的示例代码中捕获异常,因为它似乎表现得错误。这是代码:

$Computers = Get-ADComputer -SearchBase 
"OU=Desktops,OU=Computers,OU=Managed,DC=domain,DC=local" -Filter * | select Name
$Table= ""
$Computers | Foreach  {
    $Name = $_.Name
    try {
        $Table += Get-WmiObject -Class Win32_Product -ComputerName $Name | 
        Where-Object {$_.Name -eq "Product Name"} | select PSComputerName,Name,Version
    }
    catch {
        $Name + " unavailable"
    }
}

似乎发生的情况是,当计算机关闭或不可用时,Get-WmiObject命令失败,并在powershell窗口中显示Exception消息。我本来希望我的Catch语句看到这个异常,而是输出计算机的$ Name和文本"不可用"

当我说它向后发生时,在显示不可用计算机的异常消息后,对于那些成功的消息,它会显示$ Name +"不可用"

我是否在powershell中误解了错误处理背后的概念,我如何调整上面的代码来捕获错误的计算机并做些与它们不同的事情?

2 个答案:

答案 0 :(得分:3)

Get-WmiObject抛出所谓的 - 终止错误 - 为了让错误执行终止并执行catch块,你需要在调用时指定-ErrorAction Stop

try {
    $Table += Get-WmiObject -Class Win32_Product -ComputerName $Name -ErrorAction Stop |Where-Object {$_.Name -eq "Product Name"} | select PSComputerName,Name,Version
}
catch {
    $Name + " unavailable"
}

答案 1 :(得分:2)

您需要在-ErrorAction Stop来电中添加Get-WMIObject

示例:

try{
    Get-WmiObject -Class asdf -ErrorAction Stop
}
catch{
    Write-Host error!
}

返回

error!