about_Redirection

Kurze Beschreibung

Erläutert, wie Die Ausgabe von PowerShell zu Textdateien umgeleitet wird.

Lange Beschreibung

Standardmäßig sendet PowerShell die Ausgabe an den PowerShell-Host. In der Regel ist dies die Konsolenanwendung. Sie können die Ausgabe jedoch an eine Textdatei umleiten, und Sie können die Fehlerausgabe an den regulären Ausgabedatenstrom umleiten.

Sie können die folgenden Methoden verwenden, um die Ausgabe umzuleiten:

  • Verwenden Sie das Out-File Cmdlet, das die Befehlsausgabe an eine Textdatei sendet. In der Regel verwenden Sie das Out-File Cmdlet, wenn Sie dessen Parameter verwenden müssen, z. B. die EncodingParameter , , ForceWidthoder NoClobber parameter.

  • Verwenden Sie das Tee-Object Cmdlet, das die Befehlsausgabe an eine Textdatei sendet und sie dann an die Pipeline sendet.

  • Verwenden Sie die PowerShell-Umleitungsoperatoren. Das Umleiten der Ausgabe eines PowerShell-Befehls (Cmdlets, Funktion, Skripts) mithilfe des Umleitungsoperators (>) entspricht funktionell der Weiterleitung ohne Out-File zusätzliche Parameter. PowerShell 7.4 hat das Verhalten des Umleitungsoperators geändert, wenn der Stdout-Datenstrom eines systemeigenen Befehls umgeleitet wird.

Weitere Informationen zu Datenströmen finden Sie unter about_Output_Streams.

Umleitungsfähige Ausgabedatenströme

PowerShell unterstützt die Umleitung der folgenden Ausgabedatenströme.

Stream # Beschreibung Eingeführt in Cmdlet schreiben
1 Erfolgsstream PowerShell 2.0 Write-Output
2 Fehlerdatenstrom PowerShell 2.0 Write-Error
3 Warnungsstream PowerShell 3.0 Write-Warning
4 Ausführlicher Stream PowerShell 3.0 Write-Verbose
5 Debuggen von Stream PowerShell 3.0 Write-Debug
6 Informationsdatenstrom PowerShell 5.0 Write-Information, Write-Host
* Alle Datenströme PowerShell 3.0

Es gibt auch einen Statusdatenstrom in PowerShell, unterstützt jedoch keine Umleitung.

Wichtig

Die Datenströme "Erfolg" und "Fehler " ähneln den Stdout- und Stderr-Streams anderer Shells. Stdin ist jedoch nicht mit der PowerShell-Pipeline für eingaben verbunden.

PowerShell-Umleitungsoperatoren

Die PowerShell-Umleitungsoperatoren sind wie folgt, wobei n die Datenstromnummer dargestellt wird. Der Erfolgsdatenstrom ( 1 ) ist die Standardeinstellung, wenn kein Datenstrom angegeben ist.

Operator Description Syntax
> Senden des angegebenen Datenstroms an eine Datei. n>
>> Fügen Sie den angegebenen Datenstrom an eine Datei an . n>>
>&1 Leitet den angegebenen Datenstrom an den Erfolgsdatenstrom um. n>&1

Hinweis

Im Gegensatz zu einigen Unix-Shells können Sie nur andere Streams an den Success Stream umleiten.

Umleiten der Ausgabe von systemeigenen Befehlen

PowerShell 7.4 hat das Verhalten der Umleitungsoperatoren geändert, wenn sie zum Umleiten des Stdout-Datenstroms eines systemeigenen Befehls verwendet werden. Die Umleitungsoperatoren behalten nun die Bytestreamdaten bei, wenn die Ausgabe von einem systemeigenen Befehl umgeleitet wird. PowerShell interpretiert die umgeleiteten Daten nicht oder fügt keine zusätzliche Formatierung hinzu. Weitere Informationen finden Sie unter Beispiel Nr. 7.

Beispiele

Beispiel 1: Umleitungsfehler und Ausgabe in eine Datei

In diesem Beispiel wird ein Element ausgeführt dir , das erfolgreich ist, und eines, das fehlschlägt.

dir C:\, fakepath 2>&1 > .\dir.log

Es wird verwendet2>&1, um den Fehlerdatenstrom an den Erfolgsdatenstrom umzuleiten und > den resultierenden Erfolgsdatenstrom an eine Datei zu senden, die aufgerufen wird.dir.log

Beispiel 2: Senden aller Erfolgsdatenstromdaten an eine Datei

In diesem Beispiel werden alle Erfolgsdatenstromdaten an eine Datei mit dem Namen gesendet script.log.

.\script.ps1 > script.log

Beispiel 3: Senden von Erfolgs-, Warnungs- und Fehlerdatenströmen an eine Datei

In diesem Beispiel wird gezeigt, wie Sie Umleitungsoperatoren kombinieren können, um ein gewünschtes Ergebnis zu erzielen.

&{
   Write-Warning "hello"
   Write-Error "hello"
   Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
  • 3>&1 leitet den Warnungsstream an den Erfolgsdatenstrom weiter.
  • 2>&1leitet den Fehlerdatenstrom an den Erfolgsdatenstrom weiter (der jetzt auch alle Warnungsdaten enthält)
  • >leitet den Erfolgsdatenstrom (der jetzt sowohl Warnungs- als auch Fehlerdatenströme enthält) an eine Datei weiter, die aufgerufen wirdC:\temp\redirection.log.

Beispiel 4: Umleiten aller Datenströme zu einer Datei

In diesem Beispiel werden alle Datenströme aus einem Skript gesendet, das an eine Datei aufgerufen script.ps1 wird script.log.

.\script.ps1 *> script.log

Beispiel 5: Unterdrücken aller Datenstroms "Write-Host" und "Information"

In diesem Beispiel werden alle Datenstromdaten des Informationsstroms unterdrückt. Weitere Informationen zu Informationsstream-Cmdlets finden Sie unter Write-Host und Write-Information

&{
   Write-Host "Hello"
   Write-Information "Hello" -InformationAction Continue
} 6> $null

Beispiel 6: Anzeigen der Auswirkung von Aktionseinstellungen

Aktionseinstellungsvariablen und -parameter können ändern, was in einen bestimmten Datenstrom geschrieben wird. Das Skript in diesem Beispiel zeigt, wie sich der Wert $ErrorActionPreference auf den Fehlerdatenstrom auswirkt.

$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
Try {
    get-item /not-here 2>&1 >> log.txt
}
catch {
    "`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Continue'

Wenn wir dieses Skript ausführen, werden wir aufgefordert, wenn $ErrorActionPreference diese Einstellung Inquirefestgelegt ist.

PS C:\temp> .\test.ps1

Confirm
Can't find path 'C:\not-here' because it doesn't exist.
[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
  23 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The running command stopped because the user selected the Stop option.

Wenn wir die Protokolldatei untersuchen, sehen wir Folgendes:

PS C:\temp> Get-Content .\log.txt
Continue

Get-Item: C:\temp\test.ps1:3
Line |
   3 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot find path 'C:\not-here' because it does not exist.

SilentlyContinue
Stop
    Error caught!
Ignore
Inquire

Beispiel 7: Umleiten von Binärdaten aus einem systemeigenen Befehl

Ab PowerShell 7.4 behält PowerShell die Bytestreamdaten bei, wenn der Stdout-Datenstrom eines systemeigenen Befehls an eine Datei umgeleitet wird oder wenn Bytestreamdaten an den Stdin-Datenstrom eines systemeigenen Befehls weitergeleitet werden.

Mit dem nativen Befehl curl können Sie beispielsweise eine Binärdatei herunterladen und mithilfe der Umleitung auf dem Datenträger speichern.

$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'

# native command redirected to a file
curl -s -L $uri > powershell.tar.gz

Sie können die Bytestreamdaten auch an den stdin-Stream eines anderen nativen Befehls übergeben. Im folgenden Beispiel wird eine gezippte TAR-Datei mit curl heruntergeladen. Die heruntergeladenen Dateidaten werden an den tar-Befehl gestreamt, um den Inhalt des Archivs zu extrahieren.

# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .

Sie können auch die Bytestreamausgabe eines PowerShell-Befehls an die Eingabe eines nativen Befehls weiterleiten. Verwenden Sie in den folgenden Beispielen Invoke-WebRequest, um die gleiche TAR-Datei wie im vorherigen Beispiel herunterzuladen.

# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .

# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .

Dieses Feature unterstützt keine Bytestreamdaten beim Umleiten der stderr-Ausgabe an stdout. Wenn Sie die Streams stderr und stdout kombinieren, werden die kombinierten Streams als Zeichenfolgendaten behandelt.

Hinweise

Die Umleitungsoperatoren, die keine Daten anfügen (> und n>) den aktuellen Inhalt der angegebenen Datei ohne Warnung überschreiben.

Wenn es sich bei der Datei jedoch um eine schreibgeschützte, ausgeblendete oder Systemdatei handelt, schlägt die Umleitung fehl. Die Anfügeumleitungsoperatoren (>> und n>>) schreiben nicht in eine schreibgeschützte Datei, sondern fügen Inhalte an ein System oder eine ausgeblendete Datei an.

Um die Umleitung von Inhalten auf eine schreibgeschützte, ausgeblendete oder Systemdatei zu erzwingen, verwenden Sie das Out-File Cmdlet mit seinem Force Parameter.

Wenn Sie in Dateien schreiben, verwenden UTF8NoBOM die Umleitungsoperatoren Codierung. Wenn die Datei eine andere Codierung aufweist, ist die Ausgabe möglicherweise nicht ordnungsgemäß formatiert. Verwenden Sie das Out-File Cmdlet mit seinem Encoding Parameter, um in Dateien mit einer anderen Codierung zu schreiben.

Breite der Ausgabe beim Schreiben in eine Datei

Wenn Sie eine Datei mit einem Out-File oder den Umleitungsoperatoren schreiben, formatiert PowerShell die Tabellenausgabe in die Datei basierend auf der Breite der Konsole, in der sie ausgeführt wird. Wenn z. B. die Tabellenausgabe mit einem Befehl wie Get-ChildItem Env:\Path > path.log in einem System protokolliert wird, in dem die Konsolenbreite auf 80 Spalten festgelegt ist, wird die Ausgabe in der Datei auf 80 Zeichen abgeschnitten:

Name                         Value
----                         -----
Path                         C:\Program Files\PowerShell\7;C:\WINDOWS…

In Anbetracht der Tatsache, dass die Konsolenbreite auf Systemen, auf denen Ihr Skript ausgeführt wird, beliebig festgelegt werden kann, sollten Sie die Ausgabe der PowerShell-Formattabelle auf Dateien basierend auf einer von Ihnen angegebenen Breite bevorzugen.

Das Out-File Cmdlet stellt einen Width-Parameter bereit, mit dem Sie die gewünschte Breite für die Tabellenausgabe festlegen können. Anstatt überall hinzuzufügen -Width 2000 , wo Sie aufrufen Out-File, können Sie die $PSDefaultParameterValues Variable verwenden, um diesen Wert für alle Verwendungen des Out-File Cmdlets in einem Skript festzulegen. Da die Umleitungsoperatoren (> und >>) effektiv Aliase sind Out-File, wirkt sich das Festlegen des Out-File:Width Parameters für das gesamte Skript auch auf die Formatierungsbreite für die Umleitungsoperatoren aus. Platzieren Sie den folgenden Befehl am oberen Rand des Skripts, um für das gesamte Skript festzulegen Out-File:Width :

$PSDefaultParameterValues['out-file:width'] = 2000

Wenn Sie die Ausgabebreite erhöhen, wird der Arbeitsspeicherverbrauch beim Protokollieren der formatierten Ausgabe der Tabelle erhöht. Wenn Sie viele Tabellendaten in eine Datei protokollieren und wissen, dass Sie mit einer kleineren Breite arbeiten können, verwenden Sie die kleinere Breite.

In einigen Fällen, z Get-Service . B. Ausgabe, um die zusätzliche Breite zu verwenden, müssen Sie die Ausgabe vor der Ausgabe Format-Table -AutoSize in die Datei weiterführen.

$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log

Weitere Informationen $PSDefaultParameterValuesfinden Sie unter about_Preference_Variables.

Potenzielle Verwirrung mit Vergleichsoperatoren

Der > Operator ist nicht mit dem Größer-als-Vergleichsoperator zu verwechseln (häufig als > in anderen Programmiersprachen bezeichnet).

Je nachdem, welche Objekte verglichen werden, kann die Ausgabe > richtig erscheinen (da 36 nicht größer als 42 ist).

PS> if (36 > 42) { "true" } else { "false" }
false

Eine Überprüfung des lokalen Dateisystems kann jedoch sehen, dass eine aufgerufene 42 Datei mit dem Inhalt 36geschrieben wurde.

PS> dir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          1/02/20  10:10 am              3 42

PS> cat 42
36

Beim Versuch, den Umgekehrten Vergleich < (kleiner als) zu verwenden, wird ein Systemfehler zurückgegeben:

PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
   1 |  if (36 < 42) { "true" } else { "false" }
     |         ~
     | The '<' operator is reserved for future use.

Wenn der numerische Vergleich der erforderliche Vorgang -lt ist und -gt verwendet werden soll. Weitere Informationen finden Sie im -gt Operator in about_Comparison_Operators.

Weitere Informationen