Como posso sair de uma função no powershell?

3

Eu tenho uma função que sei que lançará um erro. Este erro é esperado, mas quando é lançado, quero terminar a função. Eu tenho uma seção Trap no meu script e usei os comandos Return e Break , mas eles não fazem o que eu quero. Eu tenho a declaração de armadilha nas seções Begin {} e Process {} . Estou usando o comando Get-WmiObject e tenho o -ErrorAction definido como stop . Uma amostra do código e suas respostas estão abaixo.

Primeiro exemplo com retorno:

Function Test {
Param {"Some Parameters"}
Begin {"Some beginning stuff"}
process {
    Trap
    {
        Add-Content $($SomeFile) $($ComputerName + "is Not There")
        return
    } #End Trap
    Get-WmiObject Win32_NTLogEvent '
        -ComputerName $ComputerName '
        -Credential $Cred - '
        -ErrorAction Stop
    }#End Process
End {"Some ending things"}
} #End Function

Este simplesmente continua, sem sair da função.

Segundo exemplo com quebra:

Function Test {
Param {"Some Parameters"}
Begin {"Some beginning stuff"}
process {
    Trap
    {
        Add-Content $($SomeFile) $($ComputerName + "is Not There")
        Break
    } #End Trap
    Get-WmiObject Win32_NTLogEvent '
        -ComputerName $ComputerName '
        -Credential $Cred - '
        -ErrorAction Stop
    }#End Process
End {"Some ending things"}
} #End Function

Este aqui sai do script inteiro.

Eu olhei em volta, mas não consigo encontrar nada específico para sair apenas de uma função. Há muito mais acontecendo na função, incluindo outro comando Get-WmiObject . Eu quero que ele saia da função se o primeiro Get-WmiObject não puder entrar em contato com o computador. Eu não posso usar um teste de ping, porque muitos dos servidores bloqueiam o ICMP.

    
por Nick 23.07.2012 / 19:38

3 respostas

3

A variável $? pode ser boa para detectar erros. Ele contém um booleano para o último comando executado. Se o comando foi executado sem erros $? = $true . O $? será $false quando o último comando executado estiver com erro.

Crie um booleano que seja configurado toda vez após o comando que erros. Supondo que o comando aqui seja get-wmiObject:

$running = $true
While ($running) {
Get-WmiObject Win32_NTLogEvent -ComputerName $ComputerName -Credential $Cred
$running = $?
}

Já que você provavelmente já tem uma condicional no seu loop, seria parecido com while(<condition> -and $running)

E se você gostaria de adicionar sua mensagem de erro, apenas jogue algo depois de definir a execução como esta

if(!$running){Add-Content $($SomeFile) $($ComputerName + "is Not There")  }
    
por 23.07.2012 / 21:34
3

O retorno de fato não ajuda, mas você pode usar break, o único requisito é usá-lo como foi projetado - para sair do loop ...:)

O truque aqui é criar um loop simples que será executado apenas uma vez, não importando o que e o uso dentro do loop:

# Script body...

do {
    Test-WithBreak
} until ($true)

# Other operations you want to perform even if Test-WithBreak breaks.

A razão por trás disso é o fato de que break é uma diretiva de loop e no PowerShell ele não se importa com nenhum limite (assim, quebrar script, executar a partir de script, executar a partir de script será capaz de percorrer todo o caminho e coisa toda, a menos que encontre algum loop para pará-lo).

Eu blogue sobre esse assunto há algum tempo.

    
por 24.07.2012 / 11:43
2

Experimente "Continuar" como palavra-chave

Armadilha [Exception] {“In PowerShell”}

    
por 23.07.2012 / 19:56