it-swarm.com.de

So geben Sie etwas in PowerShell aus

Ich führe ein PowerShell-Skript aus einer Batchdatei aus. Das Skript ruft eine Webseite ab und prüft, ob der Inhalt der Seite die Zeichenfolge "OK" enthält.

Das PowerShell-Skript gibt eine Fehlerstufe an das Stapelskript zurück.

Das Batch-Skript wird von ScriptFTP , einem FTP-Automatisierungsprogramm, ausgeführt. Wenn ein Fehler auftritt, kann ScriptFTP die vollständige Konsolenausgabe per E-Mail an den Administrator senden.

Im PowerShell-Skript möchte ich den Rückgabewert von der Website ausgeben, wenn er nicht "OK" ist, sodass die Fehlermeldung in der Konsolenausgabe und somit in der Status-Mail enthalten ist.

Ich bin neu in PowerShell und nicht sicher, welche Ausgabefunktion ich dafür verwenden soll. Ich kann drei sehen:

  • Schreib-Host
  • Schreib-Ausgabe
  • Schreibfehler

Was wäre das Richtige, um auf das Windows-Äquivalent von stdout zu schreiben?

192
Pekka 웃

Einfach etwas auszugeben ist PowerShell eine Sache der Schönheit - und eine seiner größten Stärken. Zum Beispiel die gemeinsame Hallo, Welt! Anwendung wird auf eine einzelne Zeile reduziert:

"Hello, World!"

Es erstellt ein Zeichenfolgenobjekt, weist den oben genannten Wert zu und ruft als letztes Element in der Befehlspipeline die Methode .toString() auf und gibt das Ergebnis an STDOUT aus (standardmäßig). Eine Sache der Schönheit.

Die anderen Write-* - Befehle sind spezifisch für die Ausgabe des Texts in die zugehörigen Streams und haben ihren Platz als solcher.

186
Goyuix

Ich denke, in diesem Fall benötigen Sie Write-Output .

Wenn Sie ein Skript wie haben

Write-Output "test1";
Write-Host "test2";
"test3";

wenn Sie dann das Skript mit umgeleiteter Ausgabe aufrufen, etwa yourscript.ps1 > out.txt, wird test2 auf dem Bildschirm test1\ntest3\n in der Datei "out.txt" angezeigt.

Beachten Sie, dass "test3" und die Write-Output-Zeile immer eine neue Zeile an Ihren Text anhängen und PowerShell dies nicht stoppen kann (d. H., echo -n Ist in PowerShell mit den nativen Befehlen nicht möglich). Wenn Sie (die etwas grundlegende und einfache in Bash ) Funktionalität von echo -n Wollen, dann sehen Sie samthebest's answer .

Wenn in einer Batchdatei ein PowerShell-Befehl ausgeführt wird, wird höchstwahrscheinlich der Befehl Write-Output erfasst. Ich habe "lange Diskussionen" mit Systemadministratoren darüber geführt, was auf die Konsole geschrieben werden soll und was nicht. Wir haben uns jetzt darauf geeinigt, dass die einzige Information, wenn das Skript erfolgreich ausgeführt wurde oder gestorben ist, Write-Host Sein muss und alles, was der Autor des Skripts wissen muss, über die Ausführung (welche Elemente wurden aktualisiert, welche Felder waren) set, et cetera) wechselt zu Write-Output. Wenn Sie ein Skript an den Systemadministrator senden, kann dieser auf diese Weise auf einfache Weise runthescript.ps1 >someredirectedoutput.txt Und auf dem Bildschirm sehen, ob alles in Ordnung ist. Senden Sie dann die "someredirectedoutput.txt" an die Entwickler zurück.

117
naivists

Ich denke, das Folgende ist eine gute Ausstellung von Echo vs. Write-Host . Beachten Sie, wie test () tatsächlich ein Array von ints zurückgibt, nicht ein einziges int, wie man leicht glauben könnte.

function test {
    Write-Host 123
    echo 456 # AKA 'Write-Output'
    return 789
}

$x = test

Write-Host "x of type '$($x.GetType().name)' = $x"

Write-Host "`$x[0] = $($x[0])"
Write-Host "`$x[1] = $($x[1])"

Terminal-Ausgang der oben genannten:

123
x of type 'Object[]' = 456 789
$x[0] = 456
$x[1] = 789
8
user2426679

Sie können jede dieser Optionen in Ihrem Szenario verwenden, da sie in die Standarddatenströme (Ausgabe und Fehler) schreiben. Wenn Sie die Ausgabe an ein anderes Commandlet weiterleiten, möchten Sie Write-Output verwenden, das schließlich mit Write-Host endet.

Dieser Artikel beschreibt die verschiedenen Ausgabeoptionen: PowerShell O ist für die Ausgabe

7
GrayWizardx
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta

Magenta kann einer der "System.ConsoleColor" -Enumeratorwerte sein - Schwarz, Dunkelblau, Dunkelgrün, DunkelCyan, DunkelRot, DunkelMagenta, DunkelGelb, Grau, DunkelGrau, Blau, Grün, Cyan, Rot, Magenta, Gelb, Weiß.

Das + $File.FullName ist optional und zeigt, wie eine Variable in den String eingefügt wird.

2
jordan

Sie können PowerShell einfach nicht dazu bringen, diese lästigen Zeilenumbrüche zu ignorieren. Es gibt kein Skript oder Cmdlet, das dies ausführt.

Natürlich ist Write-Host ein absoluter Quatsch, weil Sie nicht umleiten können! Sie müssen einfach Ihre eigenen schreiben:

using System;

namespace WriteToStdout
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args != null)
            {
                Console.Write(string.Join(" ", args));
            }
        }
    }
}

Z.B.

PS C:\> writetostdout finally I can write to stdout like echo -n
finally I can write to stdout like echo -nPS C:\>
2
samthebest