Script de PowerShell, que muestra los comandos ejecutados

37

Estoy jugando con los scripts de PowerShell y están funcionando muy bien. Sin embargo, me pregunto si hay alguna forma de mostrar también todos los comandos que se ejecutaron, como si los estuviera escribiendo manualmente. Esto sería similar a "echo on" en archivos por lotes. Miré los argumentos de la línea de comandos de PowerShell, los cmdlets, pero no encontré nada obvio. ¡Gracias!

Nelson Rothermel
fuente

Respuestas:

45

El siguiente comando enviará cada línea de script a Write-Debug-

Set-PSDebug -Trace 1

Desde man Set-PSDebug

Cuando el parámetro Trace se establece en 1, cada línea de script se rastrea a medida que se ejecuta. Cuando el parámetro se establece en 2, también se rastrean asignaciones variables, llamadas a funciones y llamadas a scripts. Si se especifica el parámetro Step, se le solicitará antes de que se ejecute cada línea del script.

Bob Esponja
fuente
Si agrega esto a un script que usa Param, asegúrese de colocar esta línea debajo del bloque de definición de parámetros o puede causar fallas.
kayleeFrye_onDeck
4

Donde lo usé echo onen CMD, ahora lo uso Write-Verbosey en su Set-PSDebug -Steplugar. No son lo mismo, pero son más poderosos si se manejan hábilmente.

Jay Bazuzi
fuente
2

Feo:

PS > get-content foo.ps1|foreach-object{$_;invoke-expression "$_"}
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
powershell
PS > get-content foo.ps1
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
PS >

El problema con lo anterior es que si tiene comandos de varias líneas como este:

foreach($proc in $procs){
  $proc.processname
}

Lo anterior fallará con mi ejemplo anterior si se coloca en foo.ps1 con esa estructura ...

Marco Shaw
fuente
Sí, sigo encontrando soluciones a medias como esta. Realmente creo que no hay una "bala de plata" para lo que quiero. Gracias por ser creativo con estas soluciones. Ahora tengo un par de opciones y tendré que decidir a dónde ir desde aquí.
Nelson Rothermel
2
help about_History 

Te contaré sobre todos los comandos y

Get-History [options]  

devolverá la lista completa para que pueda manipular \ mostrar, etc.

Helvick
fuente
2
Encontré "set-psdebug -trace 1" que mostrará los comandos, pero no quiero mucho "ruido" adicional. get-history no genera nada en un script. Si lo hiciera, podría pegarlo al final de un script, pero luego los comandos no estarían en línea (antes de la salida del comando) y cualquier excepción lo omitiría (a menos que lo capte, por supuesto). Todavía es bueno tenerlo en cuenta ... ¿Alguna otra idea?
Nelson Rothermel el
Ah, ¿quiere decir que desea capturar la entrada y la salida, o al menos quiere hacer eco de los comandos de entrada seguidos de la salida correspondiente? Una forma de hacerlo es insertar los resultados en una matriz y luego recorrer los resultados del historial de resultados generando el comando seguido de su salida.
Helvick
start-transcript también puede hacer lo que estás buscando, pero se limitará solo a la parte de texto de la consola de la acción.
Helvick
Lo tienes, de la misma manera que funciona un archivo por lotes. Tenemos un montón de archivos por lotes ahora y estoy viendo la posibilidad de reemplazarlos con scripts de PowerShell. Tenemos software para programar, mantener el historial de salida, etc. Sin que se repita el comando de entrada, es más difícil de depurar. Supongo que presionar los resultados requiere que lo haga en cada comando, asegúrese de detectar excepciones, etc. para no perderse nada. Otra opción, pero no exactamente lo que estoy buscando. Es posible que solo tengamos que elegir una opción y ejecutarla.
Nelson Rothermel el
Intenté start-transcript, pero solo registró que comenzó / se detuvo, pero nada en el medio. Leí en alguna parte que está destinado a comandos interactivos.
Nelson Rothermel el