Share via


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 das Out-File Cmdlet, wenn Sie seine Parameter wie Encoding, , ForceWidthoder NoClobber 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 Namen C:\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 Inquirefestgelegt 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-FileForce 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-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 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 $PSDefaultParameterValuesfinden 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 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 -lt ist und -gt verwendet werden soll. Weitere Informationen finden Sie unter operator -gt in about_Comparison_Operators.

Weitere Informationen