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 das Out-File Cmdlet, wenn Sie seine Parameter verwenden müssen, z. B. die EncodingParameter , ForceWidthdie Parameter , oder NoClobber 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.loggesendet.

.\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 namens C:\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 Inquireist.

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-FileEncoding 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-Filesind, 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 $PSDefaultParameterValuesSie 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 36geschrieben 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.

Siehe auch