Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
Użyj polecenia cmdlet
Out-File, które wysyła dane wyjściowe polecenia do pliku tekstowego. Zazwyczaj należy użyć polecenia cmdletOut-File, gdy musisz użyć jego parametrów, takich jakEncoding,Force,WidthlubNoClobber.Użyj polecenia cmdlet
Tee-Object, które wysyła wyjściowe polecenie do pliku tekstowego, a następnie przekierowuje je do potoku.Użyj operatorów przekierowania programu PowerShell. Przekierowywanie danych wyjściowych polecenia PowerShell (polecenia cmdlet, funkcji, skryptu) przy użyciu operatora przekierowania (
>) jest funkcjonalnie równoważne przekierowywaniu doOut-Filebez dodatkowych parametrów. 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_Streams.
Przekierowywane strumienie wyjściowe
Program PowerShell obsługuje przekierowywanie następujących strumieni wyjściowych.
| Strumień # | Opis | Wprowadzone w | Napisz Cmdlet |
|---|---|---|---|
| 1 | Sukces Strumień | PowerShell 2.0 | Write-Output |
| 2 | błąd strumienia | PowerShell 2.0 | Write-Error |
| 3 | Ostrzeżenie Strumień | PowerShell 3.0 | Write-Warning |
| 4 | Rozwlekłe przesyłanie strumieniowe | PowerShell 3.0 | Write-Verbose |
| 5 | debugowanie strumienia | PowerShell 3.0 | Write-Debug |
| 6 | Informacja Strumień | PowerShell 5.0 |
Write-Information, Write-Host |
| * | Wszystkie strumienie | PowerShell 3.0 |
Istnieje również w PowerShell kanał Postęp, ale nie obsługuje on przekierowywania.
Ważny
Strumienie sukcesu i błędów są podobne do strumieni stdout i stderr innych powłok. Jednak stdin nie jest połączony z potokiem wejściowym programu PowerShell.
Operatory przekierowania programu PowerShell
Operatory przekierowania programu PowerShell są następujące, gdzie n reprezentuje numer strumienia. Strumień powodzenia (1 ) jest domyślny, 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 sukcesu. | n>&1 |
Notatka
W przeciwieństwie do niektórych powłok systemu Unix można przekierowywać tylko inne strumienie do strumienia "Success".
Przekierowywanie danych wyjściowych z poleceń natywnych
PowerShell 7.4 zmienił zachowanie operatorów przekierowania, gdy użyto ich 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 #7.
Przykłady
Przykład 1: Przekieruj błędy i dane wyjściowe do pliku
Ten przykład uruchamia dir na jednym elemencie, który się udaje, i na jednym, który kończy się niepowodzeniem.
dir C:\, fakepath 2>&1 > .\dir.log
Używa 2>&1 do przekierowania strumienia błędu do strumienia powodzenia , a > do wysłania wynikowego strumienia powodzenia do pliku o nazwie dir.log.
Przykład 2. Wysyłanie wszystkich danych strumienia powodzenia do pliku
Ten przykład wysyła 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 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łędów do strumienia sukcesu (który zawiera również wszystkie dane strumienia ostrzegania ) -
>przekierowuje strumień sukcesu (który teraz zawiera zarówno strumienie ostrzeżeń , jak i błędów ) do pliku o nazwieC:\temp\redirection.log.
Przykład 4. Przekierowywanie wszystkich strumieni do pliku
W tym przykładzie wszystkie strumienie wyjściowe są wysyłane ze skryptu o nazwie script.ps1 do pliku o nazwie 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 na temat poleceń cmdlet strumienia Information, zapoznaj się z Write-Host oraz Write-Information
&{
Write-Host "Hello"
Write-Information "Hello" -InformationAction Continue
} 6> $null
Przykład 6. Wyświetlanie efektu preferencji akcji
Zmienne i parametry preferencji działania mogą zmieniać to, co jest 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.
$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 ustawienie $ErrorActionPreference na 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, PowerShell zachowuje dane strumienia bajtów podczas przekierowywania strumienia stdout stdout natywnego polecenia do pliku lub podczas przesyłania danych strumienia bajtów do strumienia stdin natywnego polecenia.
Na przykład przy użyciu 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
Możesz również przesłać dane strumienia bajtów do strumienia stdin innego wbudowanego polecenia. Poniższy przykład pobiera spakowany plik TAR przy użyciu curl.
Pobrane dane pliku są przesyłane strumieniowo do polecenia tar 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ć strumień bajtów wyjściowych polecenia programu PowerShell do danych wejściowych polecenia natywnego. W poniższych przykładach użyto Invoke-WebRequest do pobrania tego samego pliku 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 strumienia bajtów podczas przekierowywania wyjścia z stderr do stdout. Po połączeniu strumieni stderr i stdout strumienie połączone są traktowane jako dane ciągu.
Notatki
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, przekierowywanie kończy się niepowodzeniem. Operatory przekierowania dołączania (>> i n>>) nie zapisują w pliku tylko do odczytu, ale dołączają zawartość do systemu lub pliku ukrytego.
Aby wymusić przekierowanie zawartości do pliku tylko do odczytu, ukrytego lub systemowego, użyj polecenia cmdlet Out-File z parametrem Force.
Podczas pisania do plików, operatory przekierowania używają kodowania UTF8NoBOM. Jeśli plik ma inne kodowanie, dane wyjściowe mogą nie być poprawnie sformatowane. Aby zapisać w plikach z innym kodowaniem, użyj polecenia cmdlet Out-File z parametrem Encoding.
Szerokość wyników przy zapisie do pliku
Podczas zapisywania do pliku przy użyciu Out-File lub operatorów przekierowania, program PowerShell formatuje dane wyjściowe w formie tabeli na podstawie szerokości konsoli, w której jest uruchamiany. Na przykład podczas rejestrowania danych wyjściowych tabeli w pliku za pomocą 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 woleć, aby PowerShell formatował dane wyjściowe tabel w plikach na podstawie szerokości, którą określisz.
Polecenie cmdlet Out-File udostępnia parametr Width, który umożliwia ustawienie szerokości dla danych wyjściowych tabeli według własnego uznania. Zamiast dodawać -Width 2000 wszędzie, gdzie wywołujesz Out-File, możesz użyć zmiennej $PSDefaultParameterValues, aby ustawić tę wartość dla wszystkich zastosowań polecenia cmdlet Out-File w skrycie. Ponieważ operatory przekierowania (> i >>) są skutecznie aliasami dla Out-File, ustawienie parametru Out-File:Width 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, aby użyć dodatkowej szerokości, należy przekazać wyjście przez Format-Table -AutoSize, zanim zostanie zapisane do pliku.
$PSDefaultParameterValues['Out-File:Width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
Aby uzyskać więcej informacji na temat $PSDefaultParameterValues, zobacz about_Preference_Variables.
Potencjalne zamieszanie z operatorami porównania
Operator > nie należy mylić z operatorem porównania większym niż (często określanym jako > w innych językach programowania).
W zależności od porównywanych obiektów dane wyjściowe używające > 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 odwróconego porównania < ("mniejsze 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ą, należy użyć -lt i -gt. Aby uzyskać więcej informacji, zobacz operator -gt w o_Operatorach_Porównania.
Zobacz także
- o_skladni_poleceń
- o_Operatorach
- about_Output_Streams
- o_Path_Syntax
- plików wychodzących
- Tee-Object
- write-debug
- błędu zapisu
- hosta zapisu
- zapisz-informację
- zapisu
- Pisz-Postęp
- write-verbose
- ostrzeżenie o zapisie