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. Dit is meestal de consoletoepassing. U kunt de uitvoer echter omleiden naar een tekstbestand en u kunt foutuitvoer omleiden naar de normale uitvoerstroom.

U kunt de volgende methoden gebruiken om uitvoer om te leiden:

  • Gebruik de Out-File cmdlet, waarmee opdrachtuitvoer naar een tekstbestand wordt verzonden. Normaal gesproken gebruikt u de Out-File cmdlet wanneer u de bijbehorende parameters, zoals de Encoding, Forceof WidthNoClobber parameters, moet gebruiken.

  • Gebruik de Tee-Object cmdlet, waarmee opdrachtuitvoer 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 leidingen Out-File zonder extra parameters.

Zie about_Output_Streams voor meer informatie over streams.

Omleidingsbare uitvoerstromen

PowerShell ondersteunt omleiding van de volgende uitvoerstromen.

Stream # Beschrijving Geïntroduceerd in Cmdlet schrijven
1 Geslaagde stroom PowerShell 2.0 Write-Output
2 Foutstroom PowerShell 2.0 Write-Error
3 Waarschuwingsstroom PowerShell 3.0 Write-Warning
4 Uitgebreide stream PowerShell 3.0 Write-Verbose
5 Fouten opsporen in Stream PowerShell 3.0 Write-Debug
6 Gegevensstroom 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 succes - en foutstromen 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 successtroom ( 1 ) is de standaardwaarde als er geen stream is opgegeven.

Operator Description Syntaxis
> Verzend de opgegeven stream naar een bestand. n>
>> Voeg de opgegeven stroom toe aan een bestand. n>>
>&1 Hiermee wordt de opgegeven stream omgeleid naar de successtroom. 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

In dit voorbeeld wordt dir één item uitgevoerd dat slaagt en één item dat mislukt.

dir C:\, fakepath 2>&1 > .\dir.log

Het gebruikt 2>&1 om de foutstroom om te leiden naar de successtroom en > om de resulterende successtroom te verzenden naar een bestand met de naamdir.log

Voorbeeld 2: alle successtroomgegevens naar een bestand verzenden

In dit voorbeeld worden alle successtroomgegevens naar een bestand met de naam script.logVerzonden.

.\script.ps1 > script.log

Voorbeeld 3: Stromen geslaagd, waarschuwingen en fouten 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 hiermee wordt de waarschuwingsstroom omgeleid naar de successtroom .
  • 2>&1de foutstroom omleidt naar de successtroom (die nu ook alle waarschuwingsstroomgegevens bevat)
  • >leidt de successtroom (die nu zowel waarschuwings- als foutstromen 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 verzonden van een script dat wordt aangeroepen script.ps1 naar een bestand met de naam script.log.

.\script.ps1 *> script.log

Voorbeeld 5: alle gegevens van de schrijfhost en gegevensstroom onderdrukken

In dit voorbeeld worden alle gegevensstroomgegevens 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 u gevraagd wanneer $ErrorActionPreference deze 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

Opmerkingen

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 alleen-lezenbestand, maar ze voegen inhoud toe aan een systeem of verborgen bestand.

Als u wilt afdwingen dat inhoud wordt omgeleid naar een alleen-lezen, verborgen of systeembestand, gebruikt u de cmdlet met Force de Out-File parameter.

Wanneer u naar bestanden schrijft, gebruiken UTF8NoBOM de omleidingsoperators codering. Als het bestand een andere codering heeft, is de uitvoer mogelijk niet correct opgemaakt. Als u wilt schrijven naar bestanden met een andere codering, gebruikt u de cmdlet met Encoding de Out-File parameter.

Breedte van uitvoer bij schrijven naar een bestand

Wanneer u naar een bestand schrijft met behulp van Out-File een van de omleidingsoperators, maakt PowerShell tabeluitvoer naar het bestand op basis van de breedte van de console waarin deze wordt uitgevoerd. Wanneer de uitvoer van de tabel bijvoorbeeld wordt vastgelegd in een bestand met behulp van een opdracht zoals Get-ChildItem Env:\Path > path.log in een systeem waarin de consolebreedte 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 de voorkeur geven aan de uitvoer van de PowerShell-tabel naar bestanden op basis van een breedte die u 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 gebruiksbewerkingen van de Out-File cmdlet in een script. En omdat de omleidingsoperators (>en >>) effectief aliassen voor zijn, heeft het instellen van de Out-File:Width parameter voor het hele script ook invloed op de opmaakbreedte voor de omleidingsoperatorsOut-File. 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, wordt het geheugenverbruik verhoogd wanneer de tabel opgemaakte uitvoer wordt geformatteerd. Als u veel tabelgegevens in een logboek opgeeft en u weet dat u met een kleinere breedte kunt komen, gebruikt u de kleinere breedte.

In sommige gevallen, zoals Get-Service uitvoer, om de extra breedte te gebruiken, moet u de uitvoer doorsluisen Format-Table -AutoSize voordat u 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 bytestream-gegevens omleidt, worden de gegevens door PowerShell als tekenreeksen behandeld. Deze omleiding resulteert in beschadigde gegevens.

Mogelijke verwarring met vergelijkingsoperatoren

De > operator is niet te verwarren 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 probeert de omgekeerde vergelijking < (kleiner dan) 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 -lt is en -gt moet worden gebruikt. Zie de -gt operator in about_Comparison_Operators voor meer informatie.

Zie ook