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. RutinuOut-File
obvykle použijete, když potřebujete použít jeho parametry, napříkladEncoding
,Force
,Width
neboNoClobber
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í pipinguOut-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 $ErrorActionPreference
proudu 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 $PSDefaultParameterValues
té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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro