Перехват ошибок в командной консоли Exchange - PullRequest
2 голосов
/ 21 декабря 2011

Я пытаюсь написать скрипт powershell, который создает почтовый ящик Exchange. Это прекрасно работает, пока почтовый ящик еще не существует, но когда я пытаюсь перехватить любую ошибку и сообщить о ней, сценарий просто запускается, как будто все в порядке.

Я запустил сценарий для уже существующего пользователя, и он показывает ошибку, но он обычно возвращается, как если бы почтовый ящик был создан.

Я нашел этот вопрос , который решил «почему», я думаю, команда Enable-Mailbox генерирует только нескончаемые ошибки.

Во всяком случае, все предлагаемые решения по обнаружению этих ошибок не выполняются. Кажется, командлет игнорирует переменную $ ErrorActionPreference, $? всегда $ true, независимо от того, произошла ошибка или нет. $ error всегда содержит что-то, поэтому здесь тоже нечего проверять.

Это код скрипта, который я использую, очень простой.

param( [string]$uid, [string]$email )
trap [Exception] { 
    "ERROR: " + $_.Exception.Message
    exit
}
Enable-Mailbox -Identity $uid -Database HaiTest-MBDataBase-01 -PrimarySmtpAddress $email
"SUCCESS: mailbox created successfully"

Работает со всем остальным, это всего лишь командная консоль Exchange, которая вызывает проблемы. Среда Exchange является сервером Exchange 2010.

Можно ли проверить командлеты на наличие ошибок?

Ответы [ 2 ]

3 голосов
/ 21 декабря 2011

Ошибки перехвата работают только для завершающих ошибок, похоже, что ошибка, полученная из Enable-Mailbox, не является завершающей ошибкой. Вы можете заставить ошибку быть завершающей, передав переменной ErrorAction значение «Stop». Вы также можете использовать try / catch (в PowerShell 2.0) вместо trap:

param( [string]$uid, [string]$email )
trap { 
    "ERROR: " + $_.Exception.Message
    exit
}
Enable-Mailbox -Identity $uid -Database HaiTest-MBDataBase-01 -ErrorAction Stop -PrimarySmtpAddress $email 
"SUCCESS: mailbox created successfully" 
0 голосов
/ 14 марта 2018

Пока что единственное надежное решение, которое я нашел для странного поведения обработки исключений командлетов Exchange 2010, это добавление «-ErrorAction SilentlyContinue», чтобы исключить исключения, а затем поиск ожидаемых результатов.

Например, при включении почтового ящика я смотрю на наличие почтового ящика, как это ...

function Enable-MailboxSafely {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        $Identity,
        $Database,
        [switch]$WhatIf
    )

    $output = [pscustomobject][ordered]@{
        Identity = $Identity.ToString()
        Mailbox = $null
        Message = 'Unknown Error'
        Success = $false
    }

    $output.Mailbox = Get-Mailbox -Identity $Identity -ErrorAction SilentlyContinue

    if ($output.Mailbox -ne $null) {
        $output.Message = 'Mailbox already exists.'
        $output.success = $true
    }
    Else {
        $null = Enable-Mailbox -Identity $Identity -Database:$Database -ErrorAction SilentlyContinue
        # Have to look for a mailbox, as a workaround to the Exchange 2010 Cmdlets not implementing exceptions correctly.
        $output.Mailbox = Get-Mailbox -Identity $Identity -DomainController:$DomainController -ErrorAction SilentlyContinue
        if ($output.Mailbox -ne $null) {
            $output.Message = "Mailbox created for [$Identity] on database [$Database]."
            $output.success = $true
        }
        else {
            $output.Message = "Failed to create mailbox for [$Identity] on database [$Database]."
            $output.Success = $false
        }
    }
    Write-Output $output
}

Enable-MailboxSafely -Identity Somebody
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...