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.
Do przekierowania danych wyjściowych można użyć następujących metod:
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 potokowi bez
Out-File
dodatkowych parametrów.
Aby uzyskać więcej informacji na temat strumieni, zobacz about_Output_Streams.
Strumienie wyjściowe z możliwością przekierowania
Program PowerShell obsługuje przekierowywanie następujących strumieni wyjściowych.
Stream # | Opis | Wprowadzona w | Polecenie cmdlet zapisu |
---|---|---|---|
1 | Stream powodzenia | PowerShell 2.0 | Write-Output |
2 | Błąd Stream | PowerShell 2.0 | Write-Error |
3 | Ostrzeżenie Stream | PowerShell 3.0 | Write-Warning |
4 | Pełne Stream | PowerShell 3.0 | Write-Verbose |
5 | Debugowanie Stream | PowerShell 3.0 | Write-Debug |
6 | Informacje Stream | PowerShell 5.0 | Write-Information |
* | 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 powiedzie się i taki, który zostanie wyświetlony błąd.
dir 'C:\', 'fakepath' 2>&1 > .\dir.log
Używa 2>&1
go do przekierowywania strumienia błędów do strumienia powodzenia 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 są wysyłane wszystkie dane strumienia powodzenia 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 można 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ń ostrzegawczy do strumienia powodzenia .2>&1
przekierowuje strumień błędów do strumienia powodzenia (który zawiera również wszystkie dane strumienia ostrzegawczego )>
przekierowuje strumień powodzenia (który zawiera teraz strumienie ostrzeżeń i błędów ) 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 do pliku o nazwie script.ps1
script.log
.\script.ps1 *> script.log
Przykład 5. Pomijanie wszystkich danych strumienia Write-Host i informacji
W tym przykładzie pominięto wszystkie dane strumienia informacji. Aby dowiedzieć się więcej o poleceniach cmdlet strumienia informacji , zobacz Write-Host i 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ść $ErrorActionPreference
wpływa na to, 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
Cannot find path 'C:\not-here' because it does not 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.
Po przeanalizowaniu pliku dziennika zobaczymy 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 koń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 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 do 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ą obcięte do 80 znaków:
Name Value
---- -----
Path C:\Program Files\PowerShell\7-preview;C:\WINDOWS…
Biorąc pod uwagę, że szerokość konsoli może być ustawiana dowolnie w systemach, w których jest uruchamiany skrypt, wolisz, aby tabela formatu programu PowerShell wyświetlała dane wyjściowe 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. A ponieważ operatory przekierowania (>
i >>
) są skutecznie aliasami dla Out-File
, ustawienie Out-File:Width
parametru dla całego skryptu ma wpływ na szerokość formatowania dla operatorów przekierowania, jak również. 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 przed Format-Table -AutoSize
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 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 sprawdzanie 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ż) powoduje wyświetlenie błędu 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.