about_Redirection

Krátký popis

Vysvětluje, jak přesměrovat výstup z PowerShellu na textové soubory.

Dlouhý popis

PowerShell ve výchozím nastavení odesílá výstup do hostitele PowerShellu. Obvykle se jedná o konzolovou aplikaci. Výstup ale můžete přesměrovat do textového souboru a výstup chyby můžete přesměrovat do běžného výstupního datového proudu.

Výstup můžete přesměrovat pomocí následujících metod:

  • Použijte rutinu Out-File , která odesílá výstup příkazu do textového souboru. Rutinu Out-File obvykle použijete, když potřebujete použít jeho parametry, například Encoding, Force, Widthnebo NoClobber parametry.

  • Použijte rutinu Tee-Object , která odešle výstup příkazu do textového souboru a odešle ho do kanálu.

  • Použijte operátory přesměrování PowerShellu. Přesměrování výstupu příkazu PowerShellu (rutina, funkce, skript) pomocí operátoru přesměrování (>) je funkčně ekvivalentní pipingu Out-File bez dalších parametrů. PowerShell 7.4 změnil chování operátoru přesměrování při použití k přesměrování streamu stdout nativního příkazu.

Další informace o datových proudech najdete v tématu about_Output_Toky.

Přesměrovatelné výstupní streamy

PowerShell podporuje přesměrování následujících výstupních datových proudů.

Proudu # Popis Představeno v Rutina pro zápis
0 Success Stream PowerShell 2.0 Write-Output
2 Chybový stream PowerShell 2.0 Write-Error
3 Stream upozornění PowerShell 3.0 Write-Warning
4 Podrobný stream PowerShell 3.0 Write-Verbose
5 Ladění streamu PowerShell 3.0 Write-Debug
6 Informační stream PowerShell 5.0 Write-Information, Write-Host
* Všechny Toky PowerShell 3.0

V PowerShellu je také stream Progress , ale nepodporuje přesměrování.

Důležité

Datové proudy Success a Error jsou podobné streamům stdout a stderr jiných prostředí. Stdin se ale ke vstupnímu kanálu PowerShellu nepřipojí.

Operátory přesměrování PowerShellu

Operátory přesměrování PowerShellu jsou následující, kde n představuje číslo datového proudu. Datový proud Success ( 1 ) je výchozí, pokud není zadán žádný datový proud.

Operátor Popis Syntaxe
> Odeslání zadaného datového proudu do souboru n>
>> Připojte zadaný datový proud k souboru. n>>
>&1 Přesměruje zadaný datový proud na datový proud Úspěch . n>&1

Poznámka:

Na rozdíl od některých unixových prostředí můžete přesměrovat pouze jiné datové proudy do datového proudu Úspěch .

Přesměrování výstupu z nativních příkazů

PowerShell 7.4 změnil chování operátorů přesměrování při použití k přesměrování streamu stdout nativního příkazu. Operátory přesměrování teď při přesměrování výstupu z nativního příkazu zachová data bajtů-stream. PowerShell neinterpretuje přesměrovaná data ani nepřidává žádné další formátování. Další informace najdete v příkladu č. 7.

Příklady

Příklad 1: Chyby a výstup přesměrování do souboru

Tento příklad běží dir na jedné položce, která je úspěšná, a druhá, která selže.

dir C:\, fakepath 2>&1 > .\dir.log

Používá 2>&1 se k přesměrování datového proudu Chyba do datového proudu Success a > k odeslání výsledného datového proudu Success do souboru s názvem dir.log

Příklad 2: Odeslání všech dat datového proudu success do souboru

Tento příklad odešle všechna data datového proudu úspěch do souboru volaný script.log.

.\script.ps1 > script.log

Příklad 3: Odeslání datových proudů Úspěch, Upozornění a Chyba do souboru

Tento příklad ukazuje, jak můžete zkombinovat operátory přesměrování, abyste dosáhli požadovaného výsledku.

&{
   Write-Warning "hello"
   Write-Error "hello"
   Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
  • 3>&1 přesměruje stream Upozornění na datový proud Úspěch .
  • 2>&1 přesměruje datový proud Chyba do datového proudu Úspěch (který teď obsahuje také všechna data datového proudu upozornění ).
  • > přesměruje datový proud Success (který nyní obsahuje upozornění i chybové proudy) do souboru volaný C:\temp\redirection.log.

Příklad 4: Přesměrování všech datových proudů do souboru

Tento příklad odešle všechny streamy výstupu ze skriptu volaný script.ps1 do souboru s názvem script.log.

.\script.ps1 *> script.log

Příklad 5: Potlačení všech dat datového proudu zápisu a informačního proudu

Tento příklad potlačí všechna data datového proudu informací. Další informace o rutinách informačního streamu najdete v tématu Write-Host a Write-Information.

&{
   Write-Host "Hello"
   Write-Information "Hello" -InformationAction Continue
} 6> $null

Příklad 6: Zobrazení efektu předvoleb akcí

Proměnné a parametry předvoleb akcí můžou změnit to, co se zapíše do konkrétního datového proudu. Skript v tomto příkladu ukazuje, jak hodnota ovlivňuje to, co se zapíše do datového $ErrorActionPreferenceproudu Error .

$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
Try {
    get-item /not-here 2>&1 >> log.txt
}
catch {
    "`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Continue'

Když tento skript spustíme, zobrazí se výzva, když $ErrorActionPreference je nastavena hodnota Inquire.

PS C:\temp> .\test.ps1

Confirm
Can't find path 'C:\not-here' because it doesn't exist.
[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
  23 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The running command stopped because the user selected the Stop option.

Když prozkoumáme soubor protokolu, uvidíme následující:

PS C:\temp> Get-Content .\log.txt
Continue

Get-Item: C:\temp\test.ps1:3
Line |
   3 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot find path 'C:\not-here' because it does not exist.

SilentlyContinue
Stop
    Error caught!
Ignore
Inquire

Příklad 7: Přesměrování binárních dat z nativního příkazu

Počínaje PowerShellem 7.4 zachová PowerShell data bajtového streamu při přesměrování streamu stdout nativního příkazu do souboru nebo při propojení dat bajtového streamu do streamu stdin nativního příkazu.

Například pomocí nativního příkazu curl můžete stáhnout binární soubor a uložit ho na disk pomocí přesměrování.

$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'

# native command redirected to a file
curl -s -L $uri > powershell.tar.gz

Data bajtového streamu můžete také směrovat do datového proudu stdin jiného nativního příkazu. Následující příklad stáhne soubor ZIP TAR pomocí curl. Stažená data souboru se streamují do tar příkazu, který extrahuje obsah archivu.

# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .

Výstup bajtového streamu příkazu PowerShellu můžete také přeskakovat na vstup nativního příkazu. Následující příklady používají Invoke-WebRequest ke stažení stejného souboru TAR jako v předchozím příkladu.

# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .

# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .

Tato funkce nepodporuje data bajtů-stream při přesměrování výstupu stderr na stdout. Při kombinování datových proudů stderr a stdout se kombinované datové proudy považují za řetězcová data.

Notes

Operátory přesměrování, které nepřipojují data (> a n>) přepíšou aktuální obsah zadaného souboru bez upozornění.

Pokud je ale soubor jen pro čtení, skrytý nebo systémový soubor, přesměrování selže. Operátory přesměrování připojení (>> a n>>) nezapisují do souboru jen pro čtení, ale připojují obsah k systémovému nebo skrytému souboru.

Pokud chcete vynutit přesměrování obsahu na soubor jen pro čtení, skrytý nebo systémový soubor, použijte rutinu Out-File s jeho Force parametrem.

Při zápisu do souborů používají UTF8NoBOM operátory přesměrování kódování. Pokud má soubor jiné kódování, nemusí být výstup správně naformátovaný. Pokud chcete zapisovat do souborů s jiným kódováním, použijte rutinu Out-File s jeho parametrem Encoding .

Šířka výstupu při zápisu do souboru

Při zápisu do souboru pomocí Out-File operátorů přesměrování PowerShell naformátuje výstup tabulky do souboru na základě šířky konzoly, ve které běží. Například při protokolování výstupu tabulky do souboru pomocí příkazu, jako Get-ChildItem Env:\Path > path.log je v systému, kde je šířka konzoly nastavena na 80 sloupců, výstup v souboru se zkrátí na 80 znaků:

Name                         Value
----                         -----
Path                         C:\Program Files\PowerShell\7;C:\WINDOWS…

Vzhledem k tomu, že šířka konzoly může být nastavena libovolně v systémech, ve kterých se spouští váš skript, můžete raději formátovat výstup tabulky PowerShellu na soubory na základě šířky, kterou zadáte.

Rutina Out-File poskytuje parametr Width , který umožňuje nastavit šířku, kterou chcete použít pro výstup tabulky. Místo toho, abyste museli přidávat -Width 2000 všude, co vyvoláte Out-File, můžete použít $PSDefaultParameterValues proměnnou k nastavení této hodnoty pro všechna použití rutiny Out-File ve skriptu. A vzhledem k tomu, že operátory přesměrování (> a >>) jsou efektivně aliasy pro Out-File, nastavení Out-File:Width parametru pro celý skript má vliv také na šířku formátování operátorů přesměrování. Do horní části skriptu vložte následující příkaz, který nastavíte Out-File:Width pro celý skript:

$PSDefaultParameterValues['out-file:width'] = 2000

Zvýšení šířky výstupu zvýší spotřebu paměti při protokolování výstupu ve formátu tabulky. Pokud do souboru zaznamenáváte velké množství tabulkových dat a víte, že se můžete dostat s menší šířkou, použijte menší šířku.

V některých případech, například Get-Service výstup, abyste mohli použít dodatečnou šířku, budete muset výstup před výstupem do souboru přeskakovat Format-Table -AutoSize .

$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log

Další informace najdete v $PSDefaultParameterValuestématu about_Preference_Variables.

Potenciální nejasnosti s operátory porovnání

Operátor > není zaměňován s relačním operátorem Větší než (často označovaný jako > v jiných programovacích jazycích).

V závislosti na porovnávaných objektech se může zdát, že použití > výstupu je správné (protože 36 není větší než 42).

PS> if (36 > 42) { "true" } else { "false" }
false

Kontrola místního systému souborů však může vidět, že byl zapsán 42 soubor s obsahem 36.

PS> dir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          1/02/20  10:10 am              3 42

PS> cat 42
36

Při pokusu o použití zpětného porovnání < (menší než) dojde k systémové chybě:

PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
   1 |  if (36 < 42) { "true" } else { "false" }
     |         ~
     | The '<' operator is reserved for future use.

Pokud je požadovaná operace -lt číselného porovnání a -gt měla by se použít. Další informace naleznete v operátoru -gt v about_Comparison_Operators.

Viz také