如何读取引发的错误内容并在IF语句中使用它

时间:2019-04-11 10:27:57

标签: powershell

我想用 try {} / Catch {} “抓取”异常的内容,并使用IF在其中搜索内容。有人可以告诉我如何使用 $ PSItem.Exception 吗?谢谢!

try {
  get-process ...
}
catch {
    if (PSItem.Exception ....) { 
        Write-Error -Message "just move on !" -ErrorAction continue
    }
    else {
        throw PSItem.Exception
    }
}

2 个答案:

答案 0 :(得分:1)

从try / catch块抛出的项(对于中的任何异常都是如此)是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) 。