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. 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>&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
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.
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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla