So exportieren Sie die PowerShell-Skriptausgabe in Textdateien

Letzte Aktualisierung: 16/10/2025
Autor: Holger
  • Out-File schreibt formatierte Ausgaben und muss am Ende der Pipeline stehen; es steuert die Kodierung und Breite.
  • Die Umleitung (>, >>) ist grundsätzlich gleichwertig, aber in Powershell 7.4 mit Natives geändert.
  • Reale Fälle: aus CSV mit Net User, Zählen von PDF, Protokolle und Änderungen an der Registrierung.

Exportieren Sie PowerShell-Ergebnisse in TXT

Wenn Sie mit PowerShell arbeiten, müssen Sie früher oder später die Ausgabe Ihrer Befehle in einer Datei. Ergebnisse in eine Textdatei exportieren Dies ist eine einfache Möglichkeit, Informationen später zu prüfen, freizugeben oder zu verarbeiten, ohne auf die Konsole angewiesen zu sein.

In diesem Handbuch finden Sie eine vollständige und praktische Übersicht über die Ausgabe von Skripten und Befehlen in Text, sowohl mit Ausgabedatei wie bei Umleitungsoperatoren, einschließlich echte Beispiele, Tricks Kodierung, Linienbreite und typische Situationen wie das Lesen von CSV, die Verwaltung nativer Befehlsausgaben oder Protokolle aufzeichnenAlles wird auf Spanisch aus Spanien erklärt, in einem klaren und direkten Ton.

Was „Exportieren“ in PowerShell bedeutet und wie die Out-*-Familie dazu passt

PowerShell verfügt über eine Reihe von Cmdlets, deren Verb ist Außen und sind dazu bestimmt, Ausgaben an Ziele außerhalb der PowerShell-Engine selbst zu senden. Beim Schreiben in eine Datei, auf einen Drucker oder auf einen Host Diese Cmdlets wandeln Objekte in Text um und wenden dabei das Konsolenformatierungssystem an.

Dies hat eine entscheidende Konsequenz: Out-*-Cmdlets müssen am Ende der Pipeline stehenWenn Sie beispielsweise Out-Host in der Mitte der Pipeline platzieren, unterbrechen Sie den Datenfluss, und alles, was danach kommt, erhält nichts. Der Test: Get-Prozess | Out-Host-Paging | Format-Liste zeigt keine Liste, sondern die standardmäßige tabellarische Ansicht an, da die Ausgabe bereits vor der Formatierung an den Host gesendet wurde.

Der richtige Weg ist, die Reihenfolge umzukehren: Get-Prozess | Format-Liste | Out-Host-Paging. Zuerst wählen Sie das Format, dann senden Sie die Ausgabe an das entsprechende Ziel. Dasselbe gilt für Ausgabedatei, Aus-Drucker o Out-Null (Letzteres verwirft alles, was es empfängt, was nützlich ist, um Ergebnisse, die Sie nicht benötigen, stummzuschalten).

Out-File von oben nach unten: Syntax und Verhalten

Das Cmdlet Ausgabedatei Schreibt die Ausgabe in eine Datei mit Konsolenformatierung. Sie können es auf zwei Arten verwenden: über den normalen Pfad (ByPath) oder über den wörtlichen Pfad (ByLiteralPath), wenn Sonderzeichen vorhanden sind, die PowerShell nicht interpretieren soll.

Out-File  <string>  <Encoding>]        
Out-File  <Encoding>] -LiteralPath <string>        

Wenn Sie die klassische Weiterleitung bevorzugen, > und >> sind funktional gleichwertig mit dem Pipen an Out-File ohne zusätzliche Parameter (mit Ausnahme von Nuancen) und da PowerShell 7.4, hat das Verhalten der Umleitung der Standardausgabe nativer Befehle geändert. Es lohnt sich, about_Redirection zu überprüfen wenn Sie externe ausführbare Dateien umleiten, um Überraschungen zu vermeiden.

Denken Sie daran, dass Out-File gibt keine Objekte an die Pipeline zurück; sein Zweck ist es, Text zu speichern. Die Darstellung, die es schreibt, ist die gleiche, die Sie in der Konsole sehen würden, daher ist es möglicherweise nicht ideal für die weitere Verarbeitung, wenn Sie nicht zuerst in Zeichenfolgen konvertieren oder ein Format wählen, das gesteuert wird durch Format-Tabelle o Format-Liste.

Out-File-Parameter im Detail erklärt

Um den größtmöglichen Nutzen aus dem Export zu ziehen, ist es wichtig, die Parameter gut zu kennen. Das sind die wichtigsten und wie sie Ihnen in Ihrem täglichen Leben helfen.

  • -Dateipfad Gibt den Pfad zur Ausgabedatei an. Dieser Wert ist im ByPath-Satz erforderlich und hat Aliase wie Path. Wenn die Datei nicht vorhanden ist, wird sie erstellt. Wenn sie vorhanden ist, wird sie überschrieben, sofern Sie nichts anderes angeben.
  • Wenn Sie auf Routen verweisen müssen, wie sie geschrieben sind, -LiteralPath ist Ihr Freund. Es akzeptiert keine Platzhalter und entspricht genau der angegebenen Zeichenfolge. Verwenden Sie es mit einfachen Anführungszeichen, wenn Backslashes oder Escape-Zeichen vorhanden sind.
  • Mit -Anhängen Sie fügen Inhalte am Ende einer vorhandenen Datei hinzu, ohne den vorherigen Inhalt zu verlieren. Perfekt für Protokolle oder inkrementelle Berichte.
  • Wenn Sie nicht möchten, dass eine Datei versehentlich überschrieben wird, -Kein Klopper blockiert diesen Vorgang und gibt eine Meldung zurück, die klarstellt, dass die Datei bereits vorhanden ist, um Panik zu vermeiden.
  • Um das Schreiben auch dann zu erzwingen, wenn die Datei schreibgeschützt ist, -Force macht dieses Attribut ungültig. Beachten Sie, dass hierdurch keine Sicherheitsbeschränkungen umgangen werden, sondern nur das Nur-Lese-Flag.
  • Mit -Breite Sie definieren die maximale Breite pro Zeile. Tabellenformatierte Ausgabe wird normalerweise an die Hostbreite angepasst. Wenn Sie keine Abschneidungen wünschen, legen Sie eine hohe Breite fest (z. B. 2000) oder steuern Sie den Wert global mit $PSDefaultParameterValues ​​​​= 2000.
  • Sie möchten keinen Zeilenumbruch am Ende? -Keine neue Zeile verkettet die resultierenden Zeichenfolgen ohne Hinzufügen neuer Zeilen, nützlich, wenn Sie wirklich interessiert sind Texte verbinden im Flug
  • Mit -Eingabeobjekt Sie können die zu schreibenden Objekte oder Zeichenfolgen direkt bereitstellen, ohne dass eine Weiterleitung erforderlich ist. Ideal für vorgefertigte Variablen oder Ergebnisse.
  • Um zu steuern, was vor der Ausführung passiert, -Was ist, wenn Es zeigt Ihnen die Aktion, ohne sie auszuführen (Trockentest) und -Bestätigen Es fragt Sie nach einer vorherigen Bestätigung, die dazu beiträgt Sicherheit bei der Automatisierung.
  • Die Codierung ist entscheidend. -Codierung bestimmt, wie der Text gespeichert wird. Die Standardeinstellung ist utf8NoBOMUnterstützt Werte wie ASCII, Unicode (UTF-16 LE), UTF8, UTF8BOM, UTF8NoBOM, UTF32, BigendianUnicode, Bigendianutf32 und OEM (für MS-DOS oder ältere Konsolen). Seit PowerShell 7.4 können Sie ansi für die ANSI-Codepage Ihrer Kultur, ohne die Kennung manuell eingeben zu müssen. Ab Version 6.2 können Sie numerische Codepage-Kennungen (z. B. 1251) oder Namen wie „windows-1251“ übergeben.
  • Darüber hinaus unterstützt Out-File die Gemeinsame Parameter wie -Verbose, -ErrorAction, -Debug, etc., mit denen Sie das Diagnose- und Fehlerverhalten homogen anpassen können.
  Was ist WmiPrvSE.exe und warum erscheint es in Windows?

Praxisbeispiele, die Sie beherrschen sollten

Mal sehen reale Szenarien Die gängigsten Fälle werden alle neu geschrieben, sodass Sie sie kopieren und an Ihre Umgebung anpassen können.

Erstellen Sie eine Datei mit der Liste der Prozesse und lesen Sie sie. Wenn die Datei nicht vorhanden ist, wird sie erstellt. Dies ist ideal, um einen Schnappschuss des Systemstatus zu erfassen.

Get-Process | Out-File -FilePath .\Process.txt
Get-Content -Path .\Process.txt

Überschreiben verhindern mit -NoClobber. Wenn die Datei bereits vorhanden ist, blockieren Sie den Vorgang und zeigen Sie einen informativen Fehler an, anstatt sie stillschweigend zu ersetzen.

Get-Process | Out-File -FilePath .\Process.txt -NoClobber

Wählen Sie Kodierung und Breite. Speichert im ASCII-Format und begrenzt jede Zeile auf 50 Zeichen (schneidet ab, umbricht nicht). Nützlich für die Integration mit Tools, die ein klassisches Format erwarten.

$procs = Get-Process
Out-File -FilePath .\Process.txt -InputObject $procs -Encoding ascii -Width 50

Schreiben von einem Nicht-Dateisystem-AnbieterSie können Aliase vom Laufwerk „Alias:“ auflisten und sie in eine Datei in C:\TestDir verschieben, ohne den Kontext zu wechseln.

Set-Location -Path Alias:
Get-ChildItem | Out-File -FilePath C:\TestDir\AliasNames.txt
Get-Content -Path C:\TestDir\AliasNames.txt

Legen Sie die Standardbreite für den gesamten Bereich festWenn Sie ständig Berichte erstellen, können Sie durch Festlegen einer großen Breite das Abschneiden verhindern, unabhängig von der Größe des Konsolenfensters.

$PSDefaultParameterValues = 2000
$logFile = "$PWD\logfile.txt"
Get-ChildItem Env:\ | Out-File $logFile
Get-Service -ErrorAction Ignore | Format-Table -AutoSize | Out-File $logFile -Append
Get-Process | Format-Table Id,SI,Name,Path,MainWindowTitle >> $logFile
$PSDefaultParameterValues.Remove('Out-File:Width')

Umleitung in CMD und PowerShell: Wichtige Unterschiede

Wenn Sie in der arbeiten Eingabeaufforderung Classic können Sie die Ausgabe mit dem Umleitungsoperator an TXT senden. Die allgemeine Form ist:

Comando > C:\Ruta\archivo.txt

Um beispielsweise die Ausgabe von nslookup zu speichern, würden Sie etwas wie nslookup > C:\CMD\CMD.txt und Sie würden diese Datei öffnen, um das Ergebnis zu überprüfen. Es ist ein universelles Muster in CMD.

In PowerShell wird normalerweise empfohlen, eine Pipe an Ausgabedatei um eine genaue Kontrolle über Kodierung und Breite zu haben. Ein grundlegender Ansatz ist:

Get-Service | Out-File -FilePath C:\CMD\PowerShell.txt

Dann können Sie es mit überprüfen Get-Content -Path C:\CMD\PowerShell.txt. Wenn Sie feststellen, dass die Ausgabe abgeschnitten ist (sehr typisch bei breiten Tabellen), erhöhen Sie die Breite mit -Width oder verwenden Sie den Trick der $PSDefaultParameterValues.

Wenn die Ausgabe auf eine einzelne breite Zeile passen muss, besteht eine Technik darin, Width auf die maximal unterstützte Ganzzahl (2147483647) zu setzen, obwohl aus praktischen Gründen mit 2000 ist normalerweise genug.

Aus CSV lesen und native Befehlsausgabe exportieren (Net User/Domain)

Ein häufiger Fall ist der Import einer CSV-Datei mit Benutzern oder Daten mit PowerShell extrahierenund führen Sie für jeden aus net user … /domain und die Ausgabe in eine TXT-Datei schreiben. Wenn Sie dies innerhalb eines ForEach-Befehls tun und bei jeder Iteration mit -Append schreiben, sollte es funktionieren, aber manchmal treten Fehler auf oder nur das letzte Element wird ausgegeben.

  Vollständiger Leitfaden zur Windows Defender Application Control (WDAC)

Eine robustere Form ist alle Ausgaben sammeln und nur einmal schreiben, wodurch das Öffnen/Schließen von Dateien reduziert und Race Conditions mit nativen Prozessen vermieden werden:

Import-Csv 'C:\Desktop\domain.csv' |
  ForEach-Object { net user $_.Username /domain } |
  Out-File -FilePath 'C:\_test\user.txt' -Append

Wenn Sie die Blöcke lieber nach Benutzer trennen möchten, um die Datei besser lesbar zu machen, können Sie manuelle Trennzeichen einfügen. Schreib-Ausgabe Hilfe zum Hinzufügen von Überschriften oder Leerzeilen:

Import-Csv 'C:\Desktop\domain.csv' |
  ForEach-Object {
    Write-Output ("----- USUARIO: {0} -----" -f $_.Username)
    net user $_.Username /domain
    Write-Output ""
  } | Out-File -FilePath 'C:\_test\user.txt'

Wenn weiterhin ein merkwürdiges Verhalten auftritt, gibt es Alternativen: Start-Prozess mit -RedirectStandardOutput für jeden Benutzer oder traditionelle Umleitung >> von cmd.exe. Wichtig ist, dass die Datei nicht blockiert ist und dass alle Texte enden in derselben Datei, ohne dass Streams gekürzt oder gemischt werden.

Schreiben Sie in den Ordner, aus dem das Skript ausgeführt wird

Eine weitere häufige Frage ist, wie man immer in seinem eigenen Ordner speichert. Skript oder im aktuellen Ordner. Verwenden Sie $PSScriptRoot für den Skriptpfad (beim Ausführen aus einer .ps1-Datei) oder $PWD für das aktuelle Arbeitsverzeichnis in der Sitzung.

$destino = Join-Path $PSScriptRoot 'salida.txt'
Get-Process | Out-File -FilePath $destino

Wenn Sie die Ausführung durch Einfügen von Befehlen in die Konsole ausführen und den aktuellen Pfad wünschen, $PWD oder der Alias . dienen Ihnen. Zur Übersichtlichkeit stellen Sie die Route mit Join-Pfad und Sie vermeiden Probleme mit der Bar.

PDF-Seiten zählen und Ergebnisse im Text aufzeichnen

Stellen Sie sich vor, Sie durchsuchen ein Verzeichnis und möchten die Seiten aller PDFs mithilfe eines externen Tools wie pdfinfoDie Idee besteht darin, die Dateien durchzugehen, die „Seiten“-Daten zu extrahieren, sie zu sammeln und einen klaren Bericht zu schreiben.

$carpeta = 'C:\PRUEBA'
$totalPaginas = 0
$contadorArchivos = 0

Get-ChildItem -Path $carpeta -Filter *.pdf | ForEach-Object {
  $info = & .\pdfinfo $_.FullName | Select-String -Pattern '(?<=Pages:\s*)\d+'
  $paginas = $info.Matches.Value
  $totalPaginas += $paginas
  $contadorArchivos++
  @{
    Pdf = $_.Name
    Paginas = $paginas
  }
} | Out-File -FilePath (Join-Path $PWD 'detalle_pdfs.txt')

("Total de páginas: {0} en {1} archivos" -f $totalPaginas, $contadorArchivos) |
  Out-File -FilePath (Join-Path $PWD 'detalle_pdfs.txt') -Append

Damit erhalten Sie eine zeilenweise Auflistung jeder PDF-Datei und eine Fußzeile mit der Gesamtsumme. Wenn Sie ein verarbeitbares Format bevorzugen, können Sie CSV verwenden. Wenn Ihr Ziel jedoch eine lesbare TXT-Datei ist, ist Out-File die richtige Wahl.

Praxisbeispiel: Einloggen, Filtern mit Select-String und Bearbeiten der Registry

Ein weiteres sehr lehrreiches Szenario ist ein Skript, das den aktuellen Benutzer identifiziert, ihn mit externen Listen abgleicht, Dateien bereinigt, Werte extrahiert, einen Registrierungsschlüssel ändert und alles, was passiert, in einem Protokoll aufzeichnet. Obwohl es lang erscheinen mag, sind es einfache Stücke angekettet.

Der typische Ablauf wäre: Erfassen Sie den Benutzer mit whoami, normalisieren (zum Beispiel durch Entfernen der Domäne), suchen Sie es in einem Active Directory-Eintrag mit Select-String und geben Sie die Übereinstimmung mit Set-Content in eine TXT-Datei aus. Bereinigen Sie anschließend leere Zeilen mit Wo-Objekt {$_.Trim() -ne »}und ersetzen Sie durch -ersetzen um nur das nützliche Muster beizubehalten.

Der erste Wert wird dann geladen mit Objekt auswählen - Erstes 1 (Sie vermeiden Mehrdeutigkeiten, wenn es mehrere Übereinstimmungen gibt.) Eine zweite Suche wird in einer anderen Referenzdatei durchgeführt, die gleiche Bereinigung wird durchgeführt und Sie erhalten erneut das erste Ergebnis. Mit diesen Daten können Sie nun konsultieren oder exportieren die zuständige Registry-Abteilung.

Ein weit verbreitetes Muster besteht darin, den alten Schlüssel durch Exportieren des Zweigs mit zu extrahieren Reg-Export, suchen Sie die Zeile mit der "Benutzer-ID" mit Select-String -Pattern «Benutzer-ID», klare Anführungszeichen und das Präfix mit -ersetzen, und behalten Sie den Wert, an dem Sie interessiert sind, als „Originalwert“ bei.

Um die tatsächliche Änderung anzuwenden, verwenden Sie Set-Item-Eigenschaft mit dem vollständigen Pfad von HKEY_USERS basierend auf der Profil-SID, dem Wertenamen "Benutzer-ID" und dem neue Daten die Sie zuvor gelöst haben. Und, ganz wichtig: Alles, was passiert, wird aufgezeichnet mit Schreibe-Ausgabe … | Out-File-Append in einem Protokoll (einschließlich Zeit, Benutzer, SID, alter und neuer Wert usw.).

$hora = Get-Date
"Hora: $hora ; Usuario: $usuario ; ClaveOriginal: $valorOld ; NuevaClave: $valor ; SID: $sid" |
  Out-File -FilePath "\\SERVIDOR\RUTA\usuarios.log" -Append

Um sauber herunterzufahren, löschen Sie temporäre Dateien mit Gegenstand entfernenEin Sicherheitsdetail: Out-File -Anhängen behält einen durchgängig lesbaren Verlauf bei, der für spätere Prüfungen von Gold wert ist, wenn etwas schief geht.

  So erkennen und entfernen Sie doppelte Zeilen im Editor: Vollständige Anleitung

Out-Host, Out-Null und Out-Printer: Wann sie wichtig sind und wann nicht

Wir haben es bereits angedeutet: Out-Host Im Wesentlichen sendet es den Befehl an den Host (das Konsolenfenster). Sein Hauptnutzen ist die Paginierung mit -Paging in langen Listen, immer am Ende der Pipeline platziert, um die Kette nicht zu unterbrechen.

Out-Null Es ist die Senke. Alles, was hineingeht, wird sofort verworfen. Es wird für Befehle mit Nebeneffekten verwendet, wenn die Ausgabe keinen Mehrwert bringt. Beachten Sie, dass beseitigt keine Fehler: Wenn die Bestellung nicht existiert oder fehlschlägt, wird die Meldung trotzdem angezeigt.

Wenn Sie brauchen druckenin Windows Sie verfügen über Out-Printer. Sie können die Ausgabe an den Standarddrucker senden oder dessen Anzeigenamen angeben (wie einen Druckertreiber in einer Datei), und PowerShell kümmert sich um den Rest.

Feinabstimmung: Format, ANSI und Breite ohne Überraschungen

Da Out-File-Formate dasselbe System wie die Konsole verwenden, kann das Ergebnis manchmal abgeschnitten sein. Kontrollieren Sie die Breite Durch die Verwendung von -Width oder der globalen Standardeinstellung werden diese Probleme beim Speichern breiter Tabellen vermieden.

Bei PowerShell 7.2 Sie können die Handhabung von ANSI-Escape-Sequenzen steuern, indem Sie $PSStyle.OutputRenderingWenn Ihre Ausgabe Farben oder andere Dekorationen enthält und Sie dieses Verhalten beim Exportieren beibehalten oder deaktivieren möchten, legen Sie diese Einstellung fest, bevor Sie in die Datei schreiben.

In Versionen wie Windows PowerShell 5.1Das Standardformat von Out-File war Unicode. Heute, mit moderner PowerShell, ist der Standard utf8NoBOM, was normalerweise die beste Kompatibilität bietet. Wenn ein älteres Tool auf ASCII besteht, geben Sie dies mit -Encoding ascii an. Und wenn Sie mit Tools aus der lokalen Kultur arbeiten, ansi (seit 7.4) ist eine praktische Abkürzung.

Schnelle Tipps für bewährte Vorgehensweisen

Wann immer du kannst, Wählen Sie Out-File statt Redirection Wenn Sie die Kodierung, Breite oder das Verhalten einer vorhandenen Datei steuern müssen. Die Umleitung ist schnell, aber weniger explizit, und ihr Verhalten mit nativen Versionen hat sich in 7.4 geändert.

Wenn Sie während einer Schleife wiederholt schreiben, priorisieren Sie nur einmal ansammeln und schreiben oder, wenn Sie iterativ schreiben müssen, verwenden Sie -Append und vermeiden Sie das parallele Mischen mehrerer Ziele, die möglicherweise um dieselbe Datei konkurrieren.

Wenn Ihr Skript in einem eigenen Ordner gespeichert werden muss, verwenden Sie $PSScriptRoot. Wenn es sich um eine interaktive Sitzung handelt, $PWD. Mit Join-Pfad Sie schützen sich vor Trennzeichenfehlern und verbessern die Portabilität.

Wenn das Ziel NachbearbeitungErwägen Sie die Verwendung von Export-CSV oder ConvertTo-Json anstelle von formatiertem Text. Wenn die Lesbarkeit für Menschen im Vordergrund steht (Berichte, Protokolle), ist Out-File ideal.

Für seltene Routen mit Sonderzeichen, -LiteralPath Das erspart Ihnen Kopfschmerzen. Und denken Sie daran, dass Out-File keine Ausgabe an die Pipeline zurückgibt: Wenn Sie sowohl drucken als auch speichern müssen, verwenden Sie Tee-Objekt um Flüsse zu duplizieren.

Wenn Sie tabellarische Berichte erstellen, berücksichtigen Sie formatear dich mit Format-Tabelle o Format-Liste vor dem Schreiben. Die Kontrolle des Formats im Voraus führt zu stabileren Ergebnissen und vermeidet die Abhängigkeit von der Konsolenbreite.

Das allgemeine Cmdlet-Ökosystem (-Verbose, -ErrorAction usw.) gilt auch hier. Aktivieren -Verbose während des Tests, um zu sehen, was passiert, und deaktivieren Sie es in der Produktion, wenn Sie kein Rauschen möchten.

Diese Tour hinterlässt Ihnen eine übersichtliche Karte: Ausgabedatei und Unternehmen dienen dazu, in Dateien, Drucker oder die Konsole selbst zu materialisieren, was zuvor Objekte waren. Mit der richtigen Kombination von Korrekte Pipeline-Kodierung, Breite und Reihenfolge, Ihre Berichte und Protokolle sind zuverlässig, lesbar und bereit zum Teilen oder Archivieren.

Scraping strukturierter Daten von Websites mit Powershell und HTML Agility Pack
Verwandte Artikel:
Scraping strukturierter Daten mit PowerShell und HTML Agility Pack