A kimenetet átirányíthatjuk a (> ) és a (>> ) jelekkel. Nézzünk erre példát egy egyszerű tömb felhasználásával:
[41] PS C:\> 0..3 | foreach-object {'{1,-6} : {0,2}' -f ($_+1), $tomb[$_]} > c:\szamok.txt
[42] PS C:\> Get-Content C:\szamok.txt
egy : 1
ketto : 2
harom : 3
negy : 4
[43] PS C:\> "még egy sor" >> C:\szamok.txt
[44] PS C:\> Get-Content C:\szamok.txt
egy : 1
ketto : 2
harom : 3
negy : 4
még egy sor
A [41]-es sorban átirányítottam a kimenetet egy szöveges fájlba. A szimpla (>) jel új fájlt kezd. A fájl tartalmának kiírásához a get-content cmdletet használtam.
A [43]-as sor dupla (>>) jelével hozzáfűztem egy újabb sort a fájlhoz.
[45] PS C:\> "új sor" > C:\szamok.txt
[46] PS C:\> Get-Content C:\szamok.txt
új sor
A [45]-ös sorban, mivel megint szimpla (>) jelet használtam, ezért elveszettem a fájl addigi tartalmát. Ezek a jelek egyébként az Out-File aliasaként is felfoghatók, a háttérben az fut le.
Azonban nem csak a kimenet irányítható át! PowerShell 2.0-ig a hibák is:
PS C:\> Remove-Item c:\nemlétező.txt 2> C:\PowerShell\hibák.txt
PS C:\> Get-Content C:\PowerShell\hibák.txt
Remove-Item : Cannot find path 'C:\nemlétező.txt' because it does not exist.
At line:1 char:1
+ Remove-Item c:\nemlétező.txt 2> C:\PowerShell\hibák.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\nemlétező.txt:String) [Remo
ve-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.Remo
veItemCommand
PowerShell 3.0-tól hasonlóan, a figyelmeztetések, a részletező információk és hibakereső információk is átirányíthatók:
PS C:\> Write-Warning "Figyelmeztetés" 3>> C:\PowerShell\hibák.txt
PS C:\> Write-Verbose "Szószátyárság" 4>> C:\PowerShell\hibák.txt
PS C:\> Write-Debug "Hibakeresés" 5>> C:\PowerShell\hibák.txt
PS C:\> Write-Information "Információ" 6>> C:\PowerShell\hibák.txt
PS C:\> Get-Content C:\PowerShell\hibák.txt
Remove-Item : Cannot find path 'C:\nemlétező.txt' because it does not exist.
At line:1 char:1
+ Remove-Item c:\nemlétező.txt 2> C:\PowerShell\hibák.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\nemlétező.txt:String) [Remo
ve-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.Remo
veItemCommand
Figyelmeztetés
Információ
Érdekes módon a Verbose és Debug információ nem került bele. Ez azért van, mert az átirányítás csak akkor működik, ha a megfelelő $...Preference változót átállítjuk Continue-ra:
PS C:\> $VerbosePreference = "Continue"
PS C:\> $DebugPreference = "Continue"
PS C:\> Write-Verbose "Szószátyárság" 4>> C:\PowerShell\hibák.txt
PS C:\> Write-Debug "Hibakeresés" 5>> C:\PowerShell\hibák.txt
PS C:\> Get-Content C:\PowerShell\hibák.txt
Remove-Item : Cannot find path 'C:\nemlétező.txt' because it does not exist.
At line:1 char:1
+ Remove-Item c:\nemlétező.txt 2> C:\PowerShell\hibák.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\nemlétező.txt:String) [Remo
ve-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.Remo
veItemCommand
Figyelmeztetés
Információ
Szószátyárság
Hibakeresés
Így már ott van utolsó elemként a „Szószátyárság” és a „Hibakeresés” szöveg is.
Ha egyszerre az összes információ-folyamot szeretnénk átirányítani, akkor használjuk a „*”-ot:
PS C:\> "Error", "Warning", "Verbose", "Debug", "Information" | %{&([scriptbloc
k]::Create("Write-$_ $_"))} *> C:\PowerShell\minden.txt
PS C:\> Get-Content C:\PowerShell\minden.txt
Write-Error Error : Error
At line:1 char:59
+ ... g", "Information" | %{&([scriptblock]::Create("Write-$_ $_"))} *> C:\ ..
.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorExce
ption
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExcepti
on
Warning
Verbose
Debug
Information
Ha ez az utolsó kifejezés nem is teljesen világos még a kedves olvasónak, ne csüggedjen, később világossá válik, hogy mi történt itt. A lényeg, hogy lusta voltam az összes fajta Write-… cmdlettel példát csinálni, helyette automatizáltan kreáltam minden fajtát.
Lehetőség van különböző információ-folyamok egyesítésére is. A következő példában azt látjuk, hogy hiába rendeljük a Remove-Item cmdlet kimenetét egy változóhoz a hiba folyamre ez a hozzárendelés alaphelyzetben nem vonatkozik, így az kikerül a konzolra, a változó meg üres lesz:
PS C:\> $r = Remove-Item c:\nemlétező.txt
Remove-Item : Cannot find path 'C:\nemlétező.txt' because it does not exist.
At line:1 char:6
+ $r = Remove-Item c:\nemlétező.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\nemlétező.txt:String) [Remo
ve-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.Remo
veItemCommand
PS C:\> $r
De ha átirányítjuk a hiba folyamot (2) az kimeneti folyamba (1), akkor már változóba is rakhatjuk a hibát:
PS C:\> $r = Remove-Item c:\nemlétező.txt 2>&1
PS C:\> $r
Remove-Item : Cannot find path 'C:\nemlétező.txt' because it does not exist.
At line:1 char:6
+ $r = Remove-Item c:\nemlétező.txt 2>&1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\nemlétező.txt:String) [Remo
ve-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.Remo
veItemCommand
Ha a változó tartalmát kiíratjuk, akkor ugyanolyan pirossal jelzett szöveget kapunk, hiszen az adat, ami a változóba bekerül, ugyanolyan exception típusú marad, így arra ez a piros formázás érvényesül.
Több különböző információfolyamot is össze-vissza irányíthatunk egyszerre:
PS C:\> $r = $(Remove-Item c:\nemlétező.txt; Write-Warning kakukk) 2>&1 3>$env:
USERPROFILE\figyelem.txt
PS C:\> $r
Remove-Item : Cannot find path 'C:\nemlétező.txt' because it does not exist.
At line:1 char:8
+ $r = $(Remove-Item c:\nemlétező.txt; Write-Warning kakukk) 2>&1 3>$en ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\nemlétező.txt:String) [Remo
ve-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.Remo
veItemCommand
PS C:\> Get-Content C:\Users\Tibi\figyelem.txt
kakukk
A fenti példában a $() részben található kifejezés generál egy hibát és a figyelmeztetést. A hiba folyamot egyesítem a kimeneti folyammal (2>&1), a figyelmeztetés folyamot meg átirányítom a figyelem.txt fájlba (3>$env:figyelem.txt). Azaz ilyen átirányításokból többet is használhatok egyszerre.