about_Redirection
Kort beskrivning
Förklarar hur du omdirigerar utdata från PowerShell till textfiler.
Lång beskrivning
Som standard skickar PowerShell utdata till PowerShell-värden. Vanligtvis är det här konsolprogrammet. Du kan dock omdirigera utdata till en textfil och du kan omdirigera felutdata till den vanliga utdataströmmen.
Du kan använda följande metoder för att omdirigera utdata:
Använd cmdleten
Out-File
som skickar kommandoutdata till en textfil. Vanligtvis använder du cmdletenOut-File
när du behöver använda dess parametrar, till exempel parametrarnaEncoding
,Force
,Width
ellerNoClobber
.Använd cmdleten
Tee-Object
som skickar kommandoutdata till en textfil och sedan skickar den till pipelinen.Använd PowerShell-omdirigeringsoperatorerna. Omdirigering av utdata från ett PowerShell-kommando (cmdlet, funktion, skript) med omdirigeringsoperatorn (
>
) är funktionellt likvärdigt med rörledningar utanOut-File
extra parametrar. PowerShell 7.4 ändrade beteendet för omdirigeringsoperatorn när den användes för att omdirigera stdout-strömmen för ett internt kommando.
Mer information om strömmar finns i about_Output_Streams.
Omdirigerbara utdataströmmar
PowerShell stöder omdirigering av följande utdataströmmar.
Ström # | beskrivning | Introducerad i | Skriv cmdlet |
---|---|---|---|
1 | Lyckad ström | PowerShell 2.0 | Write-Output |
2 | Felström | PowerShell 2.0 | Write-Error |
3 | Varningsström | PowerShell 3.0 | Write-Warning |
4 | Utförlig ström | PowerShell 3.0 | Write-Verbose |
5 | Felsöka Stream | PowerShell 3.0 | Write-Debug |
6 | Informationsström | PowerShell 5.0 |
Write-Information , Write-Host |
* | Alla strömmar | PowerShell 3.0 |
Det finns också en Progress-ström i PowerShell, men den stöder inte omdirigering.
Viktigt!
Strömmarna Success och Error liknar stdout- och stderr-strömmarna för andra gränssnitt. Stdin är dock inte ansluten till PowerShell-pipelinen för indata.
PowerShell-omdirigeringsoperatorer
PowerShell-omdirigeringsoperatorerna är följande, där n
representerar strömnumret. Lyckad ström ( 1
) är standardvärdet om ingen ström har angetts.
Operatör | beskrivning | Syntax |
---|---|---|
> |
Skicka angiven dataström till en fil. | n> |
>> |
Lägg till angiven dataström i en fil. | n>> |
>&1 |
Omdirigerar den angivna strömmen till dataströmmen Lyckades . | n>&1 |
Kommentar
Till skillnad från vissa Unix-gränssnitt kan du bara omdirigera andra strömmar till dataströmmen Lyckades .
Omdirigera utdata från interna kommandon
PowerShell 7.4 ändrade beteendet för omdirigeringsoperatorerna när de användes för att omdirigera stdout-strömmen för ett internt kommando. Omdirigeringsoperatorerna bevarar nu byteströmsdata vid omdirigering av utdata från ett internt kommando. PowerShell tolkar inte omdirigerade data eller lägger till ytterligare formatering. Mer information finns i Exempel 7.
Exempel
Exempel 1: Omdirigeringsfel och utdata till en fil
Det här exemplet körs dir
på ett objekt som lyckas och ett som misslyckas.
dir C:\, fakepath 2>&1 > .\dir.log
Den använder 2>&1
för att omdirigera felströmmen till dataströmmen Lyckades och >
för att skicka den resulterande lyckade dataströmmen till en fil med namnet dir.log
Exempel 2: Skicka alla data för lyckad dataström till en fil
Det här exemplet skickar alla Data om lyckad dataström till en fil med namnet script.log
.
.\script.ps1 > script.log
Exempel 3: Skicka strömmar för lyckade strömmar, varningar och fel till en fil
Det här exemplet visar hur du kan kombinera omdirigeringsoperatorer för att uppnå önskat resultat.
&{
Write-Warning "hello"
Write-Error "hello"
Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
-
3>&1
omdirigerar varningsströmmen till dataströmmen Lyckades. -
2>&1
omdirigerar felströmmen till dataströmmen Lyckades (som nu även innehåller alla varningsströmdata ) -
>
omdirigerar dataströmmen Lyckades
Exempel 4: Omdirigera alla strömmar till en fil
I det här exemplet skickas alla strömmar från ett skript som heter script.ps1
till en fil med namnet script.log
.
.\script.ps1 *> script.log
Exempel 5: Utelämna alla data för write-host och informationsström
I det här exemplet utelämnas all informationsströmsdata. Mer information om informationsström-cmdletar finns i Write-Host and Write-Information
&{
Write-Host "Hello"
Write-Information "Hello" -InformationAction Continue
} 6> $null
Exempel 6: Visa effekten av åtgärdsinställningar
Variabler och parametrar för åtgärdsinställningar kan ändra vad som skrivs till en viss ström. Skriptet i det här exemplet visar hur värdet för $ErrorActionPreference
påverkar vad som skrivs till felströmmen .
$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'
När vi kör det här skriptet uppmanas vi när $ErrorActionPreference
är inställt på 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.
När vi undersöker loggfilen ser vi följande:
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
Exempel 7: Omdirigera binära data från ett internt kommando
Från och med PowerShell 7.4 bevarar PowerShell byte-stream-data vid omdirigering av stdout-strömmen för ett inbyggt kommando till en fil eller när byte-stream-data skickas till stdin-strömmen för ett internt kommando.
Med det interna kommandot curl
kan du till exempel ladda ned en binär fil och spara den på disk med hjälp av omdirigering.
$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
Du kan också skicka byteströmdata till stdin-strömmen för ett annat inbyggt kommando. I följande exempel hämtas en zippad TAR-fil med .curl
De nedladdade fildata strömmas till tar
kommandot för att extrahera innehållet i arkivet.
# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .
Du kan också skicka byteströmutdata från ett PowerShell-kommando till indata från det interna kommandot. I följande exempel används Invoke-WebRequest
för att ladda ned samma TAR-fil som i föregående exempel.
# 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 .
Den här funktionen stöder inte byteströmsdata vid omdirigering av stderr-utdata till stdout. När du kombinerar stderr - och stdout-strömmarna behandlas de kombinerade strömmarna som strängdata.
Kommentar
Omdirigeringsoperatorerna som inte lägger till data (>
och n>
) skriver över det aktuella innehållet i den angivna filen utan varning.
Men om filen är en skrivskyddad, dold eller systemfil misslyckas omdirigeringen. Operatorerna för tilläggsomdirigering (>>
och n>>
) skriver inte till en skrivskyddad fil, men de lägger till innehåll i ett system eller en dold fil.
Om du vill framtvinga omdirigering av innehåll till en skrivskyddad, dold eller systemfil använder du cmdleten Out-File
med dess Force
parameter.
När du skriver till filer använder UTF8NoBOM
omdirigeringsoperatorerna kodning. Om filen har en annan kodning kanske utdata inte formateras korrekt. Om du vill skriva till filer med en annan kodning använder du cmdleten Out-File
med dess Encoding
parameter.
Bredd på utdata när du skriver till en fil
När du skriver till en fil med någon Out-File
av eller omdirigeringsoperatorerna formaterar PowerShell tabellutdata till filen baserat på bredden på konsolen som den körs inom. När du till exempel loggar tabellutdata till en fil med ett kommando som Get-ChildItem Env:\Path > path.log
i ett system där konsolens bredd är inställd på 80 kolumner, trunkeras utdata i filen till 80 tecken:
Name Value
---- -----
Path C:\Program Files\PowerShell\7;C:\WINDOWS…
Med tanke på att konsolbredden kan anges godtyckligt på system där skriptet körs, kanske du föredrar att PowerShell-formattabellen matar ut till filer baserat på en bredd som du anger i stället.
Cmdleten Out-File
innehåller en width-parameter som gör att du kan ange den bredd som du vill ha för tabellutdata. I stället för att behöva lägga -Width 2000
till överallt där du anropar Out-File
kan du använda variabeln $PSDefaultParameterValues
för att ange det här värdet för alla användningar av cmdleten Out-File
i ett skript. Och eftersom omdirigeringsoperatorerna (>
och >>
) i praktiken är alias för Out-File
påverkar inställningen av parametern Out-File:Width
för hela skriptet även formateringsbredden för omdirigeringsoperatorerna. Placera följande kommando längst upp i skriptet för att ange Out-File:Width
för hela skriptet:
$PSDefaultParameterValues['out-file:width'] = 2000
Om du ökar utdatabredden ökar minnesförbrukningen när du loggar tabellformaterade utdata. Om du loggar mycket tabelldata till filen och du vet att du klarar dig med en mindre bredd använder du den mindre bredden.
I vissa fall, till exempel Get-Service
utdata, för att kunna använda den extra bredden måste du skicka utdata före Format-Table -AutoSize
utdata till filen.
$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
Mer information om $PSDefaultParameterValues
finns i about_Preference_Variables.
Potentiell förvirring med jämförelseoperatorer
Operatorn >
ska inte förväxlas med operatorn Större än jämförelse (ofta som i andra programmeringsspråk >
).
Beroende på vilka objekt som jämförs kan utdata som används >
vara korrekta (eftersom 36 inte är större än 42).
PS> if (36 > 42) { "true" } else { "false" }
false
En kontroll av det lokala filsystemet kan dock se att en fil med namnet 42
har skrivits med innehållet 36
.
PS> dir
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 1/02/20 10:10 am 3 42
PS> cat 42
36
Om du försöker använda den omvända jämförelsen <
(mindre än) uppstår ett systemfel:
PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
1 | if (36 < 42) { "true" } else { "false" }
| ~
| The '<' operator is reserved for future use.
Om numerisk jämförelse är den nödvändiga åtgärden -lt
och -gt
bör användas. Mer information finns i operatorn -gt
i about_Comparison_Operators.