Je veux que mon script PowerShell imprime quelque chose comme ceci:
Enabling feature XYZ......Done
Le script ressemble à ceci:
Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"
Mais Write-Output
imprime toujours une nouvelle ligne à la fin pour que ma sortie ne soit pas sur une seule ligne. Y a-t-il un moyen de faire cela?
powershell
Amit G
la source
la source
Réponses:
la source
Write-Output
, qui a une fonction très différente deWrite-Host
. Les lecteurs doivent noter cette grande différence avant de copier / coller la réponse.Write-Host
n'est presque jamais la bonne réponse. C'est l'équivalent de faire>/dev/tty
sous Unixland.Write-Progress
peut être approprié dans certains cas, voir l'exemple ci-dessous.Write-Output
.Write-Output
n'a pas le-NoNewLine
paramètre.Malheureusement, comme indiqué dans plusieurs réponses et commentaires,
Write-Host
peut être dangereux et ne peut pas être redirigé vers d'autres processus etWrite-Output
n'a pas le-NoNewline
drapeau.Mais ces méthodes sont les moyens "* nix" pour afficher la progression, la manière "PowerShell" de le faire semble être
Write-Progress
: il affiche une barre en haut de la fenêtre PowerShell avec des informations de progression, disponibles à partir de PowerShell 3.0, voir le manuel pour détails.Et pour prendre l'exemple du PO:
la source
Bien que cela ne fonctionne pas dans votre cas (puisque vous fournissez une sortie informative à l'utilisateur), créez une chaîne que vous pouvez utiliser pour ajouter la sortie. Quand il est temps de le sortir, sortez simplement la chaîne.
Ignorant bien sûr que cet exemple est idiot dans votre cas mais utile dans son concept:
Affiche:
la source
Write-Output
. Solution de contournement raisonnable, mais pas de solution.Oui, comme les autres réponses ont des états, cela ne peut pas être fait avec Write-Output. Là où PowerShell échoue, tournez-vous vers .NET, il y a même quelques réponses .NET ici, mais elles sont plus complexes que nécessaire.
Utilisez simplement:
Ce n'est pas le PowerShell le plus pur, mais cela fonctionne.
la source
Write-Host
, sauf que les gens ne s'y attendront pas.Pour écrire dans un fichier, vous pouvez utiliser un tableau d'octets. L'exemple suivant crée un fichier ZIP vide, auquel vous pouvez ajouter des fichiers:
Ou utiliser:
la source
Une simplification de la réponse de FrinkTheBrave:
la source
Le problème que j'ai rencontré était que Write-Output fait en fait des sauts de ligne dans la sortie lors de l'utilisation de PowerShell v2, au moins vers stdout. J'essayais d'écrire un texte XML sur stdout sans succès, car il serait dur enveloppé au caractère 80.
La solution de contournement consistait à utiliser
Ce n'était pas un problème dans PowerShell v3. Write-Output semble y fonctionner correctement.
Selon la façon dont le script PowerShell est appelé, vous devrez peut-être utiliser
avant d'écrire dans stdout.
la source
Il ne semble y avoir aucun moyen de le faire dans PowerShell. Toutes les réponses précédentes ne sont pas correctes, car elles ne se comportent pas comme elles le font
Write-Output
mais plutôt comme cellesWrite-Host
qui n'ont pas ce problème de toute façon.La solution ferme semble être utilisée
Write-Host
avec le-NoNewLine
paramètre. Vous ne pouvez pas diriger ceci, ce qui est généralement un problème, mais il existe un moyen de remplacer cette fonction comme décrit dans Write-Host => Exporter vers un fichier , afin que vous puissiez facilement lui faire accepter le paramètre pour un fichier de sortie. C'est encore loin d'être une bonne solution. AvecStart-Transcript
cela, c'est plus utilisable, mais cette cmdlet a des problèmes avec les applications natives.Write-Output
ne peut tout simplement pas faire ce dont vous avez besoin dans un contexte général.la source
Write-Host
est terrible, un destructeur de mondes, mais vous pouvez l'utiliser simplement pour afficher la progression d'un utilisateur tout en utilisantWrite-Output
pour se connecter (pas que l'OP ait demandé la journalisation).la source
Write-Progress
.Vous ne pouvez tout simplement pas demander à PowerShell d'omettre ces nouvelles lignes embêtantes ... Il n'y a pas de script ou d'applet de commande qui le fasse. Bien sûr, Write-Host est un non-sens absolu, car vous ne pouvez pas en rediriger / rediriger!
Néanmoins, vous pouvez écrire votre propre fichier EXE pour le faire.C'est ce que j'ai expliqué comment faire dans la question Stack Overflow Comment sortir quelque chose dans PowerShell .
la source
La réponse de shufler est correcte. En d'autres termes: au lieu de transmettre les valeurs à Write-Output en utilisant le ARRAY FORM,
ou l'équivalent par plusieurs appels à Write-Output,
concaténez d'abord vos composants dans une STRING VARIABLE:
Cela empêchera les CRLF intermédiaires provoqués par l'appel de plusieurs fois Write-Output (ou ARRAY FORM), mais bien sûr ne supprimera pas le CRLF final de la commandlet Write-Output. Pour cela, vous devrez écrire votre propre commandlet, utiliser l'une des autres solutions de contournement compliquées répertoriées ici ou attendre que Microsoft décide de prendre en charge l'
-NoNewline
option d'écriture-sortie.Votre désir de fournir un indicateur de progression textuel à la console (c'est-à-dire "....") par opposition à l'écriture dans un fichier journal, doit également être satisfait en utilisant Write-Host. Vous pouvez accomplir les deux en collectant le texte du msg dans une variable pour l'écrire dans le journal ET en utilisant Write-Host pour fournir une progression à la console. Cette fonctionnalité peut être combinée dans votre propre commandlet pour une meilleure réutilisation du code.
la source
Write-Output
, vous ne pouvez tout simplement pas le voir car c'est la dernière chose écrite. Solution de contournement raisonnable, mais pas de solution. Il peut y avoir quelque chose qui consomme la sortie résultante qui ne peut pas gérer la nouvelle ligne de fin.Ce qui suit replacera le curseur au début de la ligne précédente. A vous de le placer dans la bonne position horizontale (en utilisant $ pos.X pour le déplacer latéralement):
Votre sortie actuelle est de 27 espaces, donc $ pos.X = 27 pourrait fonctionner.
la source
$pos.X
également. Le problème est que si vous le dirigez vers un fichier, deux lignes distinctes apparaissent.Ce n'est peut-être pas très élégant, mais il fait exactement ce qu'OP a demandé. Notez que l'ISE joue avec StdOut, donc il n'y aura aucune sortie. Afin de voir ce travail de script, il ne peut pas être exécuté dans l'ISE.
la source
[System.Console]
ne peut pas être redirigé vers un fichier.J'ai triché, mais je crois que c'est la seule réponse qui répond à toutes les exigences. À savoir, cela évite le CRLF de fin, fournit un endroit pour que l'autre opération se termine dans l'intervalle, et redirige correctement vers stdout si nécessaire.
la source
la source
o / p désiré: Activation de la fonction XYZ ...... Terminé
vous pouvez utiliser la commande ci-dessous
$ a = "Activation de la fonction XYZ"
Sortie d'écriture "$ a ...... Done"
vous devez ajouter une variable et une déclaration entre guillemets. j'espère que cela vous sera utile :)
Merci Techiegal
la source
Il y a déjà tellement de réponses ici que personne ne fera défiler ici. Quoi qu'il en soit, il existe également une solution pour écrire du texte sans nouvelle ligne à la fin, avec les éléments suivants:
Sortie de fichier avec encodage:
Sortie de la console:
la source
Vous pouvez absolument le faire. Write-Output a un indicateur appelé " NoEnumerate " qui est essentiellement la même chose.
la source