about_Redirection
Kurze Beschreibung
Erläutert, wie Sie die Ausgabe von PowerShell zu Textdateien umleiten.
Lange Beschreibung
Standardmäßig sendet PowerShell Ausgabe an den PowerShell-Host. Normalerweise ist dies die Konsolenanwendung. Sie können die Ausgabe jedoch in eine Textdatei umleiten und die Fehlerausgabe in den regulären Ausgabestrom 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. Die Verwendung des Umleitungsoperators mit einem Dateiziel entspricht funktionell der Rohrleitung ohne
Out-File
zusätzliche Parameter.
Weitere Informationen zu Streams finden Sie unter about_Output_Streams.
Umleitungsfähige Ausgabeströme
PowerShell unterstützt die Umleitung der folgenden Ausgabeströme.
Bach # | BESCHREIBUNG | Eingeführt in | Cmdlet "Schreiben" |
---|---|---|---|
1 | Erfolg Bach | PowerShell 2.0 | Write-Output |
2 | Fehler Bach | PowerShell 2.0 | Write-Error |
3 | Warnung Bach | PowerShell 3.0 | Write-Warning |
4 | Wortreich Bach | PowerShell 3.0 | Write-Verbose |
5 | Debuggen Bach | PowerShell 3.0 | Write-Debug |
6 | Information Bach | PowerShell 5.0 | Write-Information |
* | 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 wird.
Operator | BESCHREIBUNG | Syntax |
---|---|---|
> |
Senden des angegebenen Datenstroms an eine Datei. | n> |
>> |
Fügen Sie 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 Datenströme an den Erfolgsdatenstrom umleiten.
Beispiele
Beispiel 1: Umleiten von Fehlern und Ausgabe zu einer Datei
In diesem Beispiel wird ein Element ausgeführt, das erfolgreich ist dir
und ein Fehler auftritt.
dir 'C:\', 'fakepath' 2>&1 > .\dir.log
Es wird verwendet 2>&1
, um den Fehlerdatenstroman den Erfolgsdatenstrom umzuleiten und >
den resultierenden Erfolgsdatenstrom an eine Datei mit dem Namen "Erfolg" zu senden. dir.log
Beispiel 2: Senden aller Erfolgsdatendaten an eine Datei
In diesem Beispiel werden alle Erfolgsdatenstromdaten an eine Datei gesendet, die aufgerufen script.log
wird.
.\script.ps1 > script.log
Beispiel 3: Senden von Erfolgs-, Warnungs- und Fehlerdatenströme 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 (die jetzt auch alle Warnungsdaten enthält)>
leitet den Erfolgsdatenstrom (der jetzt sowohl Warnungs - als auchFehlerstreams ) an eine Datei mit dem NamenC:\temp\redirection.log
" ) umgeleitet wird.
Beispiel 4: Umleiten aller Datenströme in eine Datei
In diesem Beispiel werden alle Datenströme von 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 Stream 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 ist Inquire
.
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>
) ü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 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 über eine andere Codierung verfügt, wird die Ausgabe möglicherweise nicht ordnungsgemäß formatiert. Um 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 in eine Datei schreiben, die entweder oder die Umleitungsoperatoren verwendet Out-File
, formatiert PowerShell die Tabellenausgabe für die Datei basierend auf der Breite der Konsole, in der sie ausgeführt wird. Wenn beispielsweise die Protokollierung der Tabellenausgabe mit einem Befehl wie Get-ChildItem Env:\Path > path.log
in einem System, 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…
Wenn Sie berücksichtigen, dass die Konsolenbreite beliebig auf Systemen festgelegt werden kann, in denen Ihr Skript ausgeführt wird, bevorzugen Sie möglicherweise, dass die PowerShell-Formattabellenausgabe auf Dateien basierend auf einer breite, die Sie stattdessen angeben.
Das Out-File
Cmdlet bietet einen Width-Parameter , mit dem Sie die Breite festlegen können, die Sie für die Tabellenausgabe wünschen. -Width 2000
Anstatt überall hinzuzufügen, wo Sie Out-File
aufrufen, können Sie die $PSDefaultParameterValues
Variable verwenden, um diesen Wert für alle Verwendungen des Out-File
Cmdlets in einem Skript festzulegen. Und da die Umleitungsoperatoren (>
und >>
) effektiv Aliase Out-File
für das gesamte Skript festlegen, wirkt sich auch auf die Out-File:Width
Formatierungsbreite für die Umleitungsoperatoren aus. Fügen Sie den folgenden Befehl am oberen Rand Ihres Skripts ein, um für das gesamte Skript festzulegen Out-File:Width
:
$PSDefaultParameterValues['out-file:width'] = 2000
Die Erhöhung der Ausgabebreite erhöht den Speicherverbrauch beim Protokollieren der formatierten Ausgabe. Wenn Sie eine Menge tabellarischer Daten in die Datei protokolliert haben und Sie 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 durchlaufen Format-Table -AutoSize
, bevor Sie in die Datei ausgegeben werden.
$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 darf nicht mit dem Vergleichsoperator verwechselt werden (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.