ide - scripts - habilitar script powershell windows 7
Se produjo un error al invocar un ejecutable de terceros de Powershell cuando se usa un IDE (5)
Tengo un script de PowerShell que usa du.exe ( Uso del disco originalmente de Sysinternals) para calcular el tamaño de los directorios.
Si ejecuto du c:/Backup
en la consola, funciona como se esperaba, pero la misma línea de código ejecutada en ISE o PowerGui da el resultado esperado más el error
+ du <<<< c:/backup
+ CategoryInfo : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
¿Porqué es eso? ¿Cómo evito este error? Intenté invoke-expression, usando &
, pero no go.
Gracias por la ayuda.
El FIX anterior redirigirá los errores pero podría perder un error real si, por ejemplo, su nombre de usuario o contraseña no es bueno 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{
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
}
Otra forma de suprimir la salida NativeCommandError
es convertir los objetos en la canalización a cadenas como se indica en la parte inferior de esta respuesta :
du c:/Backup 2>&1 | %{ "$_" }
Para evitar esto, puede redirigir stderr a nulo, por ejemplo:
du 2> $null
Básicamente, el host de la consola y el ISE (así como la comunicación remota) tratan el flujo de stderr de forma 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.
Recientemente me he enfrentado a los mismos problemas, pero me gustaría obtener la salida de stderr dirigida a stdout. Pensarías que lo siguiente funcionaría:
& du 2>&1
Pero PowerShell interpretará la redirección y la procesará después de que se complete ''du''. La solución alternativa que encontré es invocarlo usando cmd.exe / c:
& cmd /c ''du 2>&1''
Tratar:
du 2>&1 | %{ "$_" }