Назад | Перейти на главную страницу

Как мне «поймать» неудачную команду, которая не работает с помощью 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 #

Вы наблюдаете такое поведение, потому что блоки 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.