2010-01-19 19 views
44

Tengo un script de PowerShell que usa du.exe (Disk Usage originalmente de Sysinternals) para calcular el tamaño de los directorios.Error al llamar a un ejecutable de terceros desde Powershell al usar un IDE

Si me quedo du c:\Backup en la consola, funciona como se esperaba, pero la misma línea de código se ejecute en ISE o PowerGUI da el resultado esperado más el error

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

¿Por qué? ¿Cómo evito este error? Intenté invocar-expresión, usando &, pero no voy.

Gracias por la ayuda.

+0

Tenga en cuenta que si usted tiene $ '' ErrorActionPreference' establecido en Stop' esto va a detener la ejecución de la secuencia de comandos. Mi solución fue configurarlo para 'Continuar', invocar el comando y volver a establecerlo como 'Detener'. –

Respuesta

34

Para evitar esto se puede redirigir stderr a null ej .:

du 2> $null 

En esencia, el anfitrión de la consola y el ISE (así como la comunicación remota) el tratamiento de la corriente stderr diferente. En el host de la consola, era importante que PowerShell admitiera aplicaciones como edit.com para trabajar junto con otras aplicaciones que escriben resultados y errores de color en la pantalla. Si la secuencia de E/S no se redirecciona en el host de la consola, PowerShell proporciona al EXE nativo un identificador de consola para escribir directamente. Esto omite PowerShell, por lo que PowerShell no puede ver que hay errores escritos, por lo que no puede informar el error a través de $ error o escribiendo en la corriente stderr de PowerShell.

ISE y remoto no necesitan admitir este escenario para que puedan ver los errores en stderr y posteriormente escribir el error y actualizar $ error.

+0

Muchas gracias. Funcionó perfectamente. Lucas – Lucas

+0

Salvó el día.¡Perfecto! – Thomas

+0

¡Funcionó bien con PSEXEC! ¡Gracias! –

31

Recientemente me he enfrentado a los mismos problemas, pero me gustaría obtener la salida de stderr dirigida a stdout. Se podría pensar que la siguiente funcionaría:

& du 2>&1 

Pero PowerShell va a interpretar la redirección y procesarla después de 'du' se ha completado. El trabajo en torno a que he encontrado es para invocarlo utilizando cmd.exe/c:

& cmd /c 'du 2>&1' 
+0

Éste me funcionó y no pude usar la respuesta de KeithHill. Gracias SimonEjsing! – mbourgon

+0

Esto funcionó para mí, sin ejecutarlo en el contexto de cmd aún recibí el error. –

+3

Esto funcionó para mí. También necesitaba pasar opciones, así que la sintaxis completa para mí era '' '& cmd/c 'foo.exe 2> & 1' option1 option2'''. (Tenga en cuenta que solo el nombre del ejecutable y '2> & 1' van dentro de las comillas simples.) – user2441511

8

Otra manera de suprimir la salida NativeCommandError es convertir los objetos en la tubería de cuerdas como se indica en la parte inferior de this answer:

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

Probar:

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

Previ El FIX redirigirá los errores pero podría perder un error real si, por ejemplo, su nombre de usuario o contraseña no son buenos o si usa la autenticación integrada, no tiene acceso.

Así que aquí hay una manera de implementar el manejo de errores y eludir el error específico (que no es uno) planteado por psexec.

try{ 
 
      \t 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 
 
      }

+0

Si puede completar el resto del código para hacerlo compilable, ya que actualmente el código no es válido. – sean

Cuestiones relacionadas