it-swarm-pt.tech

Como capturar o valor de retorno de um ScriptBlock chamado com o comando de chamada do Powershell

Minha pergunta é muito semelhante a esta , exceto que estou tentando capturar o código de retorno de um ScriptBlock usando Invoke-Command (portanto, não posso usar a opção -FilePath). Aqui está o meu código:

Invoke-Command -computername $server {\\fileserver\script.cmd $args} -ArgumentList $args
exit $LASTEXITCODE

O problema é que o Invoke-Command não captura o código de retorno do script.cmd, então não tenho como saber se ele falhou ou não. Eu preciso saber se o script.cmd falhou.

Tentei usar também uma New-PSSession (que me permite ver o código de retorno do script.cmd no servidor remoto), mas não consigo encontrar nenhuma maneira de transmiti-lo ao meu script chamado Powershell para realmente fazer alguma coisa sobre a falha.

29
Jay Spang
$remotesession = new-pssession -computername localhost
invoke-command -ScriptBlock { cmd /c exit 2} -Session $remotesession
$remotelastexitcode = invoke-command -ScriptBlock { $lastexitcode} -Session $remotesession
$remotelastexitcode # will return 2 in this example
  1. Crie uma nova sessão usando new-pssession
  2. Invoque seu scripblock nesta sessão
  3. Busque o lastexitcode nesta sessão
39
jon Z
$script = {
    # Call exe and combine all output streams so nothing is missed
    $output = ping badhostname *>&1

    # Save lastexitcode right after call to exe completes
    $exitCode = $LASTEXITCODE

    # Return the output and the exitcode using a hashtable
    New-Object -TypeName PSCustomObject -Property @{Host=$env:computername; Output=$output; ExitCode=$exitCode}
}

# Capture the results from the remote computers
$results = Invoke-Command -ComputerName Host1, Host2 -ScriptBlock $script

$results | select Host, Output, ExitCode | Format-List

Anfitrião: Host1
Saída: a solicitação de ping não pôde encontrar o host badhostname. Por favor, verifique o nome e tente novamente
Código de saída: 1

Anfitrião: Host2
Saída: a solicitação de ping não pôde encontrar o host badhostname. Por favor, verifique o nome e tente novamente.
Código de saída: 1

6
Matthew MacFarland

Ultimamente, tenho usado outro método para resolver esse problema. As várias saídas que vêm do script em execução no computador remoto são uma matriz.

$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   ping BADHOSTNAME
   $lastexitcode
}

exit $result | Select-Object -Last 1

A variável $result Conterá uma matriz da mensagem de saída de ping e o $lastexitcode. Se o código de saída do script remoto for o último a sair, ele poderá ser buscado a partir do resultado completo sem analisar.

Para obter o restante da saída antes do código de saída, basta:
$result | Select-Object -First $(result.Count-1)

2
Matthew MacFarland

A resposta de @jon Z é boa, mas isso é mais simples:

$remotelastexitcode = invoke-command -computername localhost -ScriptBlock {
    cmd /c exit 2; $lastexitcode}

Obviamente, se o seu comando produzir saída, você terá que suprimi-lo ou analisá-lo para obter o código de saída. Nesse caso, a resposta de @jon Z pode ser melhor.

1
jimhark