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 das Out-File Cmdlet, wenn Sie dessen Parameter verwenden müssen, z. B. die EncodingParameter , ForceWidth, oder 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 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.logwird.

.\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>&1leitet 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 Namen C:\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-Fileaufrufen, 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-Filefü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 $PSDefaultParameterValuesSie 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 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