about_Redirection

Krótki opis

Objaśnienie sposobu przekierowywania danych wyjściowych z programu PowerShell do plików tekstowych.

Długi opis

Domyślnie program PowerShell wysyła dane wyjściowe do hosta programu PowerShell. Zazwyczaj jest to aplikacja konsolowa. Można jednak przekierować dane wyjściowe do pliku tekstowego i przekierować dane wyjściowe błędu do zwykłego strumienia wyjściowego.

Następujące metody umożliwiają przekierowanie danych wyjściowych:

  • Out-File Użyj polecenia cmdlet , które wysyła dane wyjściowe polecenia do pliku tekstowego. Zazwyczaj używasz Out-File polecenia cmdlet , gdy musisz użyć jego parametrów, takich jak Encodingparametry , Force, Widthlub NoClobber .

  • Tee-Object Użyj polecenia cmdlet , które wysyła dane wyjściowe polecenia do pliku tekstowego, a następnie wysyła je do potoku.

  • Użyj operatorów przekierowania programu PowerShell. Przekierowywanie danych wyjściowych polecenia programu PowerShell (polecenia cmdlet, funkcji, skryptu) przy użyciu operatora przekierowania (>) jest funkcjonalnie równoważne potokowi bez Out-File dodatkowych parametrów. Program PowerShell 7.4 zmienił zachowanie operatora przekierowania, gdy był używany do przekierowywania strumienia stdout polecenia natywnego.

Aby uzyskać więcej informacji na temat strumieni, zobacz about_Output_Strumienie.

Przekierowywane strumienie wyjściowe

Program PowerShell obsługuje przekierowywanie następujących strumieni wyjściowych.

Strumienia # opis Wprowadzone w Write Cmdlet
1 Strumień powodzenia PowerShell 2.0 Write-Output
2 Strumień błędów PowerShell 2.0 Write-Error
3 Strumień ostrzegawczy PowerShell 3.0 Write-Warning
100 Pełny strumień PowerShell 3.0 Write-Verbose
5 Debugowanie strumienia PowerShell 3.0 Write-Debug
6 Strumień informacji PowerShell 5.0 Write-Information, Write-Host
* Wszystkie Strumienie PowerShell 3.0

W programie PowerShell istnieje również strumień postępu , ale nie obsługuje przekierowania.

Ważne

Strumienie powodzenia i błędu są podobne do strumieni stdout i stderr innych powłok. Jednak stdin nie jest połączony z potokiem programu PowerShell dla danych wejściowych.

Operatory przekierowania programu PowerShell

Operatory przekierowania programu PowerShell są następujące, gdzie n reprezentuje liczbę strumienia. Strumień powodzenia ( 1 ) jest wartością domyślną, jeśli nie określono żadnego strumienia.

Operator Opis Składnia
> Wyślij określony strumień do pliku. n>
>> Dołącz określony strumień do pliku. n>>
>&1 Przekierowuje określony strumień do strumienia Powodzenie. n>&1

Uwaga

W przeciwieństwie do niektórych powłok systemu Unix można przekierowywać tylko inne strumienie do strumienia Powodzenie .

Przekierowywanie danych wyjściowych z poleceń natywnych

Program PowerShell 7.4 zmienił zachowanie operatorów przekierowania, gdy był używany do przekierowywania strumienia stdout polecenia natywnego. Operatory przekierowania zachowują teraz dane strumienia bajtów podczas przekierowywania danych wyjściowych z natywnego polecenia. Program PowerShell nie interpretuje przekierowanych danych ani nie dodaje żadnego dodatkowego formatowania. Aby uzyskać więcej informacji, zobacz Przykład nr 7.

Przykłady

Przykład 1. Błędy przekierowania i dane wyjściowe do pliku

Ten przykład jest uruchamiany dir na jednym elemencie, który się powiedzie, i taki, który kończy się niepowodzeniem.

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

Używa 2>&1 go do przekierowania strumienia błędów do strumienia Powodzenie i > wysyłania wynikowego strumienia powodzenia do pliku o nazwie dir.log

Przykład 2. Wysyłanie wszystkich danych strumienia powodzenia do pliku

W tym przykładzie wszystkie dane strumienia powodzenia są wysyłane do pliku o nazwie script.log.

.\script.ps1 > script.log

Przykład 3. Wysyłanie strumieni powodzenia, ostrzeżenia i błędów do pliku

W tym przykładzie pokazano, jak połączyć operatory przekierowania w celu uzyskania żądanego wyniku.

&{
   Write-Warning "hello"
   Write-Error "hello"
   Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
  • 3>&1przekierowuje strumień ostrzeżenie do strumienia Powodzenie.
  • 2>&1przekierowuje strumień błędu do strumienia Powodzenie (który zawiera również wszystkie dane strumienia ostrzeżenia)
  • > przekierowuje strumień powodzenia (który zawiera teraz strumienie ostrzeżenie i błąd ) do pliku o nazwie C:\temp\redirection.log.

Przykład 4. Przekierowywanie wszystkich strumieni do pliku

Ten przykład wysyła wszystkie strumienie wyjściowe ze skryptu o nazwie script.ps1 do pliku o nazwie script.log.

.\script.ps1 *> script.log

Przykład 5. Pomijanie wszystkich danych strumienia zapisu i informacji

W tym przykładzie pominięto wszystkie dane strumienia informacji. Aby dowiedzieć się więcej na temat poleceń cmdlet strumienia informacji , zobacz Write-Host and Write-Information

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

Przykład 6. Wyświetlanie efektu preferencji akcji

Zmienne i parametry preferencji akcji mogą zmieniać dane zapisywane w określonym strumieniu. Skrypt w tym przykładzie pokazuje, jak wartość wpływa na to $ErrorActionPreference , co jest zapisywane w strumieniu błędów .

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

Po uruchomieniu tego skryptu zostanie wyświetlony monit o $ErrorActionPreference ustawienie .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.

Podczas badania pliku dziennika widzimy następujące elementy:

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

Przykład 7. Przekierowywanie danych binarnych z natywnego polecenia

Począwszy od programu PowerShell 7.4, program PowerShell zachowuje dane strumienia bajtów podczas przekierowywania strumienia stdout polecenia natywnego do pliku lub podczas potokowania danych strumienia bajtów do strumienia stdin polecenia natywnego.

Na przykład za pomocą natywnego polecenia curl można pobrać plik binarny i zapisać go na dysku przy użyciu przekierowania.

$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

Dane strumienia bajtowego można również przesłać potokowo do strumienia stdin innego natywnego polecenia. Poniższy przykład pobiera spakowany plik TAR przy użyciu polecenia curl. Pobrane dane pliku są przesyłane strumieniowo do tar polecenia w celu wyodrębnienia zawartości archiwum.

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

Możesz również przekazać potok danych wyjściowych strumienia bajtów polecenia programu PowerShell do danych wejściowych polecenia natywnego. W poniższych przykładach użyto Invoke-WebRequest metody , aby pobrać ten sam plik TAR co w poprzednim przykładzie.

# 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 .

Ta funkcja nie obsługuje danych strumienia bajtowego podczas przekierowywania danych wyjściowych stderr do stdout. Po połączeniu strumieni stderr i stdout połączone strumienie są traktowane jako dane ciągu.

Uwagi

Operatory przekierowania, które nie dołączają danych (> i n>) zastępują bieżącą zawartość określonego pliku bez ostrzeżenia.

Jeśli jednak plik jest plikiem tylko do odczytu, ukrytym lub systemowym, przekierowanie zakończy się niepowodzeniem. Operatory przekierowania dołączania (>> i n>>) nie zapisują w pliku tylko do odczytu, ale dołączają zawartość do systemu lub ukrytego pliku.

Aby wymusić przekierowanie zawartości do pliku tylko do odczytu, ukrytego lub systemowego, użyj Out-File polecenia cmdlet z jego Force parametrem.

Podczas zapisywania w plikach operatory przekierowania używają UTF8NoBOM kodowania. Jeśli plik ma inne kodowanie, dane wyjściowe mogą nie być poprawnie sformatowane. Aby zapisać w plikach z innym kodowaniem, użyj Out-File polecenia cmdlet z jego Encoding parametrem.

Szerokość danych wyjściowych podczas zapisywania w pliku

Podczas zapisywania w pliku przy użyciu Out-File operatorów przekierowania lub operatorów przekierowania program PowerShell formatuje dane wyjściowe tabeli do pliku na podstawie szerokości konsoli, w której działa. Na przykład podczas rejestrowania danych wyjściowych tabeli w pliku przy użyciu polecenia takiego jak Get-ChildItem Env:\Path > path.log w systemie, w którym szerokość konsoli jest ustawiona na 80 kolumn, dane wyjściowe w pliku są obcinane do 80 znaków:

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

Biorąc pod uwagę, że szerokość konsoli może być dowolnie ustawiona w systemach, w których jest uruchamiany skrypt, możesz wolisz formatować dane wyjściowe tabeli programu PowerShell do plików na podstawie określonej szerokości.

Polecenie Out-File cmdlet udostępnia parametr Width , który umożliwia ustawienie szerokości, którą chcesz ustawić dla danych wyjściowych tabeli. Zamiast dodawać -Width 2000 wszędzie, gdzie wywołujesz Out-Filemetodę , możesz użyć $PSDefaultParameterValues zmiennej , aby ustawić tę wartość dla wszystkich zastosowań Out-File polecenia cmdlet w skrycie. Ponieważ operatory przekierowania (> i >>) są skutecznie aliasami dla Out-File, ustawienie Out-File:Width parametru dla całego skryptu wpływa również na szerokość formatowania operatorów przekierowania. Umieść następujące polecenie w górnej części skryptu, aby ustawić Out-File:Width dla całego skryptu:

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

Zwiększenie szerokości danych wyjściowych zwiększy zużycie pamięci podczas rejestrowania sformatowanych danych wyjściowych tabeli. Jeśli rejestrujesz wiele danych tabelarycznych do pliku i wiesz, że możesz uzyskać mniejszą szerokość, użyj mniejszej szerokości.

W niektórych przypadkach, takich jak Get-Service dane wyjściowe, aby użyć dodatkowej szerokości, należy przekazać dane wyjściowe Format-Table -AutoSize przed wyjściem do pliku.

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

Aby uzyskać więcej informacji na temat $PSDefaultParameterValuesprogramu , zobacz about_Preference_Variables.

Potencjalne zamieszanie z operatorami porównania

Operator > nie jest mylony z operatorem większe niż porównanie (często oznaczany tak jak > w innych językach programowania).

W zależności od porównywanych obiektów dane wyjściowe mogą > być poprawne (ponieważ 36 nie jest większe niż 42).

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

Jednak sprawdzenie lokalnego systemu plików może zobaczyć, że plik o nazwie 42 został zapisany z zawartością 36.

PS> dir

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

PS> cat 42
36

Próba użycia porównania < odwrotnego (mniejszego niż) zwraca błąd systemu:

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

Jeśli porównanie liczbowe jest wymaganą operacją i -lt-gt powinno być używane. Aby uzyskać więcej informacji, zobacz -gt operator w about_Comparison_Operators.

Zobacz też