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. Użycie operatora przekierowania z obiektem docelowym pliku jest funkcjonalnie równoważne potokom bez Out-File dodatkowych parametrów.

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 .

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

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.

Przekierowywanie danych binarnych

Program PowerShell nie obsługuje przekierowywania danych binarnych. W przypadku przekierowywania danych strumienia bajtów program PowerShell traktuje dane jako ciągi. To przekierowanie powoduje uszkodzenie danych.

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ż