- Základní metody pro výstup výsledků PowerShellu do souborů
- Operátoři přesměrování (> a >>)
- Rutina out-File versus operátory přesměrování (> a >>)
- Pokročilé techniky výstupu souborů
- Výstupní formátování a kódování
- Zpracování specifických výstupních toků
- Alternativní metody pro výstup
- .Net třídy
- Osvědčené postupy pro výstup souborů PowerShell
- Nastavte správnou šířku čáry, abyste zabránili oříznutí
- Nastavte správné kódování
- Použijte $PSDefaultParameterValues k nastavení výchozích hodnot pro skripty
- Kombinujte Out-File s Format-Table a Format-List pro lepší strukturovaný výstup
- Chcete-li ji však použít s rutinou Out-File, zvažte následující:
- Zabraňte konfliktům souborů s Test-Path, abyste před zápisem ověřili, zda soubory existují
- Níže jsou uvedeny kroky, které byste měli dodržovat:
- Běžná úskalí a řešení
- Nejčastější dotazy
- Podobné příspěvky
Každý, kdo zná PowerShell, ví, že výstup příkazů PowerShellu se standardně zobrazuje v terminálu. Mohou však nastat situace, kdy budete chtít výstup přesměrovat nebo uložit do souboru.
- Příkazy mohou vracet velké množství dat, které je obtížné zpracovat v reálném čase. Tato data můžete přesměrovat nebo uložit, abyste je mohli zpracovat nebo zkontrolovat.
- Chcete-li použít výsledky příkazu v jiném procesu nebo skriptu, můžete použít příkaz PowerShell output to file k uložení výstupu do souboru nebo proměnné pro snadné opětovné použití.
- Naplánované úlohy nebo jiné automatizované úlohy obvykle často běží na pozadí. Výstup možná neuvidíte v reálném čase, takže jeho uložení vám umožní prohlédnout si jej později.
- Někdy může výstup obsahovat více informací, než potřebujete. Můžete jej proto přesměrovat nebo uložit a filtrovat a formátovat.
- Když spouštíte příkazy na vzdálených systémech, možná nebudete mít přístup ke konzole pro zobrazení výstupu v reálném čase. Uložením nebo přesměrováním získáte záznam toho, co se stalo na vzdáleném systému.
- Organizace generují zprávy na základě stavu systému, konfigurací nebo metrik výkonu. Pomocí PowerShellu mohou dotazovat systémová data, generovat sestavy a vydávat je do souboru pro budoucí kontrolu.
- PowerShell lze použít ke shromažďování informací o inventáři hardwaru a softwaru pro správu aktiv a dodržování předpisů. Tato data lze poté odeslat do souboru pro lepší viditelnost a zjednodušenou správu.
- Při automatizaci úkolů je nezbytné sledovat provedené akce a výsledky. Přesměrování výstupu do souboru pomáhá vytvářet protokoly pro auditování.
- Pokud skript selže, musíte znát hlavní příčinu. Uložením výstupu si jej můžete později prohlédnout za účelem zpracování chyb, ladění a odstraňování problémů.
Stručně řečeno, přesměrování nebo uložení výstupu PowerShellu zvyšuje produktivitu, pomáhá s laděním, poskytuje užitečné protokoly a usnadňuje automatizaci, zejména ve složitých pracovních postupech nebo při práci s velkými datovými sadami.
Základní metody pro výstup výsledků PowerShellu do souborů
Rutina Out-File
Metoda PowerShell zápisu do textového souboru běžně používá rutinu Out-File k odesílání výsledků příkazů (výstupu) přímo do souboru. Ve své nejjednodušší podobě Out-File vyžaduje zadání cesty a souboru, do kterého se má výstup zapsat.
Ve výchozím nastavení rutina přepíše existující soubor, pokud v zadané cestě existuje soubor se stejným názvem, nebo vytvoří nový, pokud neexistuje.
Syntaxe mimo soubor
Zde je základní syntaxe rutiny Out-File:
Out-File
[-FilePath]
[[-Encoding] ]
[-Append]
[-Force]
[-NoClobber]
[-Width ]
[-NoNewline]
[-InputObject ]
[-WhatIf]
[-Confirm]
[]
Parametry
Rutina PowerShell Out-File přijímá následující parametry:
Parametr | Popis |
-Cesta k souboru | Nastaví cestu a název výstupního souboru |
-Kódování <Kódování> | Nastaví kódování pro výstupní soubor. Možnosti zahrnují ASCII, UTF8, UTF7, Unicode atd. Výchozí hodnota je utf8NoBOM. |
-Připojit | Přidá výstup na konec souboru bez přepsání existujícího obsahu |
-Platnost | Přepíše atribut jen pro čtení a přepíše existující soubor jen pro čtení. Tento parametr nepřepisuje bezpečnostní omezení. |
-NoClobber | Zabraňuje přepsání existujícího souboru. Ve výchozím nastavení, pokud soubor v zadané cestě existuje, rutina Out-File soubor bez varování přepíše. |
-Šířka | Omezuje počet znaků na každém řádku ve výstupním souboru (výchozí 80). Jakékoli další znaky jsou oříznuty, nikoli zalomeny. |
-NoNewLine | Určuje, že obsah zapsaný do výstupního souboru nekončí znakem nového řádku. Mezi výstupní řetězce se nevkládají žádné mezery ani nové řádky a za poslední výstupní řetězec se nepřidává žádný nový řádek. |
-InputObject | Určuje objekty, které mají být zapsány do souboru. Zadejte příkaz nebo výraz, který objekty získá, nebo zadejte proměnnou, která objekty obsahuje. |
-Co kdyby | Spustí rutinu v testovacím režimu, aby se zobrazily očekávané výsledky rutiny |
-Potvrdit | Před spuštěním rutiny se zobrazí výzva k potvrzení |
Případy použití
Chcete-li výstup zapisovat přímo do souboru, nikoli jej zobrazovat na obrazovce, můžete použít postup zápisu výstupu PowerShellu do souboru připojením rutiny Out-File k příkazu nebo proměnné prostředí PowerShell. Tato technika také funguje pro zápis textového řetězce do souboru připojením Out-File přímo k řetězci.
Připojte Out-File k rutině PowerShell
Chcete-li načíst seznam běžících procesů a použít metodu uložení výstupu do souboru PowerShellu, uložte výstup do textového souboru s názvem „Procesy“ ve složce C:\Temp s následujícím příkladem:
Get-Process | Out-File -FilePath C:\Temp\processes.txt
Zde rutina Get-Process zobrazí seznam všech běžících procesů. Díky funkci výstupu z potrubí PowerShell do souboru můžete převzít výstup příkazu a okamžitě jej uložit do textového souboru pro pozdější analýzu.
Připojit Out-File k textovému řetězci
Chcete-li zapsat řetězec pomocí metody zápisu řetězce PowerShell do souboru, například přidáním „Ahoj, světe!“ do textového souboru s názvem „Test“ v umístění C:\Temp použijte následující rutinu:
"Hello, World!" | Out-File -FilePath C:\Temp\Test.txt
Pokud soubor neexistuje, bude vytvořen. Pokud existuje, obsah bude ve výchozím nastavení přepsán.
Připojit Out-File k proměnné
Můžete také použít rutinu Out-File s proměnnou. Například:
$variable | Out-File -FilePath "C:\path\to\file.txt"
Zde $variable je proměnná, která obsahuje data (např. výstup PowerShellu do textového souboru nebo výstup příkazu), která chcete odeslat do souboru.
Operátoři přesměrování (> a >>)
Operátory přesměrování (> a >>) v PowerShellu jsou jednoduchou a rychlou alternativou k rutině Out-File, která umožňuje přesměrovat výstup do souboru.
- Operátor > je ekvivalentní rutině Out-File bez dalších parametrů. Přepíše soubor, pokud existuje, nebo vytvoří nový, pokud neexistuje.
- Operátor >> je ekvivalentní k Out-File -Append. Připojí výstup k souboru, pokud existuje, nebo vytvoří nový, pokud neexistuje.
Tyto operátory mají také další využití, jako je chybové přesměrování nebo podrobné výstupní proudy, což je nad rámec tohoto článku.
Základní syntaxe
Základní syntaxe pro použití operátorů je následující:
> # Overwrites
>> # Appends
Všimněte si, že operátory přesměrování nepoužívají žádné parametry.
Příklad 1 – Použití > operátoru
Tato rutina zapíše výstup Get-Process do souboru Processes.txt a přepíše veškerý existující obsah v případě, že soubor s tímto názvem již v cílovém umístění existuje.
Get-Process > C:\Temp\Processes.txt
Příklad 2 – Použití operátoru >>
Tato rutina připojí aktuální datum a čas na konec souboru log.txt, aniž by přepsal stávající obsah.
Get-Date >> C:\Temp\log.txt
Pokud soubor s názvem log.txt na zadané cestě neexistuje, vytvoří soubor a zapíše do něj aktuální datum a čas.
Rutina out-File versus operátory přesměrování (> a >>)
Operátory rutiny Out-File i přesměrování mohou zapisovat a připojovat výstup PowerShellu do souboru. Klíčové rozdíly mezi těmito dvěma jsou popsány níže.
Funkce | Rutina mimo soubor | Operátoři přesměrování (> a >>) |
Parametry | Přijímá parametry | Neakceptuje parametry |
Přepisovací chování | Výchozí je přepsat; používá -Append pro připojení a -NoClobber, aby se zabránilo přepsání | > přepíše, >> připojí Žádný vestavěný ovládací prvek, který by zabránil přepsání |
Kontrola kódování | Umožňuje specifikovat kódování pomocí -Encoding | Omezené ovládání kódování (UTF-8 v PowerShell 6+, Unicode ve starších verzích) |
Ovládání šířky | Podporuje nastavení šířky čáry pomocí -Width | Žádná kontrola nad šířkou čáry |
Zpracování chyb | Exportují se pouze úspěšné výsledky, takže se do souboru nezapisují varování ani chyby | Může určit, který stream chcete exportovat, například úspěch, chyba, varování atd. |
Použití ve skriptech | Nejlepší pro skripty, které vyžadují větší kontrolu nad výstupem | Rychlé a pohodlné pro jednoduché přesměrování |
Kdy použít každý
Ve srovnání s tím je rutina Out-File všestrannější a ideální pro složité skripty s možnostmi pro kódování, šířku a kontrolu přepisování. Operátory přesměrování jsou však rychlé a pohodlné pro úlohy rychlého výstupu, které nevyžadují přizpůsobení. Následuje stručný návod, kdy byste měli každý z nich použít.
Kdy použít rutinu Out-File
- Pro specifické kódování (např. ASCII, UTF8, Unicode)
- Chcete-li se vyhnout přepsání souborů (pomocí -NoClobber)
- Pro kontrolu nad šířkou řádku výstupu (pomocí -Width)
- V režimu připojení při zachování dalších možností řízení výstupu
Kdy použít > a >>
- Když chcete rychlé přesměrování pro výstup bez dalšího formátování nebo kódování
- Při přepisování (>) nebo přidávání (>>) je žádoucí existující soubor
Pokročilé techniky výstupu souborů
Spravovat přepsání
Ve výchozím nastavení rutina Out-File přepíše existující soubor, pokud v zadané cestě existuje soubor se stejným názvem, nebo vytvoří nový soubor, pokud neexistuje.
Chcete-li zabránit přepsání existujícího souboru, můžete použít metodu PowerShell zápisu do souboru připojit jedním ze dvou způsobů:
- Přidejte (připojte) výstup do existujícího souboru
- Zabránit přepsání s tím výsledkem, že stávající soubor nebude přepsán a výstup nebude uložen do souboru
Připojit výstup
Pomocí parametru -Append s rutinou Out-File přidejte nový výstup na konec zadaného souboru, aniž byste přepsali jeho stávající obsah. To je zvláště užitečné, když například chcete zaznamenávat události postupně bez ztráty předchozích dat.
Tento příkaz připojí pět nejnovějších položek ze systémového protokolu k souboru event_log.txt.
Get-EventLog -LogName System -Newest 5 | Out-File -FilePath C:\Temp\event_log.txt -Append
Operátor přesměrování >> můžete také použít k připojení výstupu k existujícímu souboru. V následujícím příkladu jsou stav a podrobnosti služeb na vašem lokálním počítači připojeny k obsahu v souboru log.txt.
Get-Service >> C:\Temp\log.txt
Zabránit přepsání
Použijte parametr -NoClobber s rutinou Out-File, abyste zabránili přepsání. Pokud tedy v zadaném umístění existuje soubor se stejným názvem, PowerShell jej nepřepíše a nevyvolá chybu. To pomáhá chránit důležité soubory.
Následující příkaz se pokusí vytvořit soubor s názvem log.txt ve složce Temp. Pokud však soubor s tímto názvem již existuje, zobrazí se chyba a výstup nebude uložen do souboru.
Get-Service | Out-File -FilePath C:\Temp\log.txt -NoClobber
Vynutit přepsání
Někdy se vám nedaří přepsat obsah existujícího souboru výstupem rutiny PowerShell, protože soubor je pouze pro čtení. V situaci, jako je tato, použijte parametr -Force s rutinou Out-File k přepsání souborů pouze pro čtení.
Tato rutina zapíše informace o službách do souboru Services.txt a zajistí, že pokud soubor Services.txt již existuje, bude přepsán, i když je pouze pro čtení.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Force
Výstupní formátování a kódování
Rutina Out-File PowerShellu poskytuje možnosti přizpůsobení formátování a kódování výstupu.
Formát výstupu
Rutina Out-File nemusí zobrazit výstup podle očekávání, zejména pokud má výstup více sloupců. Pro formátovaný a čitelný výstup můžete upravit šířku nebo použít rutinu Format-Table.
Příklad 1 – Nastavte šířku
Pomocí parametru -Width s Out-File zadejte šířku řádku pro výstupní soubor (80 znaků je výchozí).
Tato rutina zapíše informace o službách do souboru Services.txt, přičemž nastaví šířku řádku na 200 znaků. To umožňuje širší výstup bez balení.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Width 200
Příklad 2 – Formátování pomocí formátovací tabulky
Pomocí rutiny Format-Table strukturujte data před jejich odesláním do rutiny Out-File.
Tato rutina používá Format-Table -AutoSize k automatické úpravě šířky sloupců kvůli čitelnosti.
Get-Service | Format-Table -AutoSize | Out-File -FilePath C:\Temp\Services.txt
Nastavte kódování
Kódování výstupu v prostředí PowerShell při použití rutiny Out-File zajišťuje, že data budou správně interpretována, zobrazena a kompatibilní napříč různými systémy a aplikacemi.
Parametr -Encoding pomáhá určit, jak je výstupní text kódován v souboru. Mezi běžné typy kódování patří:
- UTF8 – Společné pro webové aplikace, podporuje všechny znaky.
- ASCII – Omezeno na základní anglické znaky, kompaktní, ale omezující.
- Unicode (UTF-16) – Dobré pro kompatibilitu se systémem Windows, dokáže zpracovat širokou škálu speciálních znaků, symbolů a mezinárodního textu, ale zabírá více místa.
- Výchozí – používá výchozí kódování systému, které se může lišit a může být nepředvídatelné na různých platformách.
Příklad 1 — Použití kódování UTF-8
Je vhodné použít kódování UTF-8, pokud výstupní soubor obsahuje speciální znaky nebo bude soubor použit v prostředích, kde je standardní kódování UTF-8.
Tato rutina načte seznam služeb v systému a odešle informace do souboru Services.txt, přičemž nastaví kódování souboru na UTF-8.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Encoding UTF8
Příklad 2 — Použití kódování ASCII
Kódování ASCII se běžně používá pro jednodušší textové soubory.
Tato rutina načte seznam služeb v systému a převede výstupy do souboru Services.txt. Parametr -Encoding se používá k převodu výstupu do formátu ASCII.
Get-Service | Out-File -FilePath C:\Temp\Services.txt -Encoding ASCII
Zpracování specifických výstupních toků
Rutina Out-File zapíše úspěšný výsledek vašeho příkazu nebo skriptu do souboru. Do souborů však nezapisuje chyby, varování ani konkrétní typy zpráv. Toho lze dosáhnout pomocí operátoru přesměrování, který vám umožňuje určit, který proud chcete odeslat do souboru.
Operátor | Popis / Stream | Napište cmdlet |
> | Pouze úspěch | Zápis-výstup |
2> | Pouze chyba | Chyba zápisu |
3> | Pouze varování | Zápis-Upozornění |
4> | Pouze upovídané | Write-verbose |
5> | Pouze ladění | Write-Debug |
6> | Pouze informace | Napište-informace |
*> | Vše |
Příklad 1 — Odeslání chybových zpráv do souboru
Tento příkaz se pokusí vypsat (ls) soubor s názvem Readme. Pokud nezadáte cestu, hledá soubor v aktuálním adresáři. Pokud soubor neexistuje, vygeneruje chybovou zprávu. Operátor 2> tuto chybu přesměruje do souboru s názvem error.log. V důsledku toho se chyba nezobrazí na obrazovce, ale uloží se do souboru error.log ve složce Temp.
ls Readme 2> C:\Temp\error.log
Příklad 2 — Odeslání upozornění do souboru
V PowerShellu je stream varování stream číslo 3. K přesměrování varování do souboru můžete použít 3>: Je to takto:
# Příkaz, který generuje varování
3> C:\Temp\warning_log.txt
Alternativní metody pro výstup
Rutiny Set-Content a Add-Content
Rutiny Set-Content a Add-Content jsou dalším způsobem zápisu výstupu do souboru.
- Set-Content přepíše stávající obsah v souboru novým poskytnutým obsahem. Pokud soubor neexistuje, vytvoří jej.
- Add-Content připojí nový obsah na konec existujícího obsahu souboru. Pokud soubor neexistuje, vytvoří jej, ale nenahradí stávající obsah.
Rutina Set-Content
K zápisu nebo nahrazení obsahu souboru novým obsahem použijte rutinu Set-Content.
Tato rutina přepíše stávající obsah v souboru Test.txt. Parametr -Value určuje obsah nebo text, který nahradí stávající obsah.
Set-Content -Path C:\Temp\Test.txt -Value "Add content here"
Rutina Add-Content
Pomocí rutiny Add-Content přidejte obsah do souboru, což znamená, že můžete k existujícímu souboru připojit nová data, aniž byste jej přepisovali. Add-Content může také připojit obsah k více souborům najednou.
Stejně jako rutina Out-File a operátor přesměrování vytvoří rutina Add-Content nový soubor, pokud soubor se stejným názvem neexistuje.
Příklad 1 — Připojení textu k souboru
Tato rutina přidá nový text do souboru Test.txt. Parametr -Value určuje obsah nebo text, který chcete k souboru připojit.
Add-Content -Path C:\Temp\Test.txt -Value "New line to add"
Pokud je soubor pouze pro čtení, musíte použít parametr -Force, aby bylo možné přidat obsah.
Příklad 2 — Připojení textu k více souborům
Chcete-li přidat stejný obsah do více souborů, máte několik možností.
- Použijte zástupné znaky v cestě k určení souborů, které chcete aktualizovat
- Vylučte názvy souborů, které nechcete aktualizovat
Tato rutina přidá aktuální datum do všech souborů .txt ve složce Temp, kromě souboru s testem v názvu souboru:
Add-Content -Path C:\Temp\files\*.txt -Value (Get-Date) -Exclude "test*"
Příklad 3 — Přidání více řádků textu
Tento příkaz přidá do souboru Test.txt více řádků textu.
$lines = @(
"Line 1: Details",
"Line 2: Specific Details"
)
Add-Content -Path C:\Temp\Test.txt -Value $lines
.Net třídy
Třídy .NET můžete použít k vytvoření výstupu do souboru, zejména v pokročilých scénářích zahrnujících zpracování velkých dat. Tyto třídy jsou:
- BinaryWriter – Zapisuje primitivní datové typy v binární formě do proudu.
- StreamWriter – Používá se pro zápis znaků do streamu ve specifickém kódování. Často se používá pro vytváření nebo úpravu textových souborů.
- StringWriter – zapisuje informace do řetězce. S touto třídou PowerShell ukládá informace o řetězcích do objektu StringBuilder.
Použití třídy StreamWriter v C# k odeslání výstupu do souboru je jednoduché. Následující příklad ukazuje, jak jej můžete použít.
# 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()
Tento skript provádí následující kroky k vypsání adresářů na jednotce C:\ a uložení jejich cest do textového souboru:
Krok 1:
$Dirs = Get-ChildItem -Path C:\ -Directory
Tento řádek používá Get-ChildItem s parametrem -Directory k získání pouze adresářů (nikoli souborů) na jednotce C:\. Výsledek je uložen v proměnné $Dirs jako seznam objektů adresáře.
Krok 2:
$File = 'C:\Temp\Dirs.txt'
$Stream = [System.IO.StreamWriter]::new($File)
Tyto řádky nastavují cestu k souboru (C:\Temp\Dirs.txt), kam bude uložen seznam adresářů, a potom inicializují objekt StreamWriter pro zápis do tohoto souboru. Tento objekt je přiřazen k $Stream.
Krok 3:
foreach($Dir in $Dirs) {
$Stream.WriteLine($Dir.FullName)
}
Tato smyčka prochází každým objektem adresáře v $ Dirs. Pro každý adresář zapíše úplnou cestu ($Dir.FullName) k souboru pomocí $Stream.WriteLine.
Krok 4:
$Stream.Close()
Po zapsání všech cest k adresáři skript zavře StreamWriter.
Osvědčené postupy pro výstup souborů PowerShell
Nastavte správnou šířku čáry, abyste zabránili oříznutí
Měli byste nastavit správnou šířku řádku pomocí parametru -Width v PowerShell, abyste zabránili ořezávání dlouhých řádků a zajistili, že výstupy souborů budou formátovány podle plánu.
Parametr -Width v rutině Out-File řídí maximální počet znaků na řádek ve výstupu. Ve výchozím nastavení je nastaveno na 80 znaků, což může zkrátit delší řádky. Můžete například zvětšit šířku na 200 znaků, jak je uvedeno níže:
Get-Process | Out-File -FilePath "output.txt" -Width 200
Zvažte následující:
- Chcete-li se vyhnout zbytečnému prázdnému místu nebo zkrácení, nastavte -Width tak, aby odpovídala nejdelšímu řádku. U většiny výstupů by měla dobře fungovat šířka 120–200 znaků.
- U dat s mnoha sloupci (jako je soubor CSV) nastavte větší šířku, aby se vešla celá čára.
- V potrubí použijte Out-String -Width k ovládání šířky čáry a ujistěte se, že se celá čára vejde do zadané šířky před připojením k Out-File.
Nastavte správné kódování
Výchozí kódování, které PowerShell používá, se liší v závislosti na rutině a verzi PowerShellu, kterou používáte. Následující tabulka ukazuje použité výchozí kódování:
Rutina / Operátor | PowerShell 5.1 (a starší) Výchozí kódování | Výchozí kódování PowerShell Core / PowerShell 7+ |
Out-File, Set-Content, Add-Content | UTF-16LE (Unicode) | UTF-8 (bez kusovníku) |
>, >> (přesměrování) | ASCII | UTF-8 (bez kusovníku) |
Pro kompatibilitu mezi systémy se doporučuje kódování UTF-8. U starších systémů však možná budete chtít zadat -Encoding ASCII nebo -Encoding Unicode.
Použijte $PSDefaultParameterValues k nastavení výchozích hodnot pro skripty
$PSDefaultParameterValues v PowerShellu umožňuje nastavit výchozí hodnoty pro parametry napříč skripty a relacemi a nabízí způsob, jak vynutit konzistenci bez opakovaného zadávání možností.
Zde je návod, jak můžete nastavit globální výchozí nastavení pro Out-File pro použití kódování UTF8 a větší šířky.
$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
$PSDefaultParameterValues["Out-File:Width"] = 200
Kombinujte Out-File s Format-Table a Format-List pro lepší strukturovaný výstup
Kombinace rutiny Out-File s formátem Format-Table nebo Format-List je skvělý způsob, jak vytvořit dobře strukturované a čitelné textové výstupní soubory.
Formátovací tabulka
Format-Table je nejlepší pro data s jasnou, řádkovou a sloupcovou strukturou. Vytváří organizovaný, snadno čitelný formát podobný tabulce.
Chcete-li ji však použít s rutinou Out-File, zvažte následující:
- Pomocí parametru -Property zadejte pouze sloupce, které potřebujete. Tím se zabrání nepořádku ve výstupním souboru.
- Použijte parametr -AutoSize k optimalizaci šířky sloupce tak, aby odpovídala obsahu. Tím se sníží nadbytečné prázdné znaky nebo zkrácení.
- Pomocí parametru -Width zabráníte zkrácení a ponecháte výstup zarovnaný.
Zde je příklad:
Get-Process | Format-Table -Property Name, ID, CPU, WS -AutoSize | Out-File -FilePath "ProcessList.txt" -Width 200
Format-List
Format-List zobrazuje data svisle, s jednou vlastností na řádek. Použijte jej, pokud máte mnoho vlastností nebo polí s dlouhými hodnotami, abyste se vyhnuli zkrácení takových hodnot. Tento formát je vhodný pro sestavy a podrobné protokoly.
Zde je příklad použití Format-List s Out-File:
Get-Process | Format-List -Property Name, ID, CPU, StartTime | Out-File -FilePath "DetailedProcessList.txt"
Stejně jako u Format-Table vyberte pouze vlastnosti, které potřebujete.
Zabraňte konfliktům souborů s Test-Path, abyste před zápisem ověřili, zda soubory existují
Před pokusem o zápis do souboru je vždy moudré zkontrolovat, zda soubor existuje. Tímto způsobem se můžete vyhnout náhodnému přepsání a rozhodnout, co dělat, když soubor již existuje. Rutina Test-Path v prostředí PowerShell umožňuje zkontrolovat existenci souboru.
Níže jsou uvedeny kroky, které byste měli dodržovat:
- Přiřaďte cestu k souboru proměnné.
- Pomocí rutiny Test-Path zkontrolujte, zda soubor existuje.
- Rozhodněte se, zda chcete přidat, přepsat, přejmenovat nebo přeskočit zápis.
- K vytvoření nebo zápisu do souboru použijte rutinu Out-File.
Běžná úskalí a řešení
Rutina Out-File v PowerShellu může někdy vést k běžným úskalím, zejména kolem manipulace se soubory, kódování a přidávání obsahu. Některé běžné problémy a jejich řešení jsou popsány níže.
Vyhněte se ztrátě dat přepsáním
Ve výchozím nastavení rutina Out-File přepíše obsah existujícího souboru bez varování, pokud již soubor se stejným názvem existuje. Některé způsoby, jak se tomu vyhnout, jsou:
- Přidejte výstup do existujícího souboru a nepřepisujte jej pomocí parametru -Append.
- Zkontrolujte, zda soubor existuje pomocí Test-Path a rozhodněte se, jak chcete pokračovat s Out-File.
Zabraňte ztrátě dat v důsledku nesprávného kódování
Ve výchozím nastavení používá Out-File kódování Unicode v prostředí PowerShell 5.1 a dřívějších verzích. Používá kódování UTF-8 v PowerShell Core a novějších verzích.
Výchozí kódování nemusí být kompatibilní s vaším systémem nebo aplikacemi, které očekávají jiné kódování. Proto byste měli specifikovat kódování explicitně pomocí parametru -Encoding.
Spravujte výstup v dlouhotrvajících skriptech, abyste zajistili výkon
V omezených prostředích, jako je PowerShell ISE, může spouštění skriptů pomocí rutiny Out-File vést k problémům, jako jsou:
- Selhání zpracování složitých datových struktur podle očekávání
- Zkrácení dlouhého výstupu
Chcete-li spravovat dlouhý výstup, můžete:
- Pomocí parametru -Width nastavte vhodnou šířku
- Exportujte komplexní data do strukturovaných formátů, jako je CSV nebo JSON, pomocí rutin Export-Csv nebo ConvertTo-Json
Zvládejte protokolování a zpracování chyb ve skriptech PowerShellu
Někdy je soubor používán nebo uzamčen jiným procesem. V tomto případě rutina Out-File vyvolá chybu, protože do ní nebude moci zapisovat. Tuto a další chyby můžete vyřešit pomocí bloku try/catch.
Příklad je následující:
$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."
}
Nejčastější dotazy
Jak připojím výstup k souboru v PowerShellu?
Ve výchozím nastavení rutina Out-File přepíše existující soubor, pokud na zadané cestě existuje soubor se stejným názvem. Abyste se vyhnuli přepsání, připojte výstup k existujícímu souboru. K tomu použijte operátor >> nebo rutinu Out-File s parametrem -Append.
Chcete-li získat seznam procesů a připojit výstup k souboru process.txt, můžete použít:
Get-Process >> "C:\Temp\processes.txt"
Nebo
Get-Process | Out-File -FilePath "C:\Temp\processes.txt" -Append
Jak zabráním přepsání souboru?
Použijte parametr -NoClobber s rutinou Out-File, abyste zabránili přepsání. Podrobnosti naleznete v části Správa přepsání.
Jaký je rozdíl mezi Out-File a Set-Content?
Rutiny Out-File i Set-Content v PowerShellu zapisují obsah do souboru, ale liší se ve funkčnosti.
- Out-File formátuje a vydává data přesně tak, jak jsou zobrazena v konzole. Dokáže pracovat s kanály a zvládne složité formátování, jako jsou tabulky nebo podrobné výsledky příkazů.
- Set-Content zapisuje data jako prostý text bez jakéhokoli formátování.
Následující tabulka shrnuje rozdíly:
Funkce | Out-File | Set-Content |
Výchozí akce | Přepíše (lze použít -Append k připojení) | Přepíše (pro připojení použijte Add-Content) |
Formátování | Zachovává formátování podobné konzoli | Prostý text, žádné formátování |
Kódování | Ano | Ano |
Mohu exportovat pouze chybové zprávy do souboru protokolu?
Pomocí PowerShellu můžete exportovat pouze chybové zprávy do souboru protokolu. Operátor přesměrování 2> se používá k přesměrování chybového proudu do souboru.
Příklad 1:
Zde je návod, jak můžete spustit příkaz a přesměrovat chybové zprávy do souboru protokolu.
2> C:\Temp\error_log.txt
Příklad 2:
Tento příkaz pouze zaznamená chybové zprávy, pokud existují, do C:\Temp\error_log.txt a ignoruje ostatní výstupy.
Get-Content "C:\NonExistentFile.txt" 2> C:\Temp\error_log.txt
Další informace naleznete v části Zpracování specifických výstupních toků.
Jak zapíšu data do souboru CSV nebo JSON?
Rutiny Export-Csv a ConvertTo-Json umožňují zapisovat data do souboru CSV nebo JSON.
Chcete-li zapsat data do souboru CSV, postupujte takto:
- Připravte si data ve formátu, jako je pole objektů nebo vlastní objekt PowerShellu.
- K zápisu do souboru použijte Export-Csv.
Následující příklad ukazuje ukázková data jako pole vlastních objektů, které budou zapsány do souboru.
$data = @(
[pscustomobject]@{Name="Anne"; Age=40; Department="HR"},
[pscustomobject]@{Name="Leo"; Age=35; Department="IT"},
[pscustomobject]@{Name="Sarah"; Age=28; Department="Finance"}
)
$data | Export-Csv -Path "C:\Temp\data.csv" -NoTypeInformation
Chcete-li zapsat data do souboru JSON, postupujte takto:
- Připravte si data ve formátu, jako je pole objektů nebo vlastní objekt PowerShellu.
- Pomocí ConvertTo-Json převeďte data do formátu JSON.
- Propojte výstup JSON do Out-File.
Následující příklad ukazuje ukázková data jako pole vlastních objektů, které budou převedeny do formátu JSON a uloženy do souboru.
$data = @(
[pscustomobject]@{Name="Anne"; Age=40; Department="HR"},
[pscustomobject]@{Name="Leo"; Age=35; Department="IT"},
[pscustomobject]@{Name="Sarah"; Age=28; Department="Finance"}
)
$data | ConvertTo-Json | Out-File -FilePath "C:\Temp\data.json"