我正在运行以下脚本,但因邮箱不存在而失败
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 紧密相关。