184 votes

Comment puis-je afficher du texte sans saut de ligne en PowerShell ?

Je veux que mon script PowerShell affiche quelque chose comme ceci:

Activation de la fonctionnalité XYZ......Terminé

Le script ressemble à ceci:

Write-Output "Activation de la fonctionnalité XYZ......."
Activer-SPFeature...
Write-Output "Terminé"

Mais Write-Output imprime toujours une nouvelle ligne à la fin, donc ma sortie n'est pas sur une seule ligne. Y a-t-il un moyen de le faire?

3 votes

189voto

Shay Levy Points 41404
Write-Host -NoNewline "Activation de la fonctionnalité XYZ......."

86 votes

Downvoted because the OP's example specifically uses Write-Output, which has vastly different function than Write-Host. Readers should note this big discrepency before copy/pasting the answer. Déclassé car l'exemple fourni par l'auteur de la question utilise spécifiquement Write-Output, qui a une fonction très différente de Write-Host. Les lecteurs devraient prendre note de cette grande différence avant de copier/coller la réponse.

6 votes

Je suis d'accord avec @NathanAldenSr, Write-Host n'aide pas si vous essayez de produire une sortie vers un fichier, etc.

8 votes

Write-Host est presque jamais la bonne réponse. C'est l'équivalent de faire >/dev/tty dans Unixland.

10voto

shufler Points 591

Alors que cela peut ne pas fonctionner dans votre cas (puisque vous fournissez une sortie informative à l'utilisateur), créez une chaîne que vous pouvez utiliser pour ajouter une sortie. Lorsqu'il est temps de la sortir, il suffit de sortir la chaîne.

Ignorant bien sûr que cet exemple est ridicule dans votre cas mais utile en concept :

$output = "Activation de la fonction XYZ......."
Enable-SPFeature...
$output += "Terminé"
Write-Output $output

Affiche :

Activation de la fonction XYZ.......Terminé

1 votes

Cela peut fonctionner dans l'exemple spécifique fourni, mais il y a toujours un saut de ligne supplémentaire produit par Write-Output. Solution de contournement raisonnable, mais pas une solution.

0 votes

Ecrire-Sortie produit toujours un saut de ligne à la fin. Il n'y a aucun moyen d'y échapper avec cette commande.

9 votes

Ce n’est pas le point puisque la sortie complète apparaît après que la fonctionnalité est installée.

5voto

FrinkTheBrave Points 1272

Pour écrire dans un fichier, vous pouvez utiliser un tableau de bytes. L'exemple suivant crée un fichier ZIP vide auquel vous pouvez ajouter des fichiers :

[Byte[]] $zipHeader = 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
[System.IO.File]::WriteAllBytes("C:\My.zip", $zipHeader)

Ou utilisez :

[Byte[]] $text = [System.Text.Encoding]::UTF8.getBytes("Enabling feature XYZ.......")
[System.IO.File]::WriteAllBytes("C:\My.zip", $text)

1 votes

Voilà un exemple impressionnant!

2voto

eythort Points 51

Le problème que j'ai rencontré était que Write-Output ajoutait en réalité des sauts de ligne à la sortie lorsque j'utilisais PowerShell v2, du moins vers stdout. J'essayais d'écrire un texte XML vers stdout sans succès, car il était à la ligne dure à 80 caractères.

La solution de contournement a été d'utiliser

[Console]::Out.Write($myVeryLongXMLTextBlobLine)

Ce n'était pas un problème dans PowerShell v3. Write-Output semble fonctionner correctement là-bas.

En fonction de la façon dont le script PowerShell est invoqué, vous devrez peut-être utiliser

[Console]::BufferWidth =< longueur de la chaîne, par exemple 10000)

avant d'écrire vers stdout.

2 votes

Se comporte comme Write-Host, mais en pire. Vous ne pouvez pas le rediriger vers un fichier par exemple.

1voto

samthebest Points 2097

Vous ne pouvez tout simplement pas obtenir PowerShell pour omettre ces fichus sauts de ligne... Il n'existe aucun script ou cmdlet qui le fasse. Bien sûr, Write-Host est totalement absurde, car vous ne pouvez pas rediriger/piper à partir de lui!

Néanmoins, vous pouvez écrire votre propre fichier EXE pour le faire, ce que j'ai expliqué comment faire dans la question Stack Overflow How to output something in PowerShell.

2 votes

Information incorrecte. Comme Shay et Jay l'ont excellemment répondu, il suffit d'ajouter -NoNewline comme premier argument.

2 votes

Peut-être que c'est le cas maintenant @DavidatHotspotOffice mais lorsque j'ai touché une boîte Windows pour la dernière fois (il y a plus d'un an), cela ne fonctionnait pas, vous ne pouviez pas rediriger/envoyer depuis Write-Host. Pour être honnête, je n'avais pas la moindre patience pour POSH ou .NET, j'ai abandonné après quelques mois et suis retourné sur terre Unix. amusant

4 votes

@DavidatHotspotOffice - En fait, il a raison. Il n'y a pas d'argument "NoNewLine" pour Write-Output, c'est de cela que parlait la question d'origine. Il existe quelques bonnes raisons, semble-t-il, d'utiliser Write-Output - donc cette réponse a du sens. jsnover.com/blog/2013/12/07/write-host-considered-harmful

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X