Pregunta

Tengo un script de PowerShell que los usos du.exe ( disco originalmente de Sysinternals) para calcular el tamaño de directorios.

Si me quedo du c:\Backup en la consola, funciona como se esperaba, pero la misma línea de código de ejecución 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 evitar este error? Probé Invoke-expresión, utilizando &, pero no ir.

Gracias por la ayuda.

¿Fue útil?

Solución

Para evitar esto se puede redirigir stderr a nula por ejemplo:.

du 2> $null

En esencia, el anfitrión consola y ISE (así como interacción remota) tratar la corriente de stderr diferente. En el host de la consola que era importante para PowerShell para aplicaciones de soporte como edit.com a trabajar junto con otras aplicaciones que escriben de colores de salida y los errores de la pantalla. Si el flujo de E / S no se redirige en el host de la consola, PowerShell da el EXE nativo de un mango consola de escribir en forma directa. Esto evita así que PowerShell PowerShell no puede ver que hay errores escritos por lo que no se puede informar del error a través de $ error o por escrito al flujo stderr de PowerShell.

ISE y comunicación remota no tienen que soportar este escenario así que hacen ver los errores en stderr y posteriormente escribir el error y la actualización de $ error.

Otros consejos

recientemente he tenido que hacer frente a los mismos problemas, pero me gustaría obtener la salida stderr dirigida a la salida estándar. Se podría pensar que la siguiente funcionaría:

    & du 2>&1

Pero PowerShell interpretar la redirección y procesarla después de 'du' se ha completado. El trabajo en torno encontré es invocar utilizando cmd.exe / c:

    & cmd /c 'du 2>&1'

Otra manera de suprimir la salida NativeCommandError es convertir el objetos en la tubería a cadenas como se indica en la parte inferior de la esta respuesta :

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

Trate:

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

FIX anterior redirigirá errores, pero se podía perder un error real si por ejemplo, su nombre de usuario o contraseña no es bueno o si se utiliza la autenticación integrada, que no tiene acceso.

Así que aquí es una forma de implementar el manejo de errores y el error específico de derivación (que no es uno) planteada por 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top