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 an eine Textdatei umleiten und 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 seine Parameter verwenden müssen, z. B. dieEncoding
Parameter ,Force
Width
die Parameter , oderNoClobber
die Parameter.Verwenden Sie das
Tee-Object
Cmdlet, das die Befehlsausgabe an eine Textdatei sendet, und sendet sie dann an die Pipeline.Verwenden Sie die PowerShell-Umleitungsoperatoren. Die Verwendung des Umleitungsoperators mit einem Dateiziel entspricht funktionell der Leitung
Out-File
ohne zusätzliche Parameter.
Weitere Informationen zu Streams 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 | Erfolg Stream | PowerShell 2.0 | Write-Output |
2 | Fehler Stream | PowerShell 2.0 | Write-Error |
3 | Warnung Stream | PowerShell 3.0 | Write-Warning |
4 | Ausführliche Stream | PowerShell 3.0 | Write-Verbose |
5 | Debuggen Stream | PowerShell 3.0 | Write-Debug |
6 | Informationen Stream | PowerShell 5.0 | Write-Information |
* | Alle Streams | 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 die Eingabe verbunden.
PowerShell-Umleitungsoperatoren
Die PowerShell-Umleitungsoperatoren sind wie folgt, wobei n
die Datenstromnummer dargestellt wird. Der Erfolgsdatenstrom ( 1
) ist der Standardwert, wenn kein Datenstrom angegeben wird.
Operator | BESCHREIBUNG | Syntax |
---|---|---|
> |
Senden des angegebenen Datenstroms an eine Datei. | n> |
>> |
Anfügen des angegebenen Datenstroms an eine Datei. | 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.
Beispiele
Beispiel 1: Umleiten von Fehlern und Ausgabe zu einer Datei
In diesem Beispiel wird ein Element ausgeführt dir
, das erfolgreich ist und ein Fehler auftritt.
dir 'C:\', 'fakepath' 2>&1 > .\dir.log
Es wird verwendet 2>&1
, um den Fehlerdatenstrom an den Erfolgsdatenstrom umzuleiten und >
den resultierenden Erfolgsdatenstrom an eine Datei mit dem Namen "Erfolg" zu senden. dir.log
Beispiel 2: Senden aller Erfolgsdatenstromdaten an eine Datei
In diesem Beispiel werden alle Erfolgsdatenstromdaten an eine Datei mit dem Namen " script.log
gesendet.
.\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 um.2>&1
leitet den Fehlerdatenstrom an den Erfolgsdatenstrom um (der jetzt auch alle Warnungsdaten enthält)>
leitet den Erfolgsdatenstrom (der jetzt sowohl Warn - als auch Fehlerdatenströme enthält) zu einer Datei namensC:\temp\redirection.log
) um.
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 Write-Host- und Informationsdatenstromdaten
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 des Effekts 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, wann $ErrorActionPreference
festgelegt Inquire
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 anfügen (>
und n>
) den aktuellen Inhalt der angegebenen Datei ohne Warnung überschreiben.
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 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, wird die Ausgabe möglicherweise nicht ordnungsgemäß formatiert. Verwenden Sie das Cmdlet mit seinem Out-File
Encoding
Parameter, um in Dateien mit einer anderen Codierung zu schreiben.
Breite der Ausgabe beim Schreiben in eine Datei
Wenn Sie in eine Datei schreiben, die entweder Out-File
oder die Umleitungsoperatoren verwendet, formatiert PowerShell die Tabellenausgabe auf der Grundlage der Breite der Konsole, in der sie ausgeführt wird. Wenn die Tabellenausgabe beispielsweise 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-preview;C:\WINDOWS…
Wenn Sie berücksichtigen, dass die Konsolenbreite beliebig auf Systemen festgelegt werden kann, auf denen Ihr Skript ausgeführt wird, bevorzugen Sie möglicherweise, dass die PowerShell-Formattabellenausgabe auf Dateien basierend auf einer von Ihnen angegebenen Breite verwendet wird.
Das Out-File
Cmdlet stellt einen Width-Parameter bereit, mit dem Sie die Breite festlegen können, die Sie für die Tabellenausgabe wünschen. Anstatt überall hinzuzufügen -Width 2000
, an dem 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 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 des Skripts, um für das gesamte Skript festzulegen Out-File:Width
:
$PSDefaultParameterValues['out-file:width'] = 2000
Wenn die Ausgabebreite erhöht wird, wird der Arbeitsspeicherverbrauch erhöht, wenn die formatierte Ausgabe der Protokollierungstabelle angezeigt wird. Wenn Sie viele tabellenförmige Daten in 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 Format-Table -AutoSize
durchlaufen, bevor Sie in die Datei ausgeben.
$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
Weitere Informationen finden $PSDefaultParameterValues
Sie unter about_Preference_Variables.
Potenzielle Verwirrung mit Vergleichsoperatoren
Der >
Operator ist nicht mit dem Vergleichsoperator "Größer als " zu verwechseln (häufig als >
in anderen Programmiersprachen bezeichnet).
Je nachdem, welche Objekte verglichen werden, kann die Ausgabe mit >
der Verwendung korrekt sein (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 Datei 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 ist und -lt
-gt
verwendet werden soll. Weitere Informationen finden Sie im -gt
Operator in about_Comparison_Operators.