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 dasOut-File
Cmdlet, wenn Sie dessen Parameter verwenden müssen, z. B. dieEncoding
Parameter , ,Force
Width
oderNoClobber
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 ohneOut-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>&1
leitet 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 Inquire
festgelegt 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 $PSDefaultParameterValues
finden 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 36
geschrieben 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.