Я запускаю следующий сценарий, который не работает для почтового ящика, которого не существует
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 #
Вы наблюдаете такое поведение, потому что блоки try / catch работают только при устранении ошибок (Справочник типов ошибок MSDN Powershell)
Вы можете изменить способ работы Powershell, изменив $ ErrorActionPreference Переменная.
Если вы настроите свой сценарий, чтобы $ErrorActionPreference = "Stop"
вверху, то все ошибки будут считаться прерывающими ошибками, и блок try / catch будет работать.
Если вы просто хотите изменить действие при ошибке для одной команды, вы можете использовать -ErrorAction
параметр, чтобы изменить его для этой команды.
Если вы хотите «поймать» ошибку, я покажу вам свой пример, и, возможно, вы сможете использовать его.
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.