Ich möchte, dass mein PowerShell-Skript etwa Folgendes druckt:
Enabling feature XYZ......Done
Das Skript sieht ungefähr so aus:
Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"
Druckt aber Write-Output
immer eine neue Zeile am Ende, damit meine Ausgabe nicht in einer Zeile steht. Gibt es eine Möglichkeit, dies zu tun?
powershell
Amit G.
quelle
quelle
Antworten:
quelle
Write-Output
, was eine völlig andere Funktion hat alsWrite-Host
. Leser sollten diese große Diskrepanz beachten, bevor sie die Antwort kopieren / einfügen.Write-Host
ist fast nie die richtige Antwort. Es ist das Äquivalent zu>/dev/tty
Unixland.Write-Progress
kann in einigen Fällen angemessen sein, siehe Beispiel unten.Write-Output
.Write-Output
hat den-NoNewLine
Parameter nicht.Wie in mehreren Antworten und Kommentaren erwähnt,
Write-Host
kann dies leider gefährlich sein und kann nicht an andere Prozesse weitergeleitet werden undWrite-Output
hat nicht das-NoNewline
Flag.Diese Methoden sind jedoch die "* nix" -Methoden zum Anzeigen des Fortschritts. Die "PowerShell" -Methode scheint dies zu sein
Write-Progress
: Sie zeigt oben im PowerShell-Fenster eine Leiste mit Fortschrittsinformationen an, die ab PowerShell 3.0 verfügbar sind ( siehe Handbuch für) Einzelheiten.Und um das Beispiel des OP zu nehmen:
quelle
In Ihrem Fall funktioniert dies möglicherweise nicht (da Sie dem Benutzer eine informative Ausgabe bereitstellen). Erstellen Sie jedoch eine Zeichenfolge, mit der Sie die Ausgabe anhängen können. Wenn es Zeit ist, es auszugeben, geben Sie einfach den String aus.
Ignorieren Sie natürlich, dass dieses Beispiel in Ihrem Fall albern, aber im Konzept nützlich ist:
Anzeigen:
quelle
Write-Output
. Angemessene Problemumgehung, aber keine Lösung.Ja, da andere Antworten Zustände haben, kann dies nicht mit Write-Output durchgeführt werden. Wenn PowerShell fehlschlägt, wenden Sie sich an .NET. Hier gibt es sogar einige .NET-Antworten, die jedoch komplexer sind als erforderlich.
Benutz einfach:
Es ist nicht die reinste PowerShell, aber es funktioniert.
quelle
Write-Host
, außer dass die Leute es nicht erwarten.Zum Schreiben in eine Datei können Sie ein Byte-Array verwenden. Im folgenden Beispiel wird eine leere ZIP-Datei erstellt, zu der Sie Dateien hinzufügen können:
Oder verwenden Sie:
quelle
Eine Vereinfachung der Antwort von FrinkTheBrave:
quelle
Das Problem, auf das ich gestoßen bin, war, dass Write-Output bei Verwendung von PowerShell v2 tatsächlich Zeilenumbrüche verursacht, zumindest bei Standardausgabe. Ich habe versucht, einen XML-Text ohne Erfolg in stdout zu schreiben, da er bei Zeichen 80 schwer verpackt werden würde.
Die Problemumgehung war zu verwenden
Dies war in PowerShell v3 kein Problem. Die Schreibausgabe scheint dort ordnungsgemäß zu funktionieren.
Je nachdem, wie das PowerShell-Skript aufgerufen wird, müssen Sie es möglicherweise verwenden
bevor Sie an stdout schreiben.
quelle
In PowerShell scheint dies nicht möglich zu sein. Alle vorherigen Antworten sind nicht korrekt, da sie sich nicht so
Write-Output
verhalten, wie sie sich verhalten, sondern eher so, wieWrite-Host
sie dieses Problem sowieso nicht haben.Die Closes-Lösung scheint
Write-Host
mit dem-NoNewLine
Parameter zu arbeiten. Sie können dies nicht weiterleiten, was im Allgemeinen ein Problem darstellt. Es gibt jedoch eine Möglichkeit, diese Funktion zu überschreiben, wie unter Write-Host => Export in eine Datei beschrieben , sodass Sie den Parameter für eine Ausgabedatei problemlos akzeptieren können. Dies ist noch lange keine gute Lösung. MitStart-Transcript
dieser mehr verwendbar ist, aber das Cmdlet hat Probleme mit nativen Anwendungen.Write-Output
kann im allgemeinen Kontext einfach nicht das tun, was Sie brauchen.quelle
Write-Host
ist schrecklich, ein Zerstörer der Welten, aber Sie können es nur verwenden, um einem Benutzer den Fortschritt währendWrite-Output
der Protokollierung anzuzeigen (nicht, dass das OP um Protokollierung gebeten hat).quelle
Write-Progress
.Sie können PowerShell einfach nicht dazu bringen, diese lästigen Zeilenumbrüche wegzulassen ... Es gibt kein Skript oder Cmdlet, das dies tut. Natürlich ist Write-Host absoluter Unsinn, weil man nicht umleiten / weiterleiten kann!
Trotzdem können Sie Ihre eigene EXE-Datei schreiben, um dies zu tun. Dies habe ich in der Frage zum Stapelüberlauf erläutert. So geben Sie etwas in PowerShell aus .
quelle
Die Antwort von Shufler ist richtig. Anders ausgedrückt: Anstatt die Werte mit dem ARRAY-FORMULAR an Write-Output zu übergeben,
oder das Äquivalent durch mehrere Aufrufe von Write-Output,
Verketten Sie Ihre Komponenten zuerst zu einem STRING VARIABLE:
Dies verhindert die Zwischen-CRLFs, die durch mehrmaliges Aufrufen von Write-Output (oder ARRAY FORM) verursacht werden, unterdrückt jedoch natürlich nicht die endgültige CRLF des Write-Output-Commandlets. Dazu müssen Sie Ihr eigenes Commandlet schreiben, eine der anderen hier aufgeführten komplizierten Problemumgehungen verwenden oder warten, bis Microsoft die
-NoNewline
Option für Write-Output unterstützt.Ihr Wunsch, der Konsole eine Textfortschrittsanzeige (dh "....") zur Verfügung zu stellen, anstatt in eine Protokolldatei zu schreiben, sollte auch mit Write-Host erfüllt werden. Sie können beides erreichen, indem Sie den Nachrichtentext in einer Variablen zum Schreiben in das Protokoll sammeln UND mit Write-Host den Fortschritt für die Konsole bereitstellen. Diese Funktionalität kann für die bestmögliche Wiederverwendung von Code in Ihrem eigenen Commandlet kombiniert werden.
quelle
Write-Output
. Sie können ihn einfach nicht sehen, da er als letztes geschrieben wurde. Angemessene Problemumgehung, aber keine Lösung. Möglicherweise verbraucht die resultierende Ausgabe etwas, das den nachfolgenden Zeilenumbruch nicht verarbeiten kann.Im Folgenden wird der Cursor wieder am Anfang der vorherigen Zeile platziert. Es liegt an Ihnen, es in der richtigen horizontalen Position zu platzieren (mit $ pos.X seitwärts zu bewegen):
Ihre aktuelle Ausgabe ist 27 Leerzeichen höher , sodass $ pos.X = 27 möglicherweise funktioniert.
quelle
$pos.X
auch tun . Das Problem ist, dass beim Weiterleiten an eine Datei zwei separate Zeilen angezeigt werden.Es mag nicht besonders elegant sein, aber es macht genau das, was OP verlangt hat. Beachten Sie, dass die ISE mit StdOut in Konflikt gerät, sodass keine Ausgabe erfolgt. Damit dieses Skript funktioniert, kann es nicht innerhalb der ISE ausgeführt werden.
quelle
[System.Console]
kann nicht in eine Datei umgeleitet werden.Ich habe betrogen, aber ich glaube, dies ist die einzige Antwort, die alle Anforderungen erfüllt. Dies vermeidet nämlich die nachfolgende CRLF, bietet einen Platz für den anderen Vorgang, der in der Zwischenzeit abgeschlossen werden kann, und leitet bei Bedarf ordnungsgemäß zu stdout um.
quelle
quelle
Gewünschtes O / P: Aktivieren der Funktion XYZ ...... Fertig
Sie können den folgenden Befehl verwenden
$ a = "Funktion XYZ aktivieren"
Schreibausgabe "$ a ...... Done"
Sie müssen Variablen und Anweisungen in Anführungszeichen setzen. hoffe das ist hilfreich :)
Danke Techiegal
quelle
Hier gibt es bereits so viele Antworten, dass hier niemand nach unten scrollen wird. Auf jeden Fall gibt es auch eine Lösung, um Text ohne neue Zeile am Ende zu schreiben:
Dateiausgabe mit Codierung:
Konsolenausgabe:
quelle
Sie können dies absolut tun. Write-Output hat ein Flag namens " NoEnumerate ", das im Wesentlichen dasselbe ist.
quelle