Átirányítás (>, >>)

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.



Word To HTML Converter