about_Redirection
Korte beschrijving
Hierin wordt uitgelegd hoe u uitvoer van PowerShell omleidt naar tekstbestanden.
Lange beschrijving
Standaard verzendt PowerShell uitvoer naar de PowerShell-host. Meestal is dit de consoletoepassing. U kunt de uitvoer echter omleiden naar een tekstbestand en u kunt de foutuitvoer omleiden naar de normale uitvoerstroom.
U kunt de volgende methoden gebruiken om uitvoer om te leiden:
Gebruik de
Out-File
cmdlet, waarmee de uitvoer van de opdracht naar een tekstbestand wordt verzonden. Normaal gesproken gebruikt u deOut-File
cmdlet wanneer u de bijbehorende parameters, zoals deEncoding
parameters ,Force
,Width
ofNoClobber
wilt gebruiken.Gebruik de
Tee-Object
cmdlet, waarmee de uitvoer van de opdracht naar een tekstbestand wordt verzonden en vervolgens naar de pijplijn wordt verzonden.Gebruik de PowerShell-omleidingsoperators. Het gebruik van de omleidingsoperator met een bestandsdoel is functioneel gelijk aan piping met
Out-File
zonder extra parameters.
Zie about_Output_Streams voor meer informatie over streams.
Uitvoerstromen die kunnen worden omgeleid
PowerShell ondersteunt omleiding van de volgende uitvoerstromen.
Stream # | Description | Geïntroduceerd in | Cmdlet schrijven |
---|---|---|---|
1 | Geslaagde Stream | PowerShell 2.0 | Write-Output |
2 | Fout Stream | PowerShell 2.0 | Write-Error |
3 | Waarschuwings Stream | PowerShell 3.0 | Write-Warning |
4 | Uitgebreide Stream | PowerShell 3.0 | Write-Verbose |
5 | Foutopsporing Stream | PowerShell 3.0 | Write-Debug |
6 | Informatie Stream | PowerShell 5.0 | Write-Information , Write-Host |
* | Alle streams | PowerShell 3.0 |
Er is ook een voortgangsstroom in PowerShell, maar deze biedt geen ondersteuning voor omleiding.
Belangrijk
De streams Success en Error zijn vergelijkbaar met de stdout- en stderr-stromen van andere shells. Stdin is echter niet verbonden met de PowerShell-pijplijn voor invoer.
PowerShell-omleidingsoperators
De PowerShell-omleidingsoperators zijn als volgt, waarbij n
het streamnummer wordt aangegeven. De geslaagde stream ( 1
) is de standaardwaarde als er geen stream is opgegeven.
Operator | Beschrijving | Syntax |
---|---|---|
> |
Verzend de opgegeven stream naar een bestand. | n> |
>> |
De opgegeven stream toevoegen aan een bestand. | n>> |
>&1 |
Hiermee wordt de opgegeven stream omgeleid naar de stream Geslaagd . | n>&1 |
Notitie
In tegenstelling tot sommige Unix-shells kunt u alleen andere streams omleiden naar de successtroom .
Voorbeelden
Voorbeeld 1: fouten en uitvoer omleiden naar een bestand
Dit voorbeeld wordt uitgevoerd dir
op één item dat slaagt en één item dat mislukt.
dir C:\, fakepath 2>&1 > .\dir.log
Deze gebruikt 2>&1
om de foutstroom om te leiden naar de stroom Geslaagd en >
om de resulterende successtroom te verzenden naar een bestand met de naam dir.log
Voorbeeld 2: alle geslaagde streamgegevens naar een bestand verzenden
In dit voorbeeld worden alle successtreamgegevens verzonden naar een bestand met de naam script.log
.
.\script.ps1 > script.log
Voorbeeld 3: de streams Geslaagd, Waarschuwing en Fout verzenden naar een bestand
In dit voorbeeld ziet u hoe u omleidingsoperators kunt combineren om een gewenst resultaat te bereiken.
&{
Write-Warning "hello"
Write-Error "hello"
Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
3>&1
leidt de waarschuwingsstroom om naar de stream Geslaagd .2>&1
leidt de foutstroom om naar de stream Geslaagd (die nu ook alle waarschuwingsgegevens bevat)>
leidt de successtroom (die nu zowel waarschuwings - als foutstreams bevat) om naar een bestand met de naamC:\temp\redirection.log
.
Voorbeeld 4: alle streams omleiden naar een bestand
In dit voorbeeld worden alle streams-uitvoer van een script met de naam script.ps1
verzonden naar een bestand met de naam script.log
.
.\script.ps1 *> script.log
Voorbeeld 5: alle Write-Host- en informatiestroomgegevens onderdrukken
In dit voorbeeld worden alle gegevensstromen onderdrukt. Zie Write-Host en Write-Information voor meer informatie over informatiestroom-cmdlets.
&{
Write-Host "Hello"
Write-Information "Hello" -InformationAction Continue
} 6> $null
Voorbeeld 6: Het effect van actievoorkeuren weergeven
Variabelen en parameters voor actievoorkeur kunnen wijzigen wat naar een bepaalde stroom wordt geschreven. Het script in dit voorbeeld laat zien hoe de waarde van $ErrorActionPreference
invloed is op wat naar de foutstroom wordt geschreven.
$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'
Wanneer we dit script uitvoeren, wordt ons gevraagd wanneer $ErrorActionPreference
is ingesteld op 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.
Wanneer we het logboekbestand bekijken, zien we het volgende:
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
Notities
De omleidingsoperators die geen gegevens (>
en n>
) toevoegen, overschrijven de huidige inhoud van het opgegeven bestand zonder waarschuwing.
Als het bestand echter een alleen-lezen, verborgen of systeembestand is, mislukt de omleiding. De operatoren voor toevoegomleiding (>>
en n>>
) schrijven niet naar een bestand met het kenmerk Alleen-lezen, maar voegen inhoud toe aan een systeem of verborgen bestand.
Als u de omleiding van inhoud naar een alleen-lezen, verborgen of systeembestand wilt afdwingen, gebruikt u de cmdlet met de Out-File
bijbehorende Force
parameter.
Wanneer u naar bestanden schrijft, gebruiken UTF8NoBOM
de omleidingsoperators codering. Als het bestand een andere codering heeft, is de uitvoer mogelijk niet juist geformatteerd. Als u wilt schrijven naar bestanden met een andere codering, gebruikt u de cmdlet met de Out-File
bijbehorende Encoding
parameter.
Breedte van uitvoer bij het schrijven naar een bestand
Wanneer u naar een bestand schrijft met behulp van Out-File
een van de omleidingsoperators of de omleidingsoperators, wordt tabeluitvoer in PowerShell naar het bestand opgemaakt op basis van de breedte van de console waarin het wordt uitgevoerd. Wanneer u bijvoorbeeld tabeluitvoer in een bestand opspoort met een opdracht zoals Get-ChildItem Env:\Path > path.log
op een systeem waarbij de breedte van de console is ingesteld op 80 kolommen, wordt de uitvoer in het bestand afgekapt tot 80 tekens:
Name Value
---- -----
Path C:\Program Files\PowerShell\7;C:\WINDOWS…
Aangezien de breedte van de console willekeurig kan worden ingesteld op systemen waarop uw script wordt uitgevoerd, kunt u er de voorkeur aan geven dat PowerShell tabeluitvoer formatteert naar bestanden op basis van een breedte die u in plaats daarvan opgeeft.
De Out-File
cmdlet biedt een breedteparameter waarmee u de gewenste breedte voor tabeluitvoer kunt instellen. In plaats van overal toe te voegen -Width 2000
waar u aanroept Out-File
, kunt u de $PSDefaultParameterValues
variabele gebruiken om deze waarde in te stellen voor alle gebruik van de Out-File
cmdlet in een script. En omdat de omleidingsoperators (>
en >>
) in feite aliassen zijn voor Out-File
, heeft het instellen van de Out-File:Width
parameter voor het hele script ook invloed op de opmaakbreedte voor de omleidingsoperators. Plaats de volgende opdracht boven aan het script om in te stellen Out-File:Width
voor het hele script:
$PSDefaultParameterValues['out-file:width'] = 2000
Als u de uitvoerbreedte verhoogt, neemt het geheugenverbruik toe bij het vastleggen van uitvoer in tabelindeling. Als u veel tabellaire gegevens in een logboek opgeeft en u weet dat u met een kleinere breedte aan de slag kunt, gebruikt u de kleinere breedte.
In sommige gevallen, zoals Get-Service
uitvoer, moet u de uitvoer Format-Table -AutoSize
doorsnijden om de extra breedte te gebruiken voordat u de uitvoer naar het bestand uitvoert.
$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log
Zie about_Preference_Variables voor meer informatie over$PSDefaultParameterValues
.
Binaire gegevens omleiden
PowerShell biedt geen ondersteuning voor het omleiden van binaire gegevens. Als u byte-stream-gegevens omleidt, worden de gegevens door PowerShell als tekenreeksen behandeld. Deze omleiding resulteert in beschadigde gegevens.
Mogelijke verwarring met vergelijkingsoperatoren
De >
operator moet niet worden verward met de vergelijkingsoperator Groter dan (vaak aangeduid als >
in andere programmeertalen).
Afhankelijk van de objecten die worden vergeleken, kan de uitvoer >
correct lijken te zijn (omdat 36 niet groter is dan 42).
PS> if (36 > 42) { "true" } else { "false" }
false
Een controle van het lokale bestandssysteem kan echter zien dat een bestand met de naam 42
is geschreven, met de inhoud 36
.
PS> dir
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 1/02/20 10:10 am 3 42
PS> cat 42
36
Als u de omgekeerde vergelijking <
(kleiner dan) probeert te gebruiken, treedt er een systeemfout op:
PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
1 | if (36 < 42) { "true" } else { "false" }
| ~
| The '<' operator is reserved for future use.
Als numerieke vergelijking de vereiste bewerking is en -lt
-gt
moet worden gebruikt. Zie de -gt
operator in about_Comparison_Operators voor meer informatie.