Écho équivalent dans PowerShell pour les tests de script

233

Je voudrais sortir des variables et des valeurs dans un script PowerShell en configurant des indicateurs et en voyant les données se matriculer tout au long du script.

Comment pourrais-je faire ça?

Par exemple, quel serait l'équivalent PowerShell du code PHP suivant?

echo "filesizecounter: " . $filesizecounter 
phill
la source
Découvrez l'éditeur de script / débogueur fourni avec PowerGUI . Cela peut convenir à ce que vous faites. Je comprends que Powershell 2 est également livré avec un débogueur (mais je ne l'ai pas essayé).
dan-gph

Réponses:

275

Il existe plusieurs façons:

Write-Host: Écrire directement sur la console, non inclus dans la sortie fonction / applet de commande. Permet de définir la couleur du premier plan et de l'arrière-plan.

Write-Debug: Écrivez directement sur la console, si elle est $DebugPreferencedéfinie sur Continuer ou Arrêter.

Write-Verbose: Écrivez directement sur la console, si elle est $VerbosePreferencedéfinie sur Continuer ou Arrêter.

Ce dernier est destiné à des informations supplémentaires facultatives, Write-Debugpour le débogage (semble donc convenir dans ce cas).

Supplémentaire : Dans PSH2 (au moins), les scripts utilisant la liaison d'applet de commande obtiendront automatiquement les paramètres -Verboseet -Debugswitch, activant localement Write-Verboseet Write-Debug(c'est-à-dire remplaçant les variables de préférence) comme le font les applets de commande et les fournisseurs compilés.

Richard
la source
4
La bonne chose à propos de Write-Debug et Write-Verbose est que vous pouvez laisser vos instructions de débogage dans votre code et simplement activer la sortie lorsque vous en avez besoin en utilisant la variable de préférence appropriée. Gain de temps et constitue une fonctionnalité intéressante pour les autres utilisateurs de vos fonctions.
JasonMArcher
5
Vous souhaitez également vous familiariser avec Out-String, car avec tout objet non trivial, vous devrez l'utiliser pour convertir l'objet en une chaîne d'affichage avant d'utiliser l'une de ces trois applets de commande Write- *.
Jaykul
113

Powershell a un écho de mappage d'alias Write-Output, donc:

echo "filesizecounter : $filesizecounter"

Justin R.
la source
7
echoest un alias Write-Outputselon TechNet de Microsoft et discuté ici
Glenn Lawrence
2
Merci Glenn, il semble que l'alias ait été remappé au cours des 6 années écoulées depuis que j'ai posté cela. Ce qui est bien, il ne faut vraiment pas utiliser Write-Host car il contourne le pipeline. J'ai mis à jour ma réponse pour l'indiquer. Merci!
Justin R.
3
Pourquoi ne voudriez-vous pas contourner le pipeline si tout ce que vous voulez faire est d'écho de la sortie de «débogage» vers la console pour suivre l'exécution d'un script? Write-Output a un effet secondaire étrange où le contenu du dernier appel à Write-Output sera laissé sur la pile, remplaçant toute variable que vous essayez de retourner explicitement à partir d'une fonction. Des effets secondaires comme celui-ci se sentent comme un moyen terriblement visqueux pour qu'une langue se comporte.
Craig
33

PowerShell interpole, n'est-ce pas?

En PHP

echo "filesizecounter: " . $filesizecounter 

peut également s'écrire:

echo "filesizecounter: $filesizecounter" 

Dans PowerShell, quelque chose comme cela devrait répondre à vos besoins:

Write-Host "filesizecounter: $filesizecounter"
John T
la source
9
PHP n'a rien à voir avec quoi que ce soit dans cette question
reggaeguitar
25
Write-Host "filesizecounter : " $filesizecounter 
aphorie
la source
14

De loin, le moyen le plus simple de faire écho dans PowerShell est simplement de créer l'objet chaîne et de laisser le pipeline le générer:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

Bien sûr, vous abandonnez une certaine flexibilité lorsque vous n'utilisez pas les méthodes Write- *.

Goyuix
la source
9

echo est un alias de Write-Output bien qu'il ressemble à Write-Host .

Ce n'est pas Quelle est la différence entre echo et Write-Host dans PowerShell? .

echo est un alias pour Write-Output, qui écrit dans le flux de sortie Success. Cela permet à la sortie d'être traitée via des pipelines ou redirigée vers des fichiers. Write-Host écrit directement sur la console, de sorte que la sortie ne peut plus être redirigée / traitée.

Paul Fijma
la source
8

L'hôte d'écriture fonctionne bien.

$Filesize = (Get-Item $filepath).length;
Write-Host "FileSize= $filesize";
ali Darabi
la source
5

Je ne sais pas s'il est sage de le faire, mais vous pouvez simplement écrire

"filesizecounter: " + $filesizecounter

Et il devrait produire:

filesizecounter: valeur

Peter
la source
1
"filesizecounter: $filesizecounter"est encore plus court.
jiggunjer
3

PowerShell possède des alias pour plusieurs commandes courantes comme echo. Tapez ce qui suit dans PowerShell:

Get-Alias echo

pour obtenir une réponse:

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

Même Get-Alias ​​a un alias gal -> Get-Alias. Vous pouvez écrire gal echopour obtenir l'alias de echo.

gal echo

D'autres alias sont répertoriés ici: 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
la source
2

Essayez Get-Content .\yourScript.PS1et vous verrez le contenu de votre script.

vous pouvez également insérer cette ligne dans votre code de script:

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

....

Luis
la source
N'affiche pas les valeurs réelles traitées (par exemple la substitution env var), donc pas de réponse à la question posée.
iisystems
0

Il convient également de mentionner que Set-PSDebug est similaire à la echo oncommande batch old-school :

Set-PSDebug -Trace 1

Cette commande entraînera l'affichage de chaque ligne du script en cours d'exécution:

Lorsque le Traceparamètre a une valeur de 1, chaque ligne de script est tracée lors de son exécution. Lorsque le paramètre a une valeur de 2, les affectations de variables, les appels de fonction et les appels de script sont également suivis. Si le paramètre Step est spécifié, vous êtes invité avant l'exécution de chaque ligne du script.

lauxjpn
la source