about_Redirection
Kurze Beschreibung
Erläutert, wie Sie die Ausgabe von PowerShell in Textdateien umleiten.
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 in eine Textdatei umleiten und die Fehlerausgabe an den regulären Ausgabestream 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 seine Parameter wieEncoding
, ,Force
Width
oderNoClobber
verwenden müssen.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. Die Verwendung des Umleitungsoperators mit einem Dateiziel entspricht funktional der Piping an
Out-File
ohne zusätzliche Parameter.
Weitere Informationen zu Streams finden Sie unter about_Output_Streams.
Umleitungsfähige Ausgabeströme
PowerShell unterstützt die Umleitung der folgenden Ausgabedatenströme.
Stream # | BESCHREIBUNG | Eingeführt in | Cmdlet schreiben |
---|---|---|---|
1 | Erfolgreiche Stream | PowerShell 2.0 | Write-Output |
2 | Fehler Stream | PowerShell 2.0 | Write-Error |
3 | Warnungs-Stream | PowerShell 3.0 | Write-Warning |
4 | Ausführliche Stream | PowerShell 3.0 | Write-Verbose |
5 | Debuggen Stream | PowerShell 3.0 | Write-Debug |
6 | Stream | PowerShell 5.0 | Write-Information |
* | Alle Streams | PowerShell 3.0 |
Es gibt auch einen Statusstream in PowerShell, der jedoch keine Umleitung unterstützt.
Wichtig
Die Datenströme "Erfolg" und "Fehler" ähneln den Stdout- und stderr-Streams anderer Shells. Stdin ist jedoch für die Eingabe nicht mit der PowerShell-Pipeline verbunden.
PowerShell-Umleitungsoperatoren
Die PowerShell-Umleitungsoperatoren sind wie folgt, wobei n
die Streamnummer darstellt. Der Success-Stream ( 1
) ist die Standardeinstellung, wenn kein Stream angegeben wird.
Operator | BESCHREIBUNG | Syntax |
---|---|---|
> |
Senden Sie den angegebenen Stream an eine Datei. | n> |
>> |
Fügen Sie den angegebenen Stream an eine Datei an. | n>> |
>&1 |
Leitet den angegebenen Stream an den Success-Stream um. | n>&1 |
Hinweis
Im Gegensatz zu einigen Unix-Shells können Sie nur andere Streams an den Success-Stream umleiten.
Beispiele
Beispiel 1: Umleitung von Fehlern und Ausgabe in eine Datei
Dieses Beispiel wird für ein Element ausgeführt, das erfolgreich und ein Element mit einem Fehler ausgeführt dir
wird.
dir 'C:\', 'fakepath' 2>&1 > .\dir.log
Es wird verwendet 2>&1
, um den Fehlerdatenstrom an den Success-Stream umzuleiten und >
den resultierenden Success-Stream an eine Datei namens zu senden. dir.log
Beispiel 2: Senden aller Erfolgsdatenstromdaten an eine Datei
In diesem Beispiel werden alle Success-Streamdaten an eine Datei namens gesendet script.log
.
.\script.ps1 > script.log
Beispiel 3: Senden von Erfolgs-, Warnungs- und Fehlerdatenströmen an eine Datei
Dieses Beispiel zeigt, 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 Stream "Erfolg" um.2>&1
Leitet den Fehlerdatenstrom an den Success-Stream um (der jetzt auch alle Warnungsdaten enthält)>
Leitet den Success-Stream (der jetzt sowohl Warnungs- als auch Fehlerdatenströme enthält) an eine Datei mit dem NamenC:\temp\redirection.log
) um.
Beispiel 4: Umleitung aller Streams in eine Datei
In diesem Beispiel werden alle Datenströme von einem Skript mit dem Namen script.ps1
an eine Datei mit dem Namen gesendet. script.log
.\script.ps1 *> script.log
Beispiel 5: Unterdrücken aller Write-Host- und Informationsstreamdaten
In diesem Beispiel werden alle Daten des Informationsstreams unterdrückt. Weitere Informationen zu Cmdlets für Informationsstreams finden Sie unter Write-Host und Write-Information.
&{
Write-Host "Hello"
Write-Information "Hello" -InformationAction Continue
} 6> $null
Beispiel 6: Anzeigen der Wirkung von Aktionseinstellungen
Aktionseinstellungsvariablen und -parameter können ändern, was in einen bestimmten Stream geschrieben wird. Das Skript in diesem Beispiel zeigt, wie sich der Wert von $ErrorActionPreference
darauf auswirkt, was in den Fehlerstream geschrieben wird.
$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
auf Inquire
festgelegt ist.
PS C:\temp> .\test.ps1
Confirm
Cannot find path 'C:\not-here' because it does not 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
Hinweise
Die Umleitungsoperatoren, die keine Daten (>
und n>
) anfügen, überschreiben den aktuellen Inhalt der angegebenen Datei ohne Warnung.
Wenn die Datei jedoch eine schreibgeschützte, ausgeblendete oder Systemdatei ist, schlägt die Umleitung fehl. Die Anfügeumleitungsoperatoren (>>
und n>>
) schreiben nicht in eine schreibgeschützte Datei, sondern fügen Inhalt an eine Systemdatei oder eine ausgeblendete Datei an.
Um die Umleitung von Inhalten in eine schreibgeschützte, ausgeblendete oder Systemdatei zu erzwingen, verwenden Sie das Cmdlet mit seinem Out-File
Force
Parameter.
Wenn Sie in Dateien schreiben, verwenden UTF8NoBOM
die Umleitungsoperatoren die Codierung. Wenn die Datei eine andere Codierung aufweist, wird die Ausgabe möglicherweise nicht ordnungsgemäß formatiert. Um in Dateien mit einer anderen Codierung zu schreiben, verwenden Sie das Out-File
Cmdlet mit seinem Encoding
Parameter.
Breite der Ausgabe beim Schreiben in eine Datei
Wenn Sie mit Out-File
einem oder den Umleitungsoperatoren in eine Datei schreiben, formatiert PowerShell die Tabellenausgabe in die Datei basierend auf der Breite der Konsole, in der sie ausgeführt wird. Bei instance wird die Ausgabe in der Datei mit einem Befehl wie Get-ChildItem Env:\Path > path.log
auf einem System, in dem die Konsolenbreite auf 80 Spalten festgelegt ist, die Ausgabe in der Datei auf 80 Zeichen gekürzt:
Name Value
---- -----
Path C:\Program Files\PowerShell\7-preview;C:\WINDOWS…
In Anbetracht der Tatsache, dass die Konsolenbreite auf Systemen, auf denen Ihr Skript ausgeführt wird, beliebig festgelegt werden kann, können Sie die Ausgabe der PowerShell-Formattabelle auf Dateien basierend auf einer stattdessen 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 hinzufügen -Width 2000
zu müssen, 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 für Out-File
sind, 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 Ihres Skripts, um für das gesamte Skript festzulegen Out-File:Width
:
$PSDefaultParameterValues['out-file:width'] = 2000
Wenn Sie die Ausgabebreite erhöhen, erhöht sich der Arbeitsspeicherverbrauch beim Protokollieren von tabellenformatierten Ausgaben. Wenn Sie viele tabellarische Daten in der Datei protokollieren und wissen, dass Sie mit einer kleineren Breite auskommen können, verwenden Sie die kleinere Breite.
In einigen Fällen, z. B Get-Service
. der Ausgabe, müssen Sie die Ausgabe vor der Ausgabe an die Datei übergeben Format-Table -AutoSize
, um die zusätzliche Breite zu verwenden.
$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
Weitere Informationen zu $PSDefaultParameterValues
finden Sie unter about_Preference_Variables.
Potenzielle Verwirrung mit Vergleichsoperatoren
Der >
Operator ist nicht mit dem Vergleichsoperator Größer als zu verwechseln (häufig wie >
in anderen Programmiersprachen bezeichnet).
Abhängig von den zu vergleichenden Objekten kann die Ausgabe mit >
korrekt 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 feststellen, dass eine Datei namens 42
mit dem Inhalt 36
geschrieben wurde.
PS> dir
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 1/02/20 10:10 am 3 42
PS> cat 42
36
Der Versuch, den umgekehrten Vergleich <
(kleiner als) zu verwenden, führt zu einem Systemfehler:
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 unter operator -gt
in about_Comparison_Operators.