Pergunta

Eu tenho um script do PowerShell que usa du.exe (Uso de disco originalmente de sysinternals) para calcular o tamanho dos diretórios.

Se eu correr du c:\Backup No console, ele funciona como esperado, mas a mesma linha de código é executada no ISE ou Powergui fornece o resultado esperado mais o erro

+ du <<<<  c:\backup
+ CategoryInfo          : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

Por que é que? Como evito esse erro? Eu tentei invocar a expressão, usando &, mas não vá.

Obrigado pela ajuda.

Foi útil?

Solução

Para evitar isso, você pode redirecionar o stderr para nulo, por exemplo:

du 2> $null

Essencialmente, o host do console e o ISE (assim como a remoção) tratam o fluxo STDERR de maneira diferente. No host do console, era importante que a PowerShell suportasse aplicativos como o Edit.com para trabalhar junto com outros aplicativos que escrevem saída e erros coloridos na tela. Se o fluxo de E/S não for redirecionado no Host Console, o PowerShell fornecerá ao Exe Native um identificador de console para escrever diretamente. Isso ignora o PowerShell para que o PowerShell não possa ver que existem erros escritos para que não possa relatar o erro por meio de erro ou escrevendo para o fluxo Stderr da PowerShell.

O ISE e o Remoting não precisam suportar esse cenário para que eles vejam os erros no STDERR e, posteriormente, escrevam o erro e atualizem o erro $.

Outras dicas

Recentemente, tenho enfrentado os mesmos problemas, mas gostaria de direcionar a saída do STDERR para o STDOUT. Você pensaria que o seguinte funcionaria:

    & du 2>&1

Mas o PowerShell interpretará o redirecionamento e o processará depois que 'du' for concluído. O trabalho que encontrei é invocá-lo usando cmd.exe /c:

    & cmd /c 'du 2>&1'

Outra maneira de suprimir o NativeCommandError A saída é para converter o objetos no oleoduto para cordas conforme descrito na parte inferior de esta resposta:

du c:\Backup 2>&1 | %{ "$_" }

Tentar:

du 2>&1 | %{ "$_" }

A correção anterior redirecionará erros, mas você pode perder um erro real se, por exemplo, seu nome de usuário ou senha não for bom ou, se estiver usando autenticação integrada, você não tiver acesso.

Então, aqui está uma maneira de implementar o manuseio de erros e ignorar o erro específico (que não é um) levantado pelo PSEXEC.

 try{
            	psexec command .....
            }
            catch [System.Management.Automation.RemoteException]{
                if ($_.TargetObject -like "Connecting to *" -and $_.CategoryInfo.Category -eq "NotSpecified" -and $_.FullyQualifiedErrorId -eq "NativeCommandError" -and $_.InvocationInfo.MyCommand.Name -like "psexec*.exe"){
                    $error.Remove[$Error[0]]
                }
                else{
                    Throw
                }
            }        
            catch{
                throw
            }

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top