about_Redirection

Kurze Beschreibung

Erläutert, wie Die Ausgabe von PowerShell zu Textdateien umgeleitet wird.

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 Sie können 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 dessen Parameter verwenden müssen, z. B. die EncodingParameter , , ForceWidthoder NoClobber 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 Weiterleitung Out-File ohne zusätzliche Parameter.

Weitere Informationen zu Datenströmen 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 Erfolgsstream PowerShell 2.0 Write-Output
2 Fehlerdatenstrom PowerShell 2.0 Write-Error
3 Warnungsstream PowerShell 3.0 Write-Warning
4 Ausführlicher Stream PowerShell 3.0 Write-Verbose
5 Debuggen von Stream PowerShell 3.0 Write-Debug
6 Informationsdatenstrom PowerShell 5.0 Write-Information, Write-Host
* 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 ist.

Operator Description Syntax
> Senden des angegebenen Datenstroms an eine Datei. n>
>> Fügen Sie den 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 Streams an den Success Stream umleiten.

Beispiele

Beispiel 1: Umleitungsfehler und Ausgabe in eine Datei

In diesem Beispiel wird ein Element ausgeführt dir , das erfolgreich ist, und eines, das fehlschlägt.

dir C:\, fakepath 2>&1 > .\dir.log

Es wird verwendet2>&1, um den Fehlerdatenstrom an den Erfolgsdatenstrom umzuleiten und > den resultierenden Erfolgsdatenstrom an eine Datei zu senden, die aufgerufen wird.dir.log

Beispiel 2: Senden aller Erfolgsdatenstromdaten an eine Datei

In diesem Beispiel werden alle Erfolgsdatenstromdaten an eine Datei mit dem Namen gesendet script.log.

.\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 weiter.
  • 2>&1leitet den Fehlerdatenstrom an den Erfolgsdatenstrom weiter (der jetzt auch alle Warnungsdaten enthält)
  • >leitet den Erfolgsdatenstrom (der jetzt sowohl Warnungs- als auch Fehlerdatenströme enthält) an eine Datei weiter, die aufgerufen wirdC:\temp\redirection.log.

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 Datenstroms "Write-Host" und "Information"

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 der Auswirkung 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, wenn $ErrorActionPreference diese Einstellung Inquirefestgelegt ist.

PS C:\temp> .\test.ps1

Confirm
Can't find path 'C:\not-here' because it doesn't 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 es sich bei der Datei jedoch um eine schreibgeschützte, ausgeblendete oder Systemdatei handelt, 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, ist die Ausgabe möglicherweise nicht ordnungsgemäß formatiert. Verwenden Sie das Out-File Cmdlet mit seinem Encoding Parameter, um in Dateien mit einer anderen Codierung zu schreiben.

Breite der Ausgabe beim Schreiben in eine Datei

Wenn Sie eine Datei mit einem Out-File oder den Umleitungsoperatoren schreiben, formatiert PowerShell die Tabellenausgabe in die Datei basierend auf der Breite der Konsole, in der sie ausgeführt wird. Wenn z. B. die Tabellenausgabe 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;C:\WINDOWS…

In Anbetracht der Tatsache, dass die Konsolenbreite auf Systemen, auf denen Ihr Skript ausgeführt wird, beliebig festgelegt werden kann, sollten Sie die Ausgabe der PowerShell-Formattabelle auf Dateien basierend auf einer von Ihnen 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 hinzuzufügen -Width 2000 , 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 sind Out-File, 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 Sie die Ausgabebreite erhöhen, wird der Arbeitsspeicherverbrauch beim Protokollieren der formatierten Ausgabe der Tabelle erhöht. Wenn Sie viele Tabellendaten in eine 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 vor der Ausgabe Format-Table -AutoSize in die Datei weiterführen.

$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log

Weitere Informationen $PSDefaultParameterValuesfinden Sie unter about_Preference_Variables.

Umleiten von Binärdaten

PowerShell unterstützt die Umleitung von Binärdaten nicht. Wenn Sie Bytestreamdaten umleiten, behandelt PowerShell die Daten als Zeichenfolgen. Diese Umleitung führt zu beschädigten Daten.

Potenzielle Verwirrung mit Vergleichsoperatoren

Der > Operator ist nicht mit dem Größer-als-Vergleichsoperator zu verwechseln (häufig als > in anderen Programmiersprachen bezeichnet).

Je nachdem, welche Objekte verglichen werden, kann die Ausgabe > richtig 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 sehen, dass eine aufgerufene 42 Datei mit dem Inhalt 36geschrieben wurde.

PS> dir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          1/02/20  10:10 am              3 42

PS> cat 42
36

Beim Versuch, den Umgekehrten Vergleich < (kleiner als) zu verwenden, wird ein Systemfehler zurückgegeben:

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 im -gt Operator in about_Comparison_Operators.

Weitere Informationen