obtener help comandos comando ayuda powershell scripting ironpython

help - La ventana de Powershell desaparece antes de que pueda leer el mensaje de error



obtener ayuda de un comando powershell (10)

¿Has pensado en redirigir stdout y stderr a un archivo ex:

./ascript.ps1> registros 2> & 1

Nota: Puede crear un script de contenedor en powershell que llame a su script de powershell con todas las redirecciones necesarias.

Cuando llamo a un script de Powershell, ¿cómo puedo evitar que el script llamado cierre su ventana de comandos? Me aparece un error y estoy seguro de que puedo solucionarlo si pudiera leer el error.

Tengo un script Powershell que envía un correo electrónico con datos adjuntos utilizando las clases .NET. Si llamo al script directamente ejecutándolo desde la línea de comando o llamándolo desde el Programador de Windows, entonces funciona bien. Si lo llamo desde otro script (IronPython, si eso importa), entonces falla. Todos los escenarios funcionan bien en mi máquina de desarrollo. (¡Realmente tengo que obtener el logotipo de "Works on My Machine"!) Recibí la llamada a Powershell de una manera que muestra una ventana de comandos y puedo ver un destello rojo justo antes de que se cierre.

Lo siento: Powershell 1.0, IronPython 1.1

Solución: powershell -noexit d: / script / foo.ps1

El modificador de no funcionaba bien. Acabo de agregarlo a los argumentos que paso de IronPython. Como sospechaba, es algo que probablemente pueda solucionar yo mismo (política de ejecución, aunque lo hice temporalmente sin restricciones, sin ningún efecto, así que creo que necesito profundizar). Haré otra pregunta si tengo problemas con eso.

Gracias a todos por la ayuda. Aprendí que necesito investigar los switches de PowerShell un poco más de cerca, y puedo ver bastantes cosas que resultarán útiles en el futuro.


Tienes tres opciones:

  • Hacer una captura en el script (si usa Powershell V2 )
  • Escriba un script ficticio que atrape y redireccione a stdout, que luego puede acceder como una variable desde su script IronPython. Introducción de VBS / Wscript Además de esto, simplemente suelte los comandos de Lectura-Host en todas partes, y pulse regresar a la página.
  • En lugar de enviar cualquier cosa al shell, envuelva su secuencia de comandos de PowerShell en un segundo script que redirija todos los resultados a un archivo de registro .

    PS C:> myscript.ps1 | Out-File myscript.log


Un par de ideas más ... Podría usar el cmdlet start-sleep al final de su script para darle tiempo suficiente para revisar el error.

También podría usar start-transcript para grabar la sesión en un archivo de texto.


Lo he necesitado antes y, por lo general, no quería modificar el script (por lo general, para las secuencias de comandos disparadas desde el Programador de tareas). Solo quería ver lo que se escupe a la consola.

Todo lo que necesita hacer es agregar un comando de Lectura-Host después de la invocación del script, por ejemplo:

PowerShell.exe -command { ./foo.ps1; read-host "Press enter key to continue" }

Por cierto, el problema con el uso de Start-Transcript es que no captura la salida EXE. Y cualquier forma de intento de inicio de sesión en V1 e incluso V2 con el host estándar no capturará las secuencias detalladas, de depuración, de progreso o de advertencia. Solo puede verlos al ver la ventana del host asociado.

Una manera cursi pero efectiva de capturar todos los resultados del script (stdout, stderr, verbose, warning, debug) es usar otro host como cmd.exe, por ejemplo:

cmd.exe /c powershell.exe "$pwd/foo.ps1" > foo.log


No hay una prueba ordinaria ... construcción de captura en Powershell; sin embargo, puede atrapar excepciones en su lugar y reaccionar adecuadamente. ES DECIR:

Function Example() { trap [Exception] { write-host "We have an error!"; write-error $("ERROR: " + $_.Exception.Message); sleep 30; break; } write-host "Hello world!"; throw "Something very bad has happened!"; }

También puedes simular la construcción Try ... Catch:

Function Example2() { ${ write-host "Our try clause..."; throw "...caused an exception! It hurts!"; } trap [Exception] { write-error $_.Exception.Message; sleep 30; continue; }

Por supuesto, tan pronto como atrape una excepción, puede registrarla, dormir o lo que quiera con el mensaje de error. Mis ejemplos solo duermen, lo que le permite leer lo que sucedió, pero es mucho mejor registrar todos los errores. (La forma más simple es redirigirlos con >>).

Vea también: http://huddledmasses.org/trap-exception-in-powershell/


Crear el archivo run_ps_script.bat que contiene

@PowerShell.exe -command "try { %1 } finally { read-host ''Press ENTER...'' }"

y convertirlo en programa predeterminado para abrir scripts de PowerShell .


Pruebe con el -noexit :

powershell -noexit d:/script/foo.ps1


Una solución rápida y sucia es usar CTRL + S para detener el desplazamiento de la pantalla y CTRL + Q para reanudarlo.


Mi solución fue ejecutar el script con una línea de comando desde la ventana de la consola en lugar de hacer clic derecho en el archivo -> ejecutar con powershell .

La consola sigue mostrando los mensajes de error, incluso cuando finalizó la ejecución del script.


Básicamente tiene 3 opciones para evitar que se cierre la ventana de la Consola de PowerShell, que describo con más detalle en la publicación de mi blog .

  1. Solución única: ejecute la secuencia de comandos desde la consola de PowerShell o inicie el proceso de PowerShell con el conmutador -NoExit. por ejemplo, PowerShell -NoExit "C:/SomeFolder/SomeScript.ps1"
  2. Corrección por script: agregue un mensaje para ingresar al final de su archivo de script. p.ej. Read-Host -Prompt "Press Enter to exit"
  3. Solución global: cambie la clave de registro para que siempre deje la ventana de la consola de PowerShell abierta después de que el script finalice la ejecución.

Aquí están las claves de registro para modificar para la opción n. ° 3:

Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT/Applications/powershell.exe/shell/open/command] @="/"C://Windows//System32//WindowsPowerShell//v1.0//powershell.exe/" -NoExit /"& ///"%1///"/"" [HKEY_CLASSES_ROOT/Microsoft.PowerShellScript.1/Shell/0/Command] @="/"C://Windows//System32//WindowsPowerShell//v1.0//powershell.exe/" -NoExit /"-Command/" /"if((Get-ExecutionPolicy ) -ne ''AllSigned'') { Set-ExecutionPolicy -Scope Process Bypass }; & ///"%1///"/""

Vea mi blog para más información y un archivo .reg que aplicará estos cambios de registro automáticamente.