Hoe u de uitvoer van een PowerShell-script naar tekstbestanden exporteert

Laatste update: 16/10/2025
Auteur: Isaac
  • Out-File schrijft geformatteerde uitvoer en moet aan het einde van de pijplijn worden geplaatst. Het bepaalt de codering en de breedte.
  • Omleiding (>, >>) is in de basis gelijkwaardig, maar in PowerShell 7.4 veranderd met autochtonen.
  • Echte gevallen: van CSV met netgebruiker, telling van PDF, logs en wijzigingen in het register.

PowerShell-resultaten exporteren naar TXT

Wanneer u vroeg of laat met PowerShell werkt, moet u de uitvoer van uw bestand opslaan. commando's in een bestand. Resultaten exporteren naar een tekstbestand Het is een eenvoudige manier om informatie later te controleren, delen of verwerken zonder dat u afhankelijk bent van de console.

In deze gids vindt u een compleet en praktisch overzicht van hoe u scripts en opdrachten naar tekst kunt uitvoeren, zowel met Uitgaand bestand zoals bij omleidingsoperatoren, inclusief echte voorbeelden, Tricks codering, lijnbreedte en typische situaties zoals het lezen van CSV, het beheren van native opdrachtuitvoer of logboeken opnemenAlles wordt in het Spaans vanuit Spanje uitgelegd, met een duidelijke en directe toon.

Wat 'exporteren' betekent in PowerShell en hoe de Out-*-familie daarin past

PowerShell heeft een aantal cmdlets waarvan het werkwoord is Uit en zijn bedoeld om uitvoer te sturen naar bestemmingen buiten de PowerShell-engine zelf. Bij het schrijven naar een bestand, printer of host Deze cmdlets transformeren objecten naar tekst, waarbij het opmaaksysteem van de console wordt toegepast.

Dit heeft een belangrijk gevolg: Out-* cmdlets moeten aan het einde van de pijplijn worden geplaatstAls je bijvoorbeeld Out-Host in het midden van de pijplijn plaatst, blokkeer je de stroom en ontvangt alles wat erna komt niets. De test: Get-proces | Uitgaande host-paging | Formaatlijst zal geen lijst weergeven, maar de standaard tabelweergave, omdat de uitvoer al naar de host is verzonden vóór de opmaak.

De juiste manier is om de volgorde om te draaien: Get-proces | Formaatlijst | Uitgaande host-pagineringEerst kiest u het formaat, vervolgens stuurt u de uitvoer naar de bijbehorende bestemming. Hetzelfde geldt voor Uitgaand bestand, Uit-Printer o Uit-Null (de laatste verwijdert alles wat het ontvangt, handig om resultaten die u niet nodig hebt, te negeren).

Out-File van boven naar beneden: syntaxis en gedrag

De cmdlet Uitgaand bestand Schrijft uitvoer naar een bestand met consoleopmaak. U kunt dit op twee manieren gebruiken: via een normaal pad (ByPath) of via een letterlijk pad (ByLiteralPath) wanneer er speciale tekens zijn die u niet door PowerShell wilt laten interpreteren.

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

Als u de klassieke omleiding prefereert, > en >> zijn functioneel equivalent aan het doorsturen naar Out-File zonder extra parameters (behalve nuances) en, aangezien Power Shell 7.4, het gedrag van het omleiden van de standaarduitvoer van native opdrachten gewijzigd. Het is de moeite waard om te kijken naar_Redirection als u externe uitvoerbare bestanden omleidt om verrassingen te voorkomen.

Houd er rekening mee dat Out-File stuurt geen objecten terug naar de pijplijn; het doel is om tekst op te slaan. De weergave die het schrijft is hetzelfde als wat je in de console zou zien, dus het is mogelijk niet ideaal voor verdere verwerking als je niet eerst naar strings converteert of een formaat kiest dat wordt aangestuurd door Formaat-Tabel o Formaat-Lijst.

Out-File-parameters gedetailleerd uitgelegd

Om het maximale uit exporteren te halen, is het belangrijk dat u de exportparameters goed kent. Dit zijn de belangrijkste en hoe ze u helpen in uw dagelijks leven.

  • -Bestandspad Geeft het pad naar het uitvoerbestand aan. Dit is vereist in de ByPath-set en heeft aliassen zoals Path. Als het bestand niet bestaat, wordt het aangemaakt; als het wel bestaat, wordt het overschreven, tenzij u anders opgeeft.
  • Wanneer u naar routes moet verwijzen zoals ze zijn geschreven, -LiteraalPad is je vriend. Het accepteert geen jokers en komt exact overeen met de opgegeven string. Gebruik het met enkele aanhalingstekens als er backslashes of escape-tekens in voorkomen.
  • met -Toevoegen Je voegt inhoud toe aan het einde van een bestaand bestand zonder de vorige inhoud te verliezen. Perfect voor logs of incrementele rapporten.
  • Als u niet wilt dat een bestand per ongeluk wordt overschreven, -NoClobber blokkeert de bewerking en stuurt een bericht terug waarin staat dat het bestand al bestaat, zodat er geen paniek ontstaat.
  • Om schrijven te forceren, zelfs als het bestand alleen-lezen is, -Kracht Maakt dat kenmerk ongeldig. Merk op dat hiermee geen beveiligingsbeperkingen worden omzeild, maar alleen de alleen-lezen-vlag.
  • met -Breedte U definieert de maximale breedte per regel. Tabel-geformatteerde uitvoer wordt meestal aangepast aan de hostbreedte; als u geen afkapping belangrijk vindt, stelt u een hoge breedte in (bijv. 2000) of bepaalt u de waarde globaal met $PSDefaultParameterValues ​​​​= 2000.
  • Wilt u geen regelafbreking aan het einde? -Geen nieuwe regel koppelt de resulterende strings aan elkaar zonder nieuwe regels toe te voegen, handig als je echt geïnteresseerd bent voeg teksten samen op de vlucht
  • met -InvoerObject U kunt de te schrijven objecten of strings direct opgeven zonder dat u piping nodig hebt. Ideaal voor vooraf samengestelde variabelen of resultaten.
  • Om te controleren wat er gebeurt voordat het wordt uitgevoerd, -Wat als Het laat je de actie zien zonder deze uit te voeren (droge test) en -Bevestigen Er wordt om voorafgaande bevestiging gevraagd, wat bijdraagt veiligheid bij het automatiseren.
  • Coderen is cruciaal. -Codering bepaalt hoe de tekst wordt opgeslagen. De standaardinstelling is utf8NoBOMOndersteunt waarden zoals ascii, unicode (UTF-16 LE), utf8, utf8BOM, utf8NoBOM, utf32, bigendianunicode, bigendianutf32 en oem (bedoeld voor MS-DOS of oudere consoles). Sinds PowerShell 7.4 kunt u ansi voor de ANSI-codepagina van uw cultuur zonder de identificatie handmatig in te voeren. En vanaf versie 6.2 kunt u numerieke codepagina-identificaties (bijv. 1251) of namen zoals "windows-1251" doorgeven.
  • Bovendien ondersteunt Out-File de Gemeenschappelijke parameters zoals -Verbose, -ErrorAction, -Debug, etc., waarmee u het diagnose- en foutgedrag homogeen kunt aanpassen.
  Microsoft intensiveert zijn advertentiecampagne met advertenties op volledig scherm in Windows 10

Praktische voorbeelden die u onder de knie moet krijgen

Eens kijken echte scenario's waarin de meest voorkomende gevallen worden behandeld en die allemaal zijn herschreven, zodat u ze kunt kopiëren en aanpassen aan uw eigen omgeving.

Maak een bestand met de lijst met processen en lees hetAls het bestand niet bestaat, wordt het aangemaakt. Dit is ideaal om een ​​momentopname van de systeemstatus te maken.

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

Voorkom overschrijven met -NoClobber. Als het bestand al bestaat, blokkeer dan de bewerking en toon een informatieve foutmelding in plaats van het stilzwijgend te vervangen.

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

Kies codering en breedteSlaat op in ASCII en beperkt elke regel tot 50 tekens (afgekapt, zonder afbreking). Handig voor integraties met tools die een klassieke indeling verwachten.

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

Schrijven vanaf een niet-bestandssysteemproviderU kunt aliassen van het Alias: station weergeven en ze verplaatsen naar een bestand in C:\TestDir zonder dat de context hoeft te worden gewijzigd.

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

Stel de standaardbreedte in voor de gehele scopeAls u voortdurend rapporten genereert, voorkomt u door een hoge breedte in te stellen dat er wordt afgekapt, ongeacht de grootte van het consolevenster.

$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')

Omleiding in CMD en PowerShell: belangrijke verschillen

Als je in de opdrachtprompt In de klassieke versie kunt u de uitvoer naar TXT sturen met de omleidingsoperator. De algemene vorm is:

Comando > C:\Ruta\archivo.txt

Om bijvoorbeeld de uitvoer van nslookup op te slaan, zou u zoiets doen als nslookup > C:\CMD\CMD.txt en je zou dat bestand openen om het resultaat te bekijken. Het is een universeel patroon in CMD.

In PowerShell is de aanbeveling doorgaans om een ​​pijpleiding te gebruiken Uitgaand bestand Om nauwkeurige controle te hebben over codering en breedte. Een basisaanpak is:

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

Dan kun je het inspecteren met Get-Content -Pad C:\CMD\PowerShell.txtAls u merkt dat de uitvoer is afgekapt (heel typisch bij brede tabellen), vergroot u de breedte met -Width of gebruikt u de truc van de $PSDefaultParameterValues.

Als de uitvoer op één brede lijn moet passen, is een techniek om de breedte in te stellen op het maximaal ondersteunde gehele getal (2147483647), hoewel dit voor praktische doeleinden met 2000 is meestal voldoende.

Lezen van CSV en exporteren van native opdrachtuitvoer (netgebruiker /domein)

Een veelvoorkomend geval is het importeren van een CSV met gebruikers of gegevens extraheren met PowerShellen voer voor elk daarvan een uitvoering uit netgebruiker … /domein en dump de uitvoer naar een TXT-bestand. Als je dit binnen een ForEach doet en bij elke iteratie met -Append schrijft, zou het moeten werken, maar soms verschijnen er fouten of wordt alleen het laatste element uitgevoerd.

  Fout bij losgekoppelde printer in Windows 10 [BESTE OPLOSSINGEN]

Een robuustere vorm is alle output verzamelen en schrijf slechts één keer, waardoor het aantal keren dat bestanden worden geopend/gesloten wordt verminderd en race-omstandigheden met native processen worden vermeden:

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

Als u blokken per gebruiker wilt scheiden om het bestand leesbaarder te maken, kunt u handmatige scheidingstekens invoegen. Schrijf-Uitvoer Help bij het toevoegen van kopteksten of lege regels:

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'

Als u nog steeds vreemd gedrag ervaart, zijn er alternatieven: Start-proces met -RedirectStandardOutput voor elke gebruiker, of traditionele omleiding >> vanuit cmd.exe. Het belangrijkste is dat het bestand niet wordt geblokkeerd en dat alle tekst komen in hetzelfde bestand terecht zonder dat de stromen worden afgekapt of gemengd.

Schrijf naar de map waaruit het script wordt uitgevoerd

Een andere veelgestelde vraag is hoe je altijd in je eigen map kunt opslaan. script of in de huidige map. Gebruik $PSScriptRoot voor het scriptpad (wanneer uitgevoerd vanuit een .ps1-bestand) of $PWD voor de huidige werkmap in de sessie.

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

Als u de opdracht in de console plakt en u wilt het huidige pad, $PWD of de alias . u van dienst zijn. Voor de duidelijkheid, stel de route samen met Join-Pad en je vermijdt barproblemen.

PDF-pagina's tellen en resultaten in tekst vastleggen

Stel je voor dat je door een directory bladert en de pagina's van alle PDF's wilt optellen met behulp van een extern hulpmiddel zoals pdfinfoHet idee is om de bestanden door te nemen, de 'Pagina'-gegevens te extraheren, deze te verzamelen en een duidelijk rapport te schrijven.

$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

Hiermee krijg je een regel-voor-regel lijst van elke PDF en een voettekst met het totaal. Als u de voorkeur geeft aan een verwerkbaar formaat, kunt u kiezen voor CSV, maar als uw bestemming een leesbare TXT is, voldoet Out-File prima.

Praktijkvoorbeeld: inloggen, filters met Select-String en het register bewerken

Een ander zeer leerzaam scenario is een script dat: de huidige gebruiker identificeert, hiernaar verwijst met externe lijsten, bestanden opschoont, waarden extraheert, een registersleutel wijzigt en alles wat er gebeurt in een logboek vastlegt. Hoewel het lang lijkt, zijn het eenvoudige stukken geketend.

De typische stroom zou zijn: de gebruiker vastleggen met whoami, normaliseren (bijvoorbeeld door het domein te verwijderen), zoek het op in een Active Directory-vermelding met Selecteer-String en dump de match naar een TXT met Set-Content. Ruim vervolgens lege regels op met Waar-Object {$_.Trim() -ne »}en vervang ze door -vervangen om alleen het bruikbare patroon te behouden.

De eerste waarde wordt vervolgens geladen met Select-Object -Eerste 1 (U voorkomt dubbelzinnigheden als er meerdere overeenkomsten zijn.) Er wordt een tweede zoekopdracht uitgevoerd in een ander referentiebestand, dezelfde opschoning wordt uitgevoerd en opnieuw blijft het eerste resultaat over. Met deze gegevens kunt u nu raadplegen of exporteren het relevante registerfiliaal.

Een veelgebruikt patroon is om de oude sleutel te extraheren door de branch te exporteren met reg export, zoek de regel met "Gebruikers-ID" met Select-String -Patroon «Gebruikers-ID», duidelijke aanhalingstekens en het voorvoegsel met -vervangenen behoud de waarde waarin u geïnteresseerd bent als de “oorspronkelijke waarde”.

Om de echte verandering toe te passen die u gebruikt Set-itemeigenschap met het volledige pad van HKEY_USERS op basis van de profiel-SID, waardenaam "Gebruikers-ID" en de nieuwe gegevens die je eerder hebt opgelost. En, heel belangrijk, alles wat er gebeurt, wordt vastgelegd met Schrijf-Uitvoer … | Uitvoer-Bestand-Toevoegen in een logboek (inclusief tijd, gebruiker, SID, oude en nieuwe waarde, enz.).

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

Om het programma netjes af te sluiten, verwijdert u tijdelijke bestanden met Verwijder voorwerpEen veiligheidsdetail: Uit-bestand -Toevoegen houdt een consistente, leesbare geschiedenis bij, wat van onschatbare waarde is voor latere audits, mocht er iets misgaan.

  Maak en beheer lokale accounts, inlog-ID's en profielen met Intune.

Out-Host, Out-Null en Out-Printer: wanneer ze belangrijk zijn en wanneer niet

We hebben er al op gezinspeeld: Uitgaande gastheer In principe stuurt het de opdracht naar de host (het consolevenster). De belangrijkste functie is paginering met -Paging in lange lijsten, altijd aan het einde van de pijplijn geplaatst om de keten niet te onderbreken.

Uit-Null Het is de gootsteen. Alles wat erin komt, wordt onmiddellijk weggegooid. Het wordt gebruikt voor opdrachten met bijwerkingen wanneer de uitvoer geen waarde toevoegt. Houd er rekening mee dat elimineert geen fouten: Ook als de bestelling niet bestaat of mislukt, ziet u het bericht nog steeds.

Als je nodig hebt Afdrukken, en Windows Je hebt Out-Printer. Je kunt de uitvoer naar de standaardprinter sturen of de weergavenaam ervan opgeven (zoals een printerdriver naar een bestand), en PowerShell zorgt voor de rest.

Fine-tuning: formaat, ANSI en breedte zonder verrassingen

Omdat Out-File-formaten hetzelfde systeem gebruiken als de console, kan het resultaat soms worden afgekapt. Controleer de breedte Door -Width of de globale standaardwaarde te gebruiken, worden deze problemen bij het opslaan van brede tabellen vermeden.

Bij Power Shell 7.2 U kunt bepalen hoe ANSI-escape-reeksen worden verwerkt door: $PSStyle.OutputRenderingAls uw uitvoer kleuren of andere versieringen bevat en u dat gedrag bij het exporteren wilt behouden of uitschakelen, stelt u die voorkeur in voordat u naar een bestand schrijft.

In versies zoals Windows PowerShell 5.1Het standaardformaat van Out-File was Unicode. Tegenwoordig is de standaard, met de moderne PowerShell, utf8NoBOM, wat meestal het meest compatibel is. Als een oudere tool ASCII vereist, geef dit dan aan met -Encoding ascii. En als je met tools uit de lokale cultuur werkt, ansi (sinds 7.4) is een handige snelkoppeling.

Snelle tips voor goede praktijken

Wanneer je maar kunt, kies Out-File boven Redirection Als u de codering, breedte of het gedrag van een bestaand bestand wilt beheren. Omleiden is snel, maar minder expliciet, en het gedrag ervan in native versies is gewijzigd in 7.4.

Geef prioriteit aan herhaaldelijk schrijven tijdens een lus slechts één keer verzamelen en schrijven of, als u per iteratie moet schrijven, gebruik dan -Append en vermijd het parallel mengen van meerdere bestemmingen die mogelijk om hetzelfde bestand concurreren.

Als uw script in een eigen map moet worden opgeslagen, gebruik dan $PSScriptRoot. Als het een interactieve sessie is, $PWD. Met Join-Pad U beschermt uzelf tegen scheidingsfouten en verbetert de overdraagbaarheid.

Als het doel is nabewerkingOverweeg Export-CSV of ConvertTo-Json te gebruiken in plaats van opgemaakte tekst. Als leesbaarheid voor mensen prioriteit heeft (rapporten, logs), is Out-File perfect.

Voor zeldzame routes met speciale tekens, -LiteraalPad Het bespaart je hoofdpijn. En vergeet niet dat Out-File geen uitvoer naar de pijplijn terugstuurt: als je zowel wilt afdrukken als opslaan, gebruik dan Tee-object om stromen te dupliceren.

Als u tabelrapporten genereert, houd er dan rekening mee formatear jezelf met Formaat-Tabel o Formaat-Lijst vóór het schrijven. Door het formaat vooraf te controleren, worden de resultaten stabieler en is er geen afhankelijkheid van de consolebreedte.

Het gebruikelijke cmdlet-ecosysteem (-Verbose, -ErrorAction, enz.) is hier ook van toepassing. Actief -Uitgebreid tijdens het testen om te zien wat er gebeurt en om het in productie uit te schakelen als u geen ruis wilt.

Na deze tour krijgt u een duidelijke kaart: Uitgaand bestand en bedrijf dienen om te materialiseren in bestanden, printers of de console zelf wat voorheen objecten waren. Met de juiste combinatie van Correcte pijplijncodering, breedte en volgorde, uw rapporten en logboeken zijn betrouwbaar, leesbaar en klaar om te delen of te archiveren.

Gestructureerde gegevens van websites schrapen met Powershell en HTML Agility Pack
Gerelateerd artikel:
Gestructureerde gegevens schrapen met PowerShell en HTML Agility Pack