Share via


about_Redirection

Kort beskrivning

Beskriver hur du omdirigerar utdata från PowerShell till textfiler.

Lång beskrivning

Som standard skickar PowerShell utdata till PowerShell-värden. Detta är vanligtvis 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 cmdleten Out-File när du behöver använda dess parametrar, till exempel parametrarna Encoding, Force, Widtheller NoClobber .

  • Använd cmdleten Tee-Object som skickar kommandoutdata till en textfil och sedan skickar den till pipelinen.

  • Använd PowerShell-omdirigeringsoperatorerna. Att använda omdirigeringsoperatorn med ett filmål är funktionellt likvärdigt med rörledning utan Out-File extra parametrar.

Mer information om strömmar finns i about_Output_Streams.

Omdirigeringsbara utdataströmmar

PowerShell stöder omdirigering av följande utdataströmmar.

Stream # Description Introducerades i Skriva cmdlet
1 Lyckad Stream PowerShell 2.0 Write-Output
2 Fel Stream PowerShell 2.0 Write-Error
3 Varning Stream PowerShell 3.0 Write-Warning
4 Utförlig Stream PowerShell 3.0 Write-Verbose
5 Felsöka Stream PowerShell 3.0 Write-Debug
6 Information Stream PowerShell 5.0 Write-Information, Write-Host
* Alla strömmar PowerShell 3.0

Det finns också en Förloppsströ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 standard om ingen ström har angetts.

Operator Beskrivning Syntax
> Skicka angiven strö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

Anteckning

Till skillnad från vissa Unix-gränssnitt kan du bara omdirigera andra strömmar till dataströmmen Lyckades .

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 Dataströmmen har lyckats till en fil

I det här exemplet skickas alla data från dataströmmen till en fil med namnet script.log.

.\script.ps1 > script.log

Exempel 3: Skicka strömmar med lyckade data, 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 strömmen Lyckades (som nu innehåller både varnings- och felströmmar ) till en fil med namnet C:\temp\redirection.log.

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 Write-Host- och informationsströmdata

Det här exemplet utelämnar alla informationsströmdata. 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

Kommentarer

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 är korrekt formaterade. Om du vill skriva till filer med en annan kodning använder du cmdleten Out-File med dess Encoding parameter.

Utdatabredd vid skrivning till en fil

När du skriver till en fil med någon Out-File av operatorerna eller omdirigeringsoperatorerna formaterar PowerShell tabellutdata till filen baserat på bredden på konsolen som den körs i. 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 formaterar tabellutdata 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-Filekan 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 Out-File:Width av parametern för hela skriptet formateringsbredden även för omdirigeringsoperatorerna. Placera följande kommando överst 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 en hel del 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, måste du för att kunna använda den extra bredden 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 $PSDefaultParameterValuesfinns i about_Preference_Variables.

Omdirigera binära data

PowerShell stöder inte omdirigering av binära data. Om du omdirigerar byteströmsdata behandlar PowerShell data som strängar. Den här omdirigeringen resulterar i skadade data.

Potentiell förvirring med jämförelseoperatorer

Operatorn > ska inte förväxlas med operatorn Större än jämförelse (kallas ofta för > 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.

Se även