我想用 try {} / Catch {} “抓取”异常的内容,并使用IF在其中搜索内容。有人可以告诉我如何使用 $ PSItem.Exception 吗?谢谢!
try {
get-process ...
}
catch {
if (PSItem.Exception ....) {
Write-Error -Message "just move on !" -ErrorAction continue
}
else {
throw PSItem.Exception
}
}
答案 0 :(得分:1)
从try / catch块抛出的项(对于powershell中的任何异常都是如此)是ErrorRecord
类型的(您可以在msdn上看到其成员)。在此记录内,实际异常位于$PSItem.Exception
(或$_
而非$PSItem
)下;该成员在Message
上的Exception
成员下还有一个异常消息字符串。如果您使用ErrorRecord#ToString
方法,则无需深入研究成员即可直接获得此方法:
"$PSItem"
然后,您可以根据自己的喜好查看错误消息:
if ("$PSItem" -like '*Access denied*') {
作为一个旁注,不要重新引发异常,只需引发原始错误记录,如下所示:
else {
throw
}
答案 1 :(得分:0)
基于TheIncorrigible1的回复,我找到了原因:
$computerlist = "$env:computername", 'fake-name' foreach ($c in $computerlist) {
try {
$process = get-process -Name 'bogus' -ComputerName $c
if ($process -ne $null){
write-host "found on computer: $c"
$process = $null
}
}
catch{
if ( $_.Exception.Message -like '*Cannot find a process with the name*') {
Write-Error "process not found on $c " -ErrorAction Continue
}
else {throw}
} }
找不到具有名称的进程也不例外(FullyQualifiedErrorId:NoProcessFoundForGivenName),而无法连接到远程计算机,它是(FullyQualifiedErrorId:System.InvalidOperationException) 。