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żywaszOut-File
polecenia cmdlet , gdy musisz użyć jego parametrów, takich jakEncoding
parametry ,Force
,Width
lubNoClobber
.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 bezOut-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>&1
przekierowuje strumień ostrzeżenie do strumienia Powodzenie.2>&1
przekierowuje 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 nazwieC:\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-File
metodę , 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 $PSDefaultParameterValues
programu , 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.