about_Redirection
Korte beschrijving
Hierin wordt uitgelegd hoe u uitvoer van PowerShell omleidt naar tekstbestanden.
Lange beschrijving
PowerShell verzendt standaard 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 uitvoer van de opdracht naar een tekstbestand wordt verzonden. Normaal gesproken gebruikt u deOut-File
cmdlet wanneer u de bijbehorende parameters moet gebruiken, zoals deEncoding
parameters ,Force
,Width
ofNoClobber
.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 naar
Out-File
zonder extra parameters.
Zie about_Output_Streams voor meer informatie over streams.
Omleidingsbare uitvoerstromen
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 | Waarschuwing 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 |
* | Alle streams | PowerShell 3.0 |
Er is ook een voortgangsstroom in PowerShell, maar deze biedt geen ondersteuning voor omleiding.
Belangrijk
De stromen 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 |
---|---|---|
> |
De opgegeven stream verzenden naar een bestand. | n> |
>> |
Voeg de opgegeven stream toe 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 successtream .
Voorbeelden
Voorbeeld 1: Fouten en uitvoer omleiden naar een bestand
Dit voorbeeld wordt uitgevoerd dir
op één item dat slaagt en een item dat een fout veroorzaakt.
dir 'C:\', 'fakepath' 2>&1 > .\dir.log
Deze gebruikt 2>&1
om de foutstroom om te leiden naar de stream Geslaagd en >
om de resulterende successtream te verzenden naar een bestand met de naam dir.log
Voorbeeld 2: alle geslaagde streamgegevens naar een bestand verzenden
In dit voorbeeld worden alle geslaagde streamgegevens verzonden naar een bestand met de naam script.log
.
.\script.ps1 > script.log
Voorbeeld 3: stromen 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 gegevens van de waarschuwingsstroom bevat)>
leidt de stream Geslaagd (die nu zowel de waarschuwings- als foutstreams bevat) om naar een bestand met de naamC:\temp\redirection.log
)
Voorbeeld 4: alle stromen omleiden naar een bestand
In dit voorbeeld worden alle uitvoerstromen 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 actievoorkeuren 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
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.
Wanneer we het logboekbestand onderzoeken, 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 toevoegomleidingsoperatoren (>>
en n>>
) schrijven niet naar een alleen-lezen bestand, 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
Force
bijbehorende 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 of Out-File
de omleidingsoperators, wordt de tabeluitvoer in PowerShell naar het bestand opgemaakt op basis van de breedte van de console waarin deze wordt uitgevoerd. Wanneer bijvoorbeeld tabeluitvoer wordt vastgelegd in een bestand 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-preview;C:\WINDOWS…
Aangezien de breedte van de console willekeurig kan worden ingesteld op systemen waarop uw script wordt uitgevoerd, kunt u de voorkeur geven aan powershell-indeling voor tabeluitvoer naar bestanden op basis van een breedte die u in plaats daarvan opgeeft.
De Out-File
cmdlet biedt de parameter Width 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 dat u wilt instellen 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 tabelgeformatteerde uitvoer. 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, om de extra breedte te gebruiken, moet u de uitvoer doorspeken Format-Table -AutoSize
voordat u 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
.
Mogelijke verwarring met vergelijkingsoperators
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 >
met 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.