- Out-File skriver formatert utdata og må legges på slutten av pipelinen; den kontrollerer koding og bredde.
- Omdirigering (>, >>) er tilsvarende i det grunnleggende, men i PowerShell 7.4 endret seg med innfødte.
- Ekte tilfeller: fra CSV med nettbruker, telling av PDF, logger og endringer i registeret.
Når du jobber med PowerShell, må du før eller siden lagre resultatet av kommandoer i en fil. Eksporter resultater til en tekstfil Det er en enkel måte å revidere, dele eller behandle informasjon senere uten å være avhengig av konsollen.
I denne veiledningen finner du en komplett og praktisk gjennomgang av hvordan du skriver ut skript og kommandoer til tekst, begge med Ut-fil som med omdirigeringsoperatorer, inkludert virkelige eksempler, Triks koding, linjebredde og typiske situasjoner som å lese fra CSV, administrere innebygde kommandoutganger eller registrere loggerAlt blir forklart på spansk fra Spania, med en klar og direkte tone.
Hva «eksport» betyr i PowerShell og hvordan Out-*-familien passer inn
PowerShell har en rekke cmdleter hvis verb er Out og er ment å sende utdata til destinasjoner utenfor selve PowerShell-motoren. Når du skriver til en fil, skriver eller vert Disse cmdletene transformerer objekter til tekst, ved å bruke konsollformateringssystemet.
Dette har en sentral konsekvens: Out-* cmdlets må plasseres på slutten av pipelinenHvis du for eksempel plasserer Out-Host midt i rørledningen, kutter du av flyten, og det som kommer etterpå vil ikke motta noe. Testen: Hent-prosess | Ut-vert-personsøking | Format-liste vil ikke vise en liste, men standard tabellvisning, fordi utdataene allerede er sendt til verten før formatering.
Den riktige måten er å reversere rekkefølgen: Hent-prosess | Formater-liste | Ut-vert-personsøkingFørst velger du formatet, deretter sender du resultatet til den tilsvarende destinasjonen. Det samme gjelder for Ut-fil, Skriver ut o Ut-Null (sistnevnte forkaster alt den mottar, nyttig for å dempe resultater du ikke trenger).
Utfil fra topp til bunn: syntaks og oppførsel
cmdleten Ut-fil Skriver utdata til en fil ved hjelp av konsollformatering. Du kan bruke den på to hovedmåter: via normal sti (ByPath) eller via litteral sti (ByLiteralPath) når det finnes spesialtegn du ikke vil at PowerShell skal tolke.
Out-File <string> <Encoding>]
Out-File <Encoding>] -LiteralPath <string>
Hvis du foretrekker klassisk omdirigering, > og >> er funksjonelt likeverdige med å sende til Out-File uten ekstra parametere (bortsett fra nyanser), og siden PowerShell 7.4, endret virkemåten for omdirigering av standardutdata fra native kommandoer. Det er verdt å sjekke om_omdirigering hvis du omdirigerer eksterne kjørbare filer for å unngå overraskelser.
Husk at utfiling returnerer ikke objekter til pipelinen; dens formål er å lagre tekst. Representasjonen den skriver er den samme som det du ville sett i konsollen, så den er kanskje ikke ideell for videre behandling hvis du ikke først konverterer til strenger eller velger et format kontrollert av Format-tabell o Formatliste.
Out-File-parametere forklart i detalj
For å få mest mulig ut av eksport, er det viktig å kjenne parameterne godt. Dette er de viktigste og hvordan de hjelper deg i hverdagen.
- -Filbane Angir banen til utdatafilen. Den er obligatorisk i ByPath-settet og har aliaser som Path. Hvis filen ikke finnes, opprettes den; hvis den finnes, overskrives den med mindre du spesifiserer noe annet.
- Når du trenger å referere til ruter slik de er skrevet, -LiteralPath er din venn. Den godtar ikke jokertegn og samsvarer nøyaktig med den angitte strengen. Bruk den med enkle anførselstegn hvis det er omvendte skråstreker eller escape-tegn.
- med -Legg til Du legger til innhold på slutten av en eksisterende fil uten å miste det forrige innholdet. Perfekt for logger eller trinnvise rapporter.
- Hvis du ikke vil at en fil skal bli overskrevet ved et uhell, -IngenClobber blokkerer den operasjonen og returnerer en melding som avklarer at filen allerede finnes, og unngår skremsler.
- For å tvinge frem skriving selv når filen er skrivebeskyttet, -Makt ugyldiggjør attributtet. Merk at dette ikke omgår sikkerhetsbegrensninger, bare skrivebeskyttet flagg.
- med -Bredde Du definerer maksimal bredde per linje. Tabellformatert utdata justeres vanligvis til vertsbredden. Hvis du ikke bryr deg om avkorting, angi en høy bredde (f.eks. 2000) eller kontroller verdien globalt med $PSDefaultParameterValues = 2000.
- Vil du ikke ha linjeskift på slutten? -Ingen ny linje sammenkobler de resulterende strengene uten å legge til nye linjer, nyttig når du er virkelig interessert bli med tekster i farten
- med -InputObject Du kan angi objektene eller strengene som skal skrives direkte uten behov for piping. Ideelt for forhåndskomponerte variabler eller resultater.
- For å kontrollere hva som skjer før utførelse, -Hva om Den viser deg handlingen uten å utføre den (tørr test) og -Bekrefte Den ber deg om forhåndsbekreftelse, noe som bidrar sikkerhet når man automatiserer.
- Koding er avgjørende. -Koding bestemmer hvordan teksten lagres. Standardinnstillingen er utf8Ingen bomullsstrukturStøtter verdier som ascii, unicode (UTF-16 LE), utf8, utf8BOM, utf8NoBOM, utf32, bigendianunicode, bigendianutf32 og oem (beregnet for MS-DOS eller eldre konsoller). Siden PowerShell 7.4 kan du bruke ansi for kulturens ANSI-kodesett uten å legge inn identifikatoren manuelt. Og fra og med 6.2 kan du sende numeriske kodesettidentifikatorer (f.eks. 1251) eller navn som "windows-1251".
- I tillegg støtter Out-File Fellesparametere som -Verbose, -ErrorAction, -Debug osv., som du kan justere diagnostikk- og feilatferden homogent med.
Praktiske eksempler du bør mestre
La oss se reelle scenarier som dekker de vanligste tilfellene, alle omskrevet slik at du kan kopiere og tilpasse dem til ditt miljø.
Opprett en fil med listen over prosesser og les denHvis filen ikke finnes, opprettes den. Dette er ideelt for å ta et øyeblikksbilde av systemets status.
Get-Process | Out-File -FilePath .\Process.txt
Get-Content -Path .\Process.txt
Forhindre overskriving med -NoClobber. Hvis filen allerede finnes, blokker operasjonen og vis en informativ feil i stedet for å erstatte den i stillhet.
Get-Process | Out-File -FilePath .\Process.txt -NoClobber
Velg koding og breddeLagrer i ASCII og begrenser hver linje til 50 tegn (avkortes, brytes ikke). Nyttig for integrasjoner med verktøy som forventer et klassisk format.
$procs = Get-Process
Out-File -FilePath .\Process.txt -InputObject $procs -Encoding ascii -Width 50
Skriving fra en ikke-filsystemleverandørDu kan liste opp aliaser fra Alias:-stasjonen og flytte dem til en fil i C:\TestDir uten å bytte kontekst.
Set-Location -Path Alias:
Get-ChildItem | Out-File -FilePath C:\TestDir\AliasNames.txt
Get-Content -Path C:\TestDir\AliasNames.txt
Angi standardbredden for hele omfangetHvis du genererer rapporter stadig vekk, forhindrer det å angi en høy bredde avkorting uavhengig av størrelsen på konsollvinduet.
$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')
Omdirigering i CMD og PowerShell: Viktige forskjeller
Hvis du jobber i ledetekst klassisk, kan du sende utdataene til TXT med omdirigeringsoperatoren. Den generelle formen er:
Comando > C:\Ruta\archivo.txt
For eksempel, for å lagre resultatet av nslookup, gjør du noe slikt nsoppslag > C:\CMD\CMD.txt og du ville åpne den filen for å se resultatet. Det er et universelt mønster i CMD.
I PowerShell er anbefalingen vanligvis å sende til Ut-fil for å ha fin kontroll over koding og bredde. En grunnleggende tilnærming er:
Get-Service | Out-File -FilePath C:\CMD\PowerShell.txt
Så kan du inspisere det med Get-Content -Sti C:\CMD\PowerShell.txtHvis du legger merke til at resultatet er avkortet (veldig vanlig med brede tabeller), øk bredden med -Width eller bruk trikset med $PSDefaultParameterValues.
Når utdataene må få plass på én bred linje, er én teknikk å sette Bredde til det maksimale heltallstallet som støttes (2147483647), men av praktiske årsaker med 2000 er vanligvis nok.
Les fra CSV og eksporter utdata fra den opprinnelige kommandoen (nettbruker /domene)
Et vanlig tilfelle er å importere en CSV-fil med brukere eller uttrekk av data med PowerShell, og utfør for hver enkelt nettbruker … /domene og dump utdataene til en TXT-fil. Hvis du gjør dette i en ForEach og skriver med -Append på hver iterasjon, skal det fungere, men noen ganger oppstår det feil, eller bare det siste elementet sendes ut.
En mer robust form er samle all produksjon og skriv bare én gang, noe som reduserer antall åpninger/lukkinger av filer og unngår kappløpsbetingelser med native prosesser:
Import-Csv 'C:\Desktop\domain.csv' |
ForEach-Object { net user $_.Username /domain } |
Out-File -FilePath 'C:\_test\user.txt' -Append
Hvis du foretrekker å separere blokker etter bruker for å gjøre filen mer lesbar, kan du injisere manuelle skilletegn. Skrive-utgang hjelp med å legge til overskrifter eller blanke linjer:
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'
Hvis du fortsatt opplever merkelig oppførsel, finnes det alternativer: Start-prosess med -RedirectStandardOutput for hver bruker, eller tradisjonell omdirigering >> fra cmd.exe. Det viktigste er at filen ikke er blokkert og at all tekst ende opp i samme fil uten avkorting eller blanding av strømmer.
Skriv til mappen som skriptet kjøres fra
Et annet vanlig spørsmål er hvordan man alltid lagrer i sin egen mappe. script eller i gjeldende mappe. Bruk $PSScriptRoot for skriptbanen (når den kjøres fra en .ps1-fil) eller $PWD for den gjeldende arbeidskatalogen i sesjonen.
$destino = Join-Path $PSScriptRoot 'salida.txt'
Get-Process | Out-File -FilePath $destino
Hvis du kjører ved å lime inn kommandoer i konsollen og du vil ha gjeldende sti, $PWD eller aliaset . tjene deg. For klarhetens skyld, skriv ruten med Bli med-sti og du vil unngå problemer med baren.
Tell PDF-sider og registrer resultater i tekst
Tenk deg at du blar gjennom en katalog og vil summere sidene i alle PDF-ene ved hjelp av et eksternt verktøy som pdfinfoTanken er å gå gjennom filene, trekke ut «Sider»-dataene, samle dem og skrive en tydelig rapport.
$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
Med dette får du en linje for linje-oppføring av hver PDF og en bunntekst med totalen. Hvis du foretrekker et bearbeidbart format, kan du velge CSV, men hvis destinasjonen din er en lesbar TXT, gjør Out-File jobben helt fint.
Ekte tilfelle: innlogging, filtrering med Select-String og redigering av registeret
Et annet veldig lærerikt scenario er et skript som: identifiserer den nåværende brukeren, kryssrefererer den med eksterne lister, renser filer, trekker ut verdier, endrer en registernøkkel og registrerer alt som skjer i en logg. Selv om det kan virke langt, er de enkle brikker lenket.
Den typiske flyten ville være: fange brukeren med whoami, normalisere det (for eksempel ved å fjerne domenet), slå det opp i en Active Directory-oppføring med Velg-streng og dump kampen til en tekstfil med Set-Content. Rydd deretter opp i tomme linjer med Hvor-objekt {$_.Trim() -ne »}, og foreta erstatninger med -erstatte å bare beholde det nyttige mønsteret.
Den første verdien lastes deretter inn med Velg-Objekt -Først 1 (Du unngår tvetydigheter hvis det er flere treff.) Et nytt søk utføres i en annen referansefil, den samme rensingen gjøres, og igjen sitter du igjen med det første resultatet. Med disse dataene kan du nå konsultere eller eksportere den aktuelle registeravdelingen.
Et mye brukt mønster er å trekke ut den gamle nøkkelen ved å eksportere grenen med reg eksport, finn linjen som inneholder «Bruker-ID» med Velg-streng-mønster «Bruker-ID», klare anførselstegn og prefikset med -erstatte, og behold verdien du er interessert i som den «opprinnelige verdien».
For å anvende den virkelige endringen du bruker Set-ItemProperty med den fullstendige banen til HKEY_USERS basert på profil-SID-en, verdinavnet "Bruker-ID" og nye data som du har løst før. Og, veldig viktig, alt som skjer blir registrert med Skriv-utdata … | Ut-fil-legg til i en logg (inkludert tid, bruker, SID, gammel og ny verdi osv.).
$hora = Get-Date
"Hora: $hora ; Usuario: $usuario ; ClaveOriginal: $valorOld ; NuevaClave: $valor ; SID: $sid" |
Out-File -FilePath "\\SERVIDOR\RUTA\usuarios.log" -Append
For å slå av på en ren måte, slett midlertidige filer med Fjerne gjenstandEn sikkerhetsdetalj: Ut-fil - Legg til opprettholder en gjennomgående lesbar historikk, noe som er verdifullt for senere revisjoner hvis noe går galt.
Out-Host, Out-Null og Out-Printer: Når de betyr noe og når de ikke gjør det
Vi har allerede hintet om det: Utevert I bunn og grunn sender den kommandoen til verten (konsollvinduet). Hovedfunksjonen er paginering med -Paging i lange lister, alltid plassert på slutten av pipelinen for ikke å avbryte kjeden.
Ut-Null Det er vasken. Alt som kommer inn i den blir umiddelbart kastet. Den brukes til kommandoer med bivirkninger når resultatet ikke tilfører verdi. Husk at eliminerer ikke feilHvis bestillingen ikke finnes eller mislykkes, vil du fortsatt se meldingen.
Hvis du trenger det skrive utPå Windows Du har Out-Printer. Du kan sende utskriften til standardskriveren eller angi visningsnavnet (som en skriverdriver til en fil), så tar PowerShell seg av resten.
Finjustering: format, ANSI og bredde uten overraskelser
Siden Out-File formaterer med samme system som konsollen, kan resultatet noen ganger bli avkortet. Kontroller bredden Bruk av -Width eller den globale standarden unngår disse problemene når du lagrer brede tabeller.
Fra PowerShell 7.2 Du kan kontrollere hvordan ANSI-escape-sekvenser håndteres ved å bruke $PSStyle.OutputRenderingHvis resultatet inneholder farger eller andre dekorasjoner, og du vil beholde eller deaktivere denne oppførselen ved eksport, må du angi denne innstillingen før du skriver til filen.
I versjoner som Windows PowerShell 5.1Standardformatet for Out-File var Unicode. I dag, med moderne PowerShell, er standardformatet utf8Ingen bomullsstruktur, som vanligvis er den mest kompatible. Hvis et eldre verktøy insisterer på ASCII, angi dette med -Encoding ascii. Og hvis du jobber med verktøy fra den lokale kulturen, ansi (siden 7.4) er en praktisk snarvei.
Raske tips for god praksis
Når du kan, velg Ut-fil fremfor Omdirigering Hvis du trenger å kontrollere koding, bredde eller oppførsel til en eksisterende fil. Omdirigering er rask, men mindre eksplisitt, og oppførselen med native versjoner ble endret i 7.4.
Når du skriver gjentatte ganger i løpet av en løkke, prioriter samle og skrive bare én gang eller, hvis du må skrive via iterasjon, bruk -Append og unngå å blande flere destinasjoner parallelt som kan konkurrere om den samme filen.
Hvis skriptet ditt må lagres i en egen mappe, bruk $PSScriptRootHvis det er en interaktiv økt, $PWD. Med Bli med-sti du beskytter deg mot separatorfeil og forbedrer portabiliteten.
Når målet er etterbehandlingVurder å bruke Export-CSV eller ConvertTo-Json i stedet for formatert tekst. Hvis menneskelig lesbarhet er prioriteten (rapporter, logger), er Out-File perfekt.
For sjeldne ruter med spesialtegn, -LiteralPath Det sparer deg for hodebry. Og husk at Out-File ikke returnerer utdata til pipelinen: hvis du trenger å både skrive ut og lagre, bruk Tee-objekt å duplisere flyter.
Hvis du genererer tabellrapporter, bør du vurdere format deg selv med Format-tabell o Formatliste før skriving. Å kontrollere formatet på forhånd gir mer stabile resultater og unngår avhengighet av konsollbredden.
Det vanlige cmdlet-økosystemet (-Verbose, -ErrorAction osv.) gjelder også her. Aktiv - Utførlig under testing for å se hva som skjer og deaktivere det i produksjon hvis du ikke vil ha støy.
Denne turen gir deg et tydelig kart: Ut-fil og selskapet tjener til å materialisere det som tidligere var objekter i filer, skrivere eller selve konsollen. Med riktig kombinasjon av Riktig koding, bredde og rekkefølge for pipeline, vil rapportene og loggene dine være pålitelige, lesbare og klare til deling eller arkivering.
Lidenskapelig forfatter om verden av bytes og teknologi generelt. Jeg elsker å dele kunnskapen min gjennom å skrive, og det er det jeg skal gjøre i denne bloggen, vise deg alle de mest interessante tingene om dingser, programvare, maskinvare, teknologiske trender og mer. Målet mitt er å hjelpe deg med å navigere i den digitale verden på en enkel og underholdende måte.
