PowerShell Write to File: "Out-File" und Dateiausgabetechniken
Nov 21, 2024
Die PowerShell-Ausgabe erfolgt standardmäßig auf die Konsole, aber Sie können Ergebnisse umleiten, um sie in Dateien für Protokollierung, Berichterstattung, Automatisierung oder Fehlerbehebung zu speichern. Das Cmdlet Out-File bietet vollständige Kontrolle über Kodierung, Zeilenbreite und Überschreibverhalten, während Umleitungsoperatoren (>, >>) schneller für einfache Aufgaben sind. Alternativen wie Set-Content, Add-Content, oder sogar Export-Csv/ConvertTo-Json sind besser, wenn Sie strukturierte Daten benötigen. Verwenden Sie -Append , -NoClobber, Test-Path, und Fehlerumleitung (2>, 3>) um Logs sicher zu verwalten.
Einführung in die Ausgabe in PowerShell
Jeder, der mit PowerShell vertraut ist, weiß, dass die Ausgabe von PowerShell-Befehlen standardmäßig im Terminal angezeigt wird. Es kann jedoch Situationen geben, in denen man die Ausgabe umleiten oder in einer Datei speichern möchte.
- Befehle können eine große Menge an Daten zurückgeben, die in Echtzeit schwer zu handhaben sind. Sie können diese Daten umleiten oder speichern, um sie nach Belieben zu verarbeiten oder zu überprüfen.
- Um die Ergebnisse eines Befehls in einem anderen Prozess oder Skript zu verwenden, können Sie den PowerShell-Befehl zur Ausgabe in eine Datei verwenden, um die Ausgabe in einer Datei oder Variablen zu speichern und so leicht wiederverwenden zu können.
- Geplante Aufgaben oder andere automatisierte Prozesse laufen normalerweise oft im Hintergrund. Da Sie die Ausgabe nicht in Echtzeit sehen können, ermöglicht das Speichern Ihnen, diese später zu überprüfen.
- Manchmal kann die Ausgabe mehr Informationen enthalten, als Sie benötigen. Sie können sie daher umleiten oder speichern, um sie zu filtern und zu formatieren.
- Wenn Sie Befehle auf entfernten Systemen ausführen, haben Sie möglicherweise keinen Zugriff auf die Konsole, um die Ausgabe in Echtzeit zu sehen. Das Speichern oder Umleiten bietet Ihnen einen Nachweis darüber, was auf dem entfernten System passiert ist.
- Organisationen erstellen Berichte basierend auf Systemzuständen, Konfigurationen oder Leistungskennzahlen. Mit PowerShell können sie Systemdaten abfragen, Berichte generieren und diese zur zukünftigen Überprüfung in eine Datei ausgeben.
- PowerShell kann verwendet werden, um Hardware- und Softwareinventarinformationen für Asset-Management und Compliance zu sammeln. Diese Daten können dann in eine Datei ausgegeben werden, um die Sichtbarkeit zu erhöhen und das Management zu vereinfachen.
- Beim Automatisieren von Aufgaben ist es wesentlich, die durchgeführten Aktionen und die Ergebnisse zu verfolgen. Die Umleitung der Ausgabe in eine Datei hilft dabei, Protokolle für die Überprüfung zu erstellen.
- Wenn ein Skript fehlschlägt, müssen Sie die Ursache kennen. Indem Sie die Ausgabe speichern, können Sie sie später zur Fehlerbehandlung, zum Debuggen und zur Fehlerbehebung überprüfen.
Kurz gesagt, das Umleiten oder Speichern von PowerShell-Ausgaben steigert die Produktivität, hilft beim Debuggen, liefert nützliche Protokolle und erleichtert die Automatisierung, insbesondere bei komplexen Arbeitsabläufen oder der Arbeit mit großen Datensätzen.
Weitere PowerShell-Inhalte, die Ihnen gefallen könnten:
Kernmethoden zum Ausgeben von PowerShell-Ergebnissen in Dateien
Das Out-File Cmdlet
Die PowerShell-Methode zum Schreiben in eine Textdatei verwendet häufig das Out-File-Cmdlet, um Befehlsergebnisse (Ausgabe) direkt in eine Datei zu senden. In seiner einfachsten Form erfordert Out-File die Angabe eines Pfades und Dateinamens, um die Ausgabe zu schreiben.
Standardmäßig überschreibt das Cmdlet eine vorhandene Datei, wenn eine Datei mit demselben Namen unter dem angegebenen Pfad existiert, oder erstellt eine neue, wenn sie nicht existiert.
Out-File Syntax
Hier ist die grundlegende Syntax für das Out-File-Cmdlet:
Out-File
[-FilePath] <cadena>
[[-Encoding] <Encoding>]
[-Append]
[-Force]
[-NoClobber]
[-Width <int>]
[-NoNewline]
[-InputObject <psobject>]
[-WhatIf]
[-Confirmar]
[<CommonParameters>]
Parameter
Das PowerShell Out-File Cmdlet akzeptiert die folgenden Parameter:
Parameter | Beschreibung |
|---|---|
|
-Filepath |
Legt den Pfad und den Namen der Ausgabedatei fest |
|
-Encoding <Encoding> |
Legt die Kodierung für die Ausgabedatei fest. Optionen beinhalten ASCII, UTF8, UTF7, Unicode usw. Der Standardwert ist utf8NoBOM. |
|
-Anhängen |
Fügt die Ausgabe am Ende der Datei hinzu, ohne vorhandene Inhalte zu überschreiben |
|
-Force |
Überschreibt das schreibgeschützte Attribut und überschreibt eine vorhandene schreibgeschützte Datei. Dieser Parameter hebt keine Sicherheitsbeschränkungen auf. |
|
-NoClobber |
Verhindert das Überschreiben einer vorhandenen Datei. Standardmäßig wird eine Datei im angegebenen Pfad von dem Out-File-Cmdlet ohne Warnung überschrieben. |
|
-Breite |
Begrenzt die Anzahl der Zeichen pro Zeile in der Ausgabedatei (Standardwert 80). Alle zusätzlichen Zeichen werden abgeschnitten, nicht umgebrochen. |
|
-NoNewLine |
Gibt an, dass der Inhalt, der in die Ausgabedatei geschrieben wird, nicht mit einem Zeilenumbruch endet. Es werden keine Leerzeichen oder Zeilenumbrüche zwischen den Ausgabezeichenfolgen eingefügt und nach der letzten Ausgabezeichenfolge wird kein Zeilenumbruch hinzugefügt. |
|
-InputObject |
Gibt die Objekte an, die in die Datei geschrieben werden sollen. Geben Sie einen Befehl oder Ausdruck ein, der die Objekte abruft, oder geben Sie eine Variable ein, die die Objekte enthält. |
|
-WhatIf |
Führt das Cmdlet im Testmodus aus, um die erwarteten Ergebnisse des Cmdlets anzuzeigen |
|
-Bestätigen |
Fordert eine Bestätigung an, bevor das Cmdlet ausgeführt wird |
Anwendungsfälle
Um die Ausgabe direkt in eine Datei zu schreiben, anstatt sie auf dem Bildschirm anzuzeigen, können Sie den PowerShell-Befehl zur Ausgabe in eine Datei verwenden, indem Sie das Out-File-Cmdlet an einen PowerShell-Befehl oder eine Variable anhängen. Diese Technik funktioniert auch, um eine Textzeichenfolge in eine Datei zu schreiben, indem Sie Out-File direkt an die Zeichenfolge anhängen.
Fügen Sie Out-File an ein PowerShell-Cmdlet an
Um eine Liste der laufenden Prozesse abzurufen und die PowerShell-Ausgabe-in-Datei-Methode zu verwenden, speichern Sie die Ausgabe in einer Textdatei namens „Processes“ im Ordner C:\Temp mit dem folgenden Beispiel:
Get-Process | Out-File -FilePath C:\Temp\processes.txt
Hier listet das Get-Process-Cmdlet alle laufenden Prozesse auf. Mit der PowerShell-Pipe-Ausgabe-zu-Datei-Funktionalität können Sie die Befehlsausgabe nehmen und sie sofort in einer Textdatei speichern, um sie später zu analysieren.
Fügen Sie Out-File an eine Textzeichenfolge an
Um eine Zeichenkette mit der PowerShell-Methode zum Schreiben von Zeichenketten in eine Datei zu verwenden, wie zum Beispiel das Hinzufügen von „Hello, World!“ zu einer Textdatei namens „Test“ am Speicherort C:\Temp, verwenden Sie das folgende Cmdlet:
"Hallo, Welt!" | Out-File -FilePath C:\Temp\Test.txt
Wenn die Datei nicht existiert, wird sie erstellt. Wenn sie existiert, wird der Inhalt standardmäßig überschrieben.
Eine Variable mit Out-File anhängen
Sie können auch das Out-File-Cmdlet mit einer Variablen verwenden. Zum Beispiel:
$variable | Out-File -FilePath "C:\path\to\file.txt"
Hier ist $variable die Variable, die die Daten hält (z.B. eine PowerShell-Ausgabe in eine Textdatei oder Befehlsausgabe), die Sie in eine Datei senden möchten.
Umleitungsoperatoren (> und >>)
Umleitungsoperatoren (> und >>) in PowerShell sind eine einfache und schnelle Alternative zum Out-File-Cmdlet, die es Ihnen ermöglichen, Ausgaben in eine Datei umzuleiten.
- Der > Operator entspricht dem Out-File-Cmdlet ohne zusätzliche Parameter. Er überschreibt die Datei, wenn sie existiert, oder erstellt eine neue, wenn sie nicht existiert.
- Der >> Operator entspricht Out-File -Append. Er hängt die Ausgabe an die Datei an, wenn sie existiert, oder erstellt eine neue, wenn sie nicht existiert.
Diese Operatoren haben auch andere Verwendungen, wie das Umleiten von Fehler- oder ausführlichen Ausgabeströmen, was jedoch über den Rahmen dieses Artikels hinausgeht.
Grundlegende Syntax
Die grundlegende Syntax zur Verwendung der Operatoren lautet wie folgt:
<Command> > <Pfad> # Überschreibt
<Command> >> <Path> # Anhängen
Beachten Sie, dass die Umleitungsoperatoren keine Parameter verwenden.
Beispiel 1 – Verwendung des >-Operators
Dieses Cmdlet schreibt die Ausgabe von Get-Process in die Datei Processes.txt und überschreibt dabei jeglichen vorhandenen Inhalt, falls eine Datei mit diesem Namen bereits am Zielort existiert.
Get-Process > C:\Temp\Processes.txt
Beispiel 2 – Verwendung des >>-Operators
Dieses Cmdlet fügt das aktuelle Datum und die Uhrzeit am Ende der log.txt-Datei hinzu, ohne vorhandene Inhalte zu überschreiben.
Get-Date >> C:\Temp\log.txt
Wenn eine Datei namens log.txt unter dem angegebenen Pfad nicht existiert, wird die Datei erstellt und das aktuelle Datum sowie die Uhrzeit werden hineingeschrieben.
Out-File-Cmdlet im Vergleich zu Umleitungsoperatoren (> und >>)
Sowohl das Out-File-Cmdlet als auch die Umleitungsoperatoren können die PowerShell-Ausgabe in eine Datei schreiben und anhängen. Die Schlüsselunterschiede zwischen den beiden werden unten diskutiert.
Feature | Out-File Cmdlet | Umleitungsoperatoren (> und >>) |
|---|---|---|
|
Parameter |
Akzeptiert Parameter |
Akzeptiert keine Parameter |
|
Überschreibverhalten |
Standardmäßig wird überschrieben; verwenden Sie -Append zum Anhängen und -NoClobber, um ein Überschreiben zu vermeiden |
> überschreibt, >> hängt an Keine integrierte Kontrolle, um Überschreiben zu verhindern |
|
Kodierungskontrolle |
Ermöglicht die Angabe der Kodierung mit -Encoding |
Begrenzte Kodierungskontrolle (UTF-8 in PowerShell 6+, Unicode in älteren Versionen) |
|
Width Control |
Supports setting line width with -Width |
No control over line width |
|
Error Handling |
Only successful results are exported, so warnings or errors are not written to the file |
Can specify which stream you want to export, like success, error, warning, etc. |
|
Usage in Scripts |
Best for scripts that require more control over output |
Quick and convenient for simple redirection |
When to Use Each
In comparison, the Out-File cmdlet is more versatile and ideal for complex scripts, with options for encoding, width, and overwrite control. Redirection operators, however, are fast and convenient for quick output jobs that do not require customization. Following is a brief guide on when you should use each.
When to use the Out-File cmdlet
- For specific encoding (e.g., ASCII, UTF8, Unicode)
- To avoid overwriting files (using -NoClobber)
- For control over the line width of output (using -Width)
- In append mode while maintaining other output control options
When to use > and >>
- When you want quick redirection for output without additional formatting or encoding
- When overwriting (>) or appending (>>) the existing file is desired
Advanced File Output Techniques
Manage Overwrites
By default, the Out-File cmdlet overwrites an existing file if one by the same name exists at the specified path, or creates a new file if it does not.
To prevent overwriting an existing file, you can use the PowerShell write to file append method in one of two ways:
- Add (append) the output to the existing file
- Prevent overwrite, with the result that the existing file will not be overwritten and the output will not be saved to file
Append Output
Use the -Append parameter with the Out-File cmdlet to add the new output to the end of the specified file without overwriting its existing content. This is particularly useful when, for example, you want to log events incrementally without losing previous data.
This command appends the five most recent entries from the System log to the event_log.txt file.
Get-EventLog -LogName System -Newest 5 | Out-File -FilePath C:\Temp\event_log.txt -Append
You can also use the redirection operator >> to append output to an existing file. In the following example, the status and details of services on your local machine are appended to the contents in the log.txt file.
Get-Service >> C:\Temp\log.txt
Prevent Overwrite
Use the -NoClobber parameter with the Out-File cmdlet to prevent overwrites. Hence, if a file with the same name exists at the specified location, PowerShell will not overwrite it and throw an error. This helps protect important files.
The following command will attempt to create a file named log.txt in the Temp folder. But if a file by this name already exists, an error will be displayed and the output will not be saved to file.
Get-Service | Out-File -FilePath C:\Temp\log.txt -NoClobber
Force Overwrite
Sometimes you are unable to overwrite the contents of an existing file with the output of a PowerShell cmdlet, as the file is read-only. In a situation such as this, use the -Force parameter with the Out-File cmdlet to overwrite read-only files.
This cmdlet writes the services information to the Services.txt file, ensuring that if the Services.txt already exists, it will be overwritten, even if it is read-only.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Force
Output Formatting and Encoding
PowerShell’s Out-File cmdlet provides options to customize output formatting and encoding.
Format Output
The Out-File cmdlet may not display output as expected, particularly when the output has multiple columns. For a formatted, readable output, you can adjust the width or use the Format-Table cmdlet.
Example 1 – Set the Width
Use the -Width parameter with Out-File to specify the line width for the output file (80 characters is default).
This cmdlet writes the services information to the Services.txt file, while setting the line width to 200 characters. This allows for wider output without wrapping.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Width 200
Example 2 – Format with Format-Table
Use the Format-Table cmdlet to structure data before sending it to the Out-File cmdlet.
This cmdlet uses Format-Table -AutoSize to adjust the column widths automatically for readability.
Get-Service | Format-Table -AutoSize | Out-File -FilePath C:\Temp\Services.txt
Set Encoding
Encoding output in PowerShell when using the Out-File cmdlet ensures that the data is correctly interpreted, displayed, and compatible across different systems and applications.
The -Encoding parameter helps specify how output text is encoded in the file. Common encoding types include:
- UTF8 – Common for web applications, supports all characters.
- ASCII – Limited to basic English characters, compact but restrictive.
- Unicode (UTF-16) – Good for Windows compatibility, can handle a wide range of special characters, symbols, and international text, but uses more space.
- Default – Uses the system’s default encoding, which might vary and can be unpredictable across platforms.
Example 1 — Use UTF-8 Encoding
It is a good idea to use UTF-8 encoding if the output file contains special characters or the file will be used in environments where UTF-8 is the standard encoding.
This cmdlet retrieves a list of services on the system and outputs the information to the Services.txt file while setting the file encoding to UTF-8.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Encoding UTF8
Example 2 — Use ASCII Encoding
ASCII encoding is commonly used for simpler text files.
This cmdlet retrieves a list of services on the system and pipes the outputs to the Services.txt file. The -Encoding parameter is used to convert the output to ASCII format.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Encoding ASCII
Handling Specific Output Streams
The Out-File cmdlet writes the successful result of your command or script to a file. But it does not write errors, warnings, or specific types of messages to files. This can be achieved with the redirect operator, that enables you to specify which stream you want to output to a file.
Operator | Description / Stream | Write cmdlet |
|---|---|---|
|
> |
Success only |
Write-Output |
|
2> |
Error only |
Write-Error |
|
3> |
Warning only |
Write-Warning |
|
4> |
Verbose only |
Write-Verbose |
|
5> |
Debug only |
Write-Debug |
|
6> |
Information only |
Write-Information |
|
*> |
All |
|
Example 1 — Send error messages to file
This command attempts to list (ls) a file named Readme. It looks for the file in the current directory if you do not specify a path. If the file does not exist, it generates an error message. The 2> operator redirects this error to a file called error.log. As a result, the error is not displayed on screen but saved in error.log in the Temp folder.
ls Readme 2> C:\Temp\error.log
Handpicked related content:
Example 2 — Send Warnings to file
In PowerShell, the warning stream is stream number 3. You can use 3> to redirect warnings to a file: It is as:
# Command that generates a warning
<Your-Command> 3> C:\Temp\warning_log.txt
Alternative Methoden für die Ausgabe
Set-Content- und Add-Content-Cmdlets
Die Cmdlets Set-Content und Add-Content sind eine weitere Möglichkeit, Ausgaben in eine Datei zu schreiben.
- Set-Content überschreibt den vorhandenen Inhalt der Datei mit dem neuen angegebenen Inhalt. Wenn die Datei nicht existiert, wird sie erstellt.
- Add-Content hängt neuen Inhalt an das Ende des vorhandenen Dateiinhalts an. Wenn die Datei nicht existiert, wird sie erstellt, jedoch kein bestehender Inhalt ersetzt.
Das Cmdlet Set-Content
Verwenden Sie das Cmdlet Set-Content, um den Inhalt einer Datei mit neuem Inhalt zu schreiben oder zu ersetzen.
Dieses Cmdlet überschreibt den vorhandenen Inhalt in der Datei Test.txt. Der Parameter -Value gibt den Inhalt oder Text an, der den vorhandenen Inhalt ersetzt
Set-Content -Path C:\Temp\Test.txt -Value "Add content here"
Das Cmdlet Add-Content
Verwenden Sie das Cmdlet Add-Content, um Inhalt zu einer Datei hinzuzufügen. Das bedeutet, dass Sie neue Daten an eine vorhandene Datei anhängen können, ohne sie zu überschreiben. Add-Content kann auch Inhalt gleichzeitig an mehrere Dateien anhängen.
Wie das Cmdlet Out-File und der Umleitungsoperator erstellt Add-Content eine neue Datei, wenn keine Datei mit demselben Namen existiert.
Beispiel 1 — Text an eine Datei anhängen
Dieses Cmdlet fügt neuen Text zur Datei Test.txt hinzu. Der Parameter -Value gibt den Inhalt oder Text an, den Sie an die Datei anhängen möchten.
Add-Content -Path C:\Temp\Test.txt -Value "New line to add"
Wenn die Datei schreibgeschützt ist, müssen Sie den Parameter -Force verwenden, um das Hinzufügen von Inhalt zu ermöglichen.
Beispiel 2 — Fügen Sie Text zu mehreren Dateien hinzu
Um denselben Inhalt zu mehreren Dateien hinzuzufügen, haben Sie mehrere Optionen.
- Verwenden Sie Platzhalter im Pfad, um die Dateien anzugeben, die Sie aktualisieren möchten
- Schließen Sie Dateinamen aus, die Sie nicht aktualisieren möchten
Dieses Cmdlet fügt das aktuelle Datum zu allen .txt-Dateien im Temp-Ordner hinzu, außer in der Datei mit test im Dateinamen:
Add-Content -Path C:\Temp\files\*.txt -Value (Get-Date) -Exclude "test*"
Beispiel 3 — Mehrere Zeilen Text hinzufügen
Dieser Befehl fügt dem Test.txt-Datei mehrere Zeilen Text hinzu.
$lines = @(
"Line 1: Details",
"Line 2: Specific Details"
)
Add-Content -Path C:\Temp\Test.txt -Value $lines
.Net-Klassen
Sie können .NET-Klassen verwenden, um Ausgaben in eine Datei zu schreiben, insbesondere in fortgeschrittenen Szenarien mit umfangreicher Datenverarbeitung. Diese Klassen sind:
- BinaryWriter – Schreibt primitive Datentypen in binärer Form in einen Stream.
- StreamWriter – Wird zum Schreiben von Zeichen in einem bestimmten Encoding in einen Stream verwendet. Oft genutzt zum Erstellen oder Modifizieren von Textdateien.
- StringWriter – schreibt Informationen in einen String. Mit dieser Klasse speichert PowerShell die String-Informationen in einem StringBuilder-Objekt.
Die Verwendung der StreamWriter-Klasse in C# zur Ausgabe in eine Datei ist unkompliziert. Das folgende Beispiel zeigt, wie Sie sie nutzen können.
# Get the directories in C:\
$Dirs = Get-ChildItem -Path C:\ -Directory
# Open a stream writer
$File = 'C:\Temp\Dirs.txt'
$Stream = [System.IO.StreamWriter]::new($File)
# Write the folder names for these folders to the file
foreach($Dir in $Dirs) {
$Stream.WriteLine($Dir.FullName)
}
# Close the stream
$Stream.Close()
Dieses Skript führt die folgenden Schritte aus, um Verzeichnisse auf dem C:\-Laufwerk aufzulisten und ihre Pfade in einer Textdatei zu speichern:
Schritt 1:
$Dirs = Get-ChildItem -Path C:\ -Directory
Diese Zeile verwendet Get-ChildItem mit dem -Directory Parameter, um nur die Verzeichnisse (nicht Dateien) im C:\ Laufwerk zu erhalten. Das Ergebnis wird in der $Dirs Variablen als Liste von Verzeichnisobjekten gespeichert.
Schritt 2:
$File = 'C:\Temp\Dirs.txt'
$Stream = [System.IO.StreamWriter]::new($File)
Diese Zeilen richten einen Dateipfad (C:\Temp\Dirs.txt) ein, wo die Verzeichnisliste gespeichert wird, und initialisieren dann ein StreamWriter-Objekt, um in diese Datei zu schreiben. Dieses Objekt wird $Stream zugewiesen.
Schritt 3:
foreach($Dir in $Dirs) {
$Stream.WriteLine($Dir.FullName)
}
Diese Schleife durchläuft jedes Verzeichnisobjekt in $Dirs. Für jedes Verzeichnis schreibt sie den vollständigen Pfad ($Dir.FullName) in die Datei, indem $Stream.WriteLine verwendet wird.
Schritt 4:
$Stream.Close()
Nachdem alle Verzeichnispfade geschrieben wurden, schließt das Skript den StreamWriter.
Vereinbaren Sie eine persönliche Demo für Netwrix Directory Manager:
Best Practices für die PowerShell-Dateiausgabe
Stellen Sie die richtige Zeilenbreite ein, um Abschneidungen zu vermeiden
Sie sollten die korrekte Zeilenbreite mit dem -Width Parameter in PowerShell einstellen, um das Abschneiden langer Zeilen zu verhindern und sicherzustellen, dass Dateiausgaben wie beabsichtigt formatiert werden.
Der -Width-Parameter im Out-File-Cmdlet steuert die maximale Anzahl von Zeichen pro Zeile in der Ausgabe. Standardmäßig ist er auf 80 Zeichen eingestellt, was längere Zeilen abschneiden kann. Sie können beispielsweise die Breite auf 200 Zeichen erhöhen, wie unten gezeigt:
Get-Process | Out-File -FilePath "output.txt" -Width 200
Betrachten Sie Folgendes:
- Um unnötige Leerzeichen oder Abschneidungen zu vermeiden, stellen Sie eine -Breite ein, die der längsten Zeile entspricht. Für die meisten Ausgaben sollte eine Breite von 120–200 Zeichen gut funktionieren.
- Für Daten mit vielen Spalten (wie bei einer CSV-Datei) stellen Sie eine größere Breite ein, um die ganze Zeile unterzubringen.
- In einer Pipeline verwenden Sie Out-String -Width, um die Zeilenbreite zu steuern, sodass die gesamte Zeile in die angegebene Breite passt, bevor sie an Out-File weitergeleitet wird.
Stellen Sie die richtige Kodierung ein
Die standardmäßige Kodierung, die PowerShell verwendet, variiert je nach Cmdlet und der verwendeten PowerShell-Version. Die folgende Tabelle zeigt die standardmäßig verwendete Kodierung:
Cmdlet / Operator | PowerShell 5.1 (und frühere) Standardkodierung | PowerShell Core / PowerShell 7+ Standardkodierung |
|---|---|---|
|
Out-File, Set-Content, Add-Content |
UTF-16LE (Unicode) |
UTF-8 (kein BOM) |
|
>, >> (Umleitung) |
ASCII |
UTF-8 (No BOM) |
UTF-8-Codierung wird für die Kompatibilität zwischen Systemen empfohlen. Für ältere Systeme möchten Sie jedoch möglicherweise -Encoding ASCII oder -Encoding Unicode angeben.
Verwenden Sie $PSDefaultParameterValues, um Standardwerte in Skripten festzulegen
$PSDefaultParameterValues in PowerShell ermöglicht es Ihnen, Standardwerte für Parameter über Skripte und Sitzungen hinweg festzulegen, um Konsistenz zu gewährleisten, ohne Optionen wiederholt anzugeben.
Hier erfahren Sie, wie Sie global UTF8-Kodierung und eine breitere Breite als Standard für Out-File festlegen können.
$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
$PSDefaultParameterValues["Out-File:Width"] = 200
Kombinieren Sie Out-File mit Format-Table und Format-List für eine besser strukturierte Ausgabe
Die Kombination des Out-File-Cmdlets mit Format-Table oder Format-List ist eine hervorragende Möglichkeit, gut strukturierte, lesbare Textausgabedateien zu erstellen.
Format-Table
Format-Table eignet sich am besten für Daten mit einer klaren Zeilen- und Spaltenstruktur. Es erstellt ein organisiertes, leicht zu lesendes tabellenähnliches Format. Beachten Sie jedoch Folgendes, wenn Sie es mit dem Out-File-Cmdlet verwenden:
- Verwenden Sie den -Property Parameter, um nur die Spalten anzugeben, die Sie benötigen. Dies verhindert Unordnung in der Ausgabedatei.
- Verwenden Sie den -AutoSize Parameter, um die Spaltenbreite an den Inhalt anzupassen. Dies wird überflüssige Leerzeichen oder Abschneidungen reduzieren.
- Verwenden Sie den -Width Parameter, um eine Abschneidung zu verhindern und die Ausgabe ausgerichtet zu halten.
Hier ist ein Beispiel:
Get-Process | Format-Table -Property Name, ID, CPU, WS -AutoSize | Out-File -FilePath "ProcessList.txt" -Width 200
Format-List
Format-List zeigt Daten vertikal an, mit einer Eigenschaft pro Zeile. Verwenden Sie es, wenn Sie viele Eigenschaften oder Felder mit langen Werten haben, um eine Abschneidung dieser Werte zu vermeiden. Dieses Format eignet sich für Berichte und detaillierte Protokolle.
Hier ist ein Beispiel für die Verwendung von Format-List mit Out-File:
Get-Process | Format-List -Property Name, ID, CPU, StartTime | Out-File -FilePath "DetailedProcessList.txt"
Wählen Sie, wie bei Format-Table, nur die Eigenschaften aus, die Sie benötigen.
Verhindern Sie Dateikonflikte, indem Sie Test-Path verwenden, um zu überprüfen, ob Dateien existieren, bevor Sie schreiben
Es ist immer ratsam zu überprüfen, ob eine Datei existiert, bevor man versucht, in sie zu schreiben. Auf diese Weise können Sie versehentliche Überschreibungen vermeiden und entscheiden, was zu tun ist, wenn eine Datei bereits existiert. Das Cmdlet Test-Path in PowerShell ermöglicht es Ihnen, die Existenz einer Datei zu überprüfen.
Folgende Schritte sollten Sie befolgen:
- Weisen Sie den Dateipfad einer Variablen zu.
- Verwenden Sie das Test-Path-Cmdlet, um zu überprüfen, ob die Datei existiert.
- Entscheiden Sie, ob Sie anhängen, überschreiben, umbenennen oder das Schreiben überspringen möchten.
- Verwenden Sie das Out-File-Cmdlet, um die Datei zu erstellen oder in sie zu schreiben.
Häufige Fallstricke und Lösungen
Das Out-File-Cmdlet in PowerShell kann manchmal zu häufigen Fallstricken führen, insbesondere im Umgang mit Dateien, Kodierung und dem Anhängen von Inhalten. Einige häufige Probleme und deren Lösungen werden unten diskutiert.
Vermeiden Sie Datenverlust durch Überschreiben
Standardmäßig überschreibt das Out-File-Cmdlet den Inhalt einer vorhandenen Datei ohne Warnung, wenn bereits eine Datei mit demselben Namen existiert. Einige Möglichkeiten, dies zu vermeiden, sind:
- Fügen Sie die Ausgabe mit dem -Append Parameter der bestehenden Datei hinzu, anstatt sie zu überschreiben.
- Überprüfen Sie, ob die Datei mit Test-Path existiert und entscheiden Sie, wie Sie mit Out-File fortfahren möchten.
Vermeiden Sie Datenverlust durch unsachgemäße Kodierung
Standardmäßig verwendet Out-File in PowerShell 5.1 und früheren Versionen Unicode-Kodierung. In PowerShell Core und späteren Versionen wird UTF-8-Kodierung verwendet.
Die Standardkodierung ist möglicherweise nicht mit Ihrem System oder Anwendungen kompatibel, die eine andere Kodierung erwarten. Daher sollten Sie die Kodierung explizit mit dem -Encoding Parameter angeben.
Verwalten Sie die Ausgabe in lang laufenden Skripten, um die Leistung zu gewährleisten
In eingeschränkten Umgebungen wie PowerShell ISE kann das Ausführen von Skripten mit dem Out-File-Cmdlet zu Problemen führen, wie zum Beispiel:
- Fehler beim Umgang mit komplexen Datenstrukturen wie erwartet
- Kürzung von langen Ausgaben
Um lange Ausgaben zu verwalten, können Sie:
- Verwenden Sie den -Width Parameter, um eine geeignete Breite festzulegen
- Exportieren Sie komplexe Daten in strukturierte Formate wie CSV oder JSON mit den Cmdlets Export-Csv oder ConvertTo-Json
Behandeln Sie das Protokollieren und Fehlerbehandlung in PowerShell-Skripten
Manchmal ist eine Datei in Gebrauch oder von einem anderen Prozess gesperrt. In diesem Fall wird das Out-File-Cmdlet einen Fehler ausgeben, da es nicht in der Lage sein wird, darauf zu schreiben. Sie können diesen und andere Fehler mit einem try/catch-Block behandeln. Ein Beispiel ist wie folgt:
$content = "Write content to file"
$filePath = "C:\Temp\Errors.txt"
try {
$content | Out-File -FilePath $filePath
Write-Host "File written successfully."
} catch {
Write-Host "File is in use or locked by another process."
}
FAQ
Teilen auf
Erfahren Sie mehr
Über den Autor
Tyler Reese
VP of Product Management, CISSP
Mit mehr als zwei Jahrzehnten in der Software-Sicherheitsbranche ist Tyler Reese bestens vertraut mit den sich schnell entwickelnden Identitäts- und Sicherheitsherausforderungen, denen Unternehmen heute gegenüberstehen. Derzeit ist er als Produktleiter für das Netwrix Identity and Access Management Portfolio tätig, wo seine Aufgaben die Bewertung von Markttrends, die Festlegung der Richtung für die IAM-Produktlinie und letztendlich die Erfüllung der Bedürfnisse der Endanwender umfassen. Seine berufliche Erfahrung reicht von IAM-Beratung für Fortune-500-Unternehmen bis hin zur Arbeit als Unternehmensarchitekt eines großen Direkt-an-Verbraucher-Unternehmens. Derzeit hält er die CISSP-Zertifizierung.
Erfahren Sie mehr zu diesem Thema
Powershell Delete File If Exists
So erstellen Sie neue Active Directory-Benutzer mit PowerShell
So führen Sie ein PowerShell-Skript aus
Was ist PowerShell? Ein kompletter Leitfaden zu seinen Funktionen & Anwendungen
Beherrschung von PowerShell Sleep für das Skriptmanagement