协助首次捕获 Powershell 异常
Assistance with first time Powershell Exception catching
我不是一个程序员,只是偶尔使用 powershell 来完成我的一些任务,因此,从来没有在我的 powershell 中做过任何真正的错误处理 scripts/commands。
我正在努力思考如何在下面的示例代码中捕获异常,因为它的行为似乎是错误的。这是代码:
$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 window 中显示异常消息。我本以为我的 Catch 语句会看到这个异常,而是输出计算机的 $Name 和文本“Unavailable”。
当我说它向后发生时,在显示不可用计算机的异常消息后,对于成功的计算机,它显示 $Name +“不可用”。
我是否误解了 powershell 中错误处理背后的概念,我如何调整上述代码以捕获出错的计算机并对它们做一些不同的事情?
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"
}
您需要将 -ErrorAction Stop
添加到您的 Get-WMIObject
通话中。
示例:
try{
Get-WmiObject -Class asdf -ErrorAction Stop
}
catch{
Write-Host error!
}
returns
error!
我不是一个程序员,只是偶尔使用 powershell 来完成我的一些任务,因此,从来没有在我的 powershell 中做过任何真正的错误处理 scripts/commands。
我正在努力思考如何在下面的示例代码中捕获异常,因为它的行为似乎是错误的。这是代码:
$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 window 中显示异常消息。我本以为我的 Catch 语句会看到这个异常,而是输出计算机的 $Name 和文本“Unavailable”。
当我说它向后发生时,在显示不可用计算机的异常消息后,对于成功的计算机,它显示 $Name +“不可用”。
我是否误解了 powershell 中错误处理背后的概念,我如何调整上述代码以捕获出错的计算机并对它们做一些不同的事情?
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"
}
您需要将 -ErrorAction Stop
添加到您的 Get-WMIObject
通话中。
示例:
try{
Get-WmiObject -Class asdf -ErrorAction Stop
}
catch{
Write-Host error!
}
returns
error!