如何“捕获”无法使用 try...catch 执行的失败命令?

如何“捕获”无法使用 try...catch 执行的失败命令?

我正在运行以下脚本,但因邮箱不存在而失败

Set-MailboxDatabase rdb16 -AllowFileRestore:$true
Mount-Database rdb16
$stats = Get-MailboxStatistics -Database rdb16 
ForEach ($item in $stats)   {

try
{
get-mailbox -Identity $item.DisplayName | Set-Mailbox -Database rdb16 -Force
}
catch{
write-host "Create Mailbox:" 
}
}

这是失败

The operation couldn't be performed because object 'schmoe, joe' couldn't be found on 'NYCEXRESTOREDC0.sss.com'.
    + CategoryInfo          : NotSpecified: (:) [Get-Mailbox], ManagementObjectNotFoundException
    + FullyQualifiedErrorId : CEA5387A,Microsoft.Exchange.Management.RecipientTasks.GetMailbox

我如何正确检测上面显示的错误,因为它实际上并没有提供我在 C# 世界中期望的“异常”样式的失败

答案1

您之所以看到这种行为,是因为 try/catch 块仅适用于终止错误(MSDN Powershell 错误类型参考

你可以通过改变$ErrorActionPreference多变的。

如果您调整脚本使其位于$ErrorActionPreference = "Stop"顶部,那么所有错误都将被视为终止错误,并且 try/catch 块将起作用。

如果您只想更改一个命令的错误操作,您可以使用参数-ErrorAction来更改该命令的错误操作。

答案2

如果您想“捕获”错误,我会向您展示我的示例,也许您可​​以在此基础上进行构建。

function LoggedOnUser($MachineNameOrIP){

    $LoggedOnUser = "CouldNotGetUser"

    trap [Exception]{ # this installs an error handler for the function

        Write-Host "Error Accessing WMI - $MachineNameOrIP"
        Log("Error Accessing WMI - $MachineNameOrIP")

        continue;

    }


    $LoggedOnUser = Get-WMIObject Win32_Process -filter 'name="explorer.exe"' -computername $MachineNameOrIP |
    ForEach-Object { $owner = $_.GetOwner(); '{0}\{1}' -f $owner.Domain, $owner.User } |
    Sort-Object | Get-Unique

    return $LoggedOnUser

}

您可能已经猜到了,这是一个用于查找计算机的登录用户的函数。中间有一部分用于捕获任何异常。您可能能够摆脱

trap [ManagementObjectNotFoundException] {....}

因为 powershell 与 .net 紧密相关。

相关内容