Delen via


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 omleiden van de uitvoer van een PowerShell-opdracht (cmdlet, functie, script) met behulp van de omleidingsoperator (>) is functioneel gelijk aan piping naar Out-File zonder extra parameters. PowerShell 7.4 heeft het gedrag van de omleidingsoperator gewijzigd wanneer deze wordt gebruikt om de stdout-stroom van een systeemeigen opdracht om te leiden.

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 .

Uitvoer van systeemeigen opdrachten omleiden

PowerShell 7.4 heeft het gedrag van de omleidingsoperators gewijzigd wanneer deze wordt gebruikt om de stdout-stroom van een systeemeigen opdracht om te leiden. De omleidingsoperators behouden nu de bytestreamgegevens bij het omleiden van uitvoer van een systeemeigen opdracht. PowerShell interpreteert de omgeleide gegevens niet of voegt aanvullende opmaak toe. Zie Voorbeeld 7 voor meer informatie.

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

Voorbeeld 7: binaire gegevens omleiden vanuit een systeemeigen opdracht

Vanaf PowerShell 7.4 behoudt PowerShell de bytestreamgegevens bij het omleiden van de stdout-stroom van een systeemeigen opdracht naar een bestand of bij het doorsturen van bytestreamgegevens naar de stdin-stroom van een systeemeigen opdracht.

Met behulp van de systeemeigen opdracht curl kunt u bijvoorbeeld een binair bestand downloaden en opslaan op schijf met behulp van omleiding.

$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'

# native command redirected to a file
curl -s -L $uri > powershell.tar.gz

U kunt de bytestreamgegevens ook doorsluisen naar de stdin-stroom van een andere systeemeigen opdracht. In het volgende voorbeeld wordt een gezipt TAR-bestand gedownload met behulp van curl. De gedownloade bestandsgegevens worden naar de tar opdracht gestreamd om de inhoud van het archief te extraheren.

# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .

U kunt ook de bytestream-uitvoer van een PowerShell-opdracht doorsluisen naar de invoer van de systeemeigen opdracht. In de volgende voorbeelden wordt Invoke-WebRequest hetzelfde TAR-bestand gedownload als in het vorige voorbeeld.

# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .

# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .

Deze functie biedt geen ondersteuning voor bytestreamgegevens bij het omleiden van stderr-uitvoer naar stdout. Wanneer u de stderr - en stdout-stromen combineert, worden de gecombineerde stromen behandeld als tekenreeksgegevens.

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.

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