Delen via


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 de Out-File cmdlet wanneer u de bijbehorende parameters, zoals de Encodingparameters , Force, Widthof NoClobber 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 naam C:\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.

Zie ook