Como eu “pego” um comando com falha que não funciona com try… catch?

3

Estou executando o seguinte script que falha para uma caixa de correio que não existe

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:" 
}
}

Aqui está a falha

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

Como faço para detectar corretamente o erro que é mostrado acima, uma vez que realmente não oferece uma falha de estilo de "exceção" que eu esperaria no mundo C #

    
por random65537 12.04.2013 / 22:16

2 respostas

4

Você está vendo esse comportamento porque os blocos try / catch funcionam apenas em erros de finalização ( Referência de tipo de erro do MSDN Powershell )

Você pode manipular a maneira como o Powershell funciona, alterando a $ ErrorActionPreference Variável.

Se você ajustar seu script para ter $ErrorActionPreference = "Stop" na parte superior, todos os erros serão considerados erros de finalização e o bloco try / catch funcionará.

Se você quiser que a ação de erro seja alterada para um comando, pode usar o parâmetro -ErrorAction para alterá-lo para esse comando.

    
por 12.04.2013 / 22:34
0

Se você quiser "pegar" um erro, mostrarei meu exemplo e talvez você possa construir nele.

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

}

Como você provavelmente pode imaginar, essa é uma função para localizar o usuário conectado de uma máquina. Há uma parte no meio para capturar quaisquer exceções. Você pode ser capaz de fugir com

trap [ManagementObjectNotFoundException] {....}

Como o powershell liga a rede intimamente.

    
por 12.04.2013 / 22:20