Eco equivalente en PowerShell para pruebas de script

233

Me gustaría generar variables y valores en un script de PowerShell configurando banderas y viendo que los datos se matriculan en todo el script.

¿Cómo haría esto?

Por ejemplo, ¿cuál sería el equivalente de PowerShell al siguiente código PHP?

echo "filesizecounter: " . $filesizecounter 
phill
fuente
Consulte el editor de secuencias de comandos / depurador que viene con PowerGUI . Puede ser adecuado para lo que estás haciendo. Entiendo que Powershell 2 también viene con un depurador (pero no lo he probado).
dan-gph

Respuestas:

275

Hay varias formas:

Write-Host: Escriba directamente en la consola, no incluido en la salida de función / cmdlet. Permite establecer el color de primer plano y de fondo.

Write-Debug: Escriba directamente en la consola, si está $DebugPreferenceconfigurado en Continuar o Detener.

Write-Verbose: Escriba directamente en la consola, si está $VerbosePreferenceconfigurado en Continuar o Detener.

Este último está destinado a información adicional opcional, Write-Debugpara depuración (por lo que parece encajar en este caso).

Adicional : en PSH2 (al menos) los scripts que usan el enlace de cmdlet obtendrán automáticamente los parámetros -Verbosey -Debugcambiarán, habilitando localmente Write-Verbosey Write-Debug(es decir, anulando las variables de preferencia) como lo hacen los cmdlets y proveedores compilados.

Ricardo
fuente
44
Lo bueno de Write-Debug y Write-Verbose es que puede dejar sus declaraciones de depuración en su código, y simplemente activar el resultado cuando lo necesite utilizando la variable de preferencia apropiada. Ahorra tiempo y es una buena característica para otros usuarios de sus funciones.
JasonMArcher el
55
También debe familiarizarse con Out-String, porque con cualquier objeto no trivial, deberá usarlo para convertir el objeto en una cadena que se pueda mostrar antes de usar cualquiera de esos tres cmdlets Write- *.
Jaykul el
113

Powershell tiene un eco de mapeo de alias para Write-Output, entonces:

echo "filesizecounter : $filesizecounter"

Justin R.
fuente
77
echoes un alias Write-Outputsegún TechNet de Microsoft y discutido aquí
Glenn Lawrence
2
Gracias Glenn, parece que el alias se ha reasignado en los 6 años desde que publiqué esto. Lo cual es bueno, uno realmente no debería usar Write-Host ya que evita la tubería. He actualizado mi respuesta para indicar esto. ¡Gracias!
Justin R.
3
¿Por qué no querría omitir la canalización si todo lo que quiere hacer es hacer eco de la salida de "depuración" en la consola para rastrear la ejecución de un script? Write-Output tiene un efecto secundario extraño en el que el contenido de la última llamada a Write-Output se dejará en la pila, anulando cualquier variable que intente regresar explícitamente de una función. Los efectos secundarios como ese se sienten como una forma terriblemente desordenada para que un lenguaje se comporte.
Craig
33

PowerShell interpola, ¿no es así?

En PHP

echo "filesizecounter: " . $filesizecounter 

también se puede escribir como:

echo "filesizecounter: $filesizecounter" 

En PowerShell, algo como esto debería satisfacer sus necesidades:

Write-Host "filesizecounter: $filesizecounter"
John T
fuente
99
PHP no tiene nada que ver con nada en esta pregunta
reggaeguitar
25
Write-Host "filesizecounter : " $filesizecounter 
aforia
fuente
14

Con mucho, la forma más fácil de hacer eco en PowerShell es crear el objeto de cadena y dejar que la tubería lo muestre:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

Por supuesto, renuncia a cierta flexibilidad cuando no utiliza los métodos Write- *.

Goyuix
fuente
8

El host de escritura funciona bien.

$Filesize = (Get-Item $filepath).length;
Write-Host "FileSize= $filesize";
Ali Darabi
fuente
5

No sé si es aconsejable hacerlo, pero puedes escribir

"filesizecounter: " + $filesizecounter

Y debería generar:

filesizecounter: valor

Peter
fuente
1
"filesizecounter: $filesizecounter"Es aún más corto.
jiggunjer
3

PowerShell tiene alias para varios comandos comunes como echo. Escriba lo siguiente en PowerShell:

Get-Alias echo

para obtener una respuesta:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           echo -> Write-Output

Incluso Get-Alias ​​tiene un alias gal -> Get-Alias. Podrías escribir gal echopara obtener el alias echo.

gal echo

Aquí se enumeran otros alias: https://docs.microsoft.com/en-us/powershell/scripting/learn/using-familiar-command-names?view=powershell-6

cat dir mount rm cd echo move rmdir chdir erase popd sleep clear h ps sort cls history pushd tee copy kill pwd type del lp r write diff ls ren

Russ Van Bert
fuente
2

Inténtalo Get-Content .\yourScript.PS1y verás el contenido de tu guión.

También puede insertar esta línea en su código de script:

get-content .\scriptname.PS1
script code
script code

....

Luis
fuente
No muestra los valores reales procesados ​​(p. Ej., Sustitución de var env), por lo que no responde a la pregunta formulada.
iisystems
0

También debe mencionarse que Set-PSDebug es similar al echo oncomando por lotes de la vieja escuela :

Set-PSDebug -Trace 1

Este comando dará como resultado que se muestren todas las líneas del script de ejecución:

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

lauxjpn
fuente