Már korábban is érintettük, de összefoglaló jelleggel legyen egy külön fejezete az általános paramétereknek. Vannak ugye azok a kapcsolók, amelyekkel a cmdletek, függvények vagy szkritekben található Write-Debug és Write-Verbose cmdletek kimenetét tudjuk bekapcsolni:
function Test-DebugVerbose{
[cmdletbinding()]
param()
Write-Debug "Ez egy hibaüzenet"
Write-Verbose "Ez egy szószátyárság"
}
Ha ezt a függvényt futtatjuk, akkor alaphelyzetben semmilyen kimenetet nem kapunk:
PS C:\> Test-DebugVerbose
PS C:\>
Ámde, ha a -Debug kapcsolót alkalmazzuk, akkor automatikusan az „Inquire”, azaz rákérdező üzemmódba kapcsoljuk a Write-Debug kifejezéseket, anélkül, hogy a $DebugPreference változót nyüstölnünk kellene:
PS C:\> Test-DebugVerbose -Debug
DEBUG: Ez egy hibaüzenet
Confirm
Continue with this operation?
[Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help
(default is "Y"):y
A -verbose kapcsoló egy fokkal szelídebb, ott csak egyszerűen láthatóvá válnak a Write-Verbose üzenetek:
PS C:\> Test-DebugVerbose -Verbose
VERBOSE: Ez egy szószátyárság
Hasonló célokra, de több finomhangolási lehetőséggel használhatók az -…Action paraméterek:
function Test-ActionParams {
[cmdletbinding()]
param()
Write-Warning "Ez egy figyelmeztetés"
Write-Error "Ez egy hiba"
}
Ezt futtatva paraméterek nélkül mindkét kiírást megkapjuk:
PS C:\> Test-ActionParams
WARNING: Ez egy figyelmeztetés
Test-ActionParams : Ez egy hiba
At line:1 char:1
+ Test-ActionParams
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorExce
ption
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExcepti
on,Test-ActionParams
A -WarningAction és -ErrorAction paraméterekkel felül tudjuk bírálni az alapműködést. Itt azonban több lehetőségünk is van:
SilentlyContinue: némán megy tovább, de a megfelelő változóba bejegyzi az üzenete
Stop: kilép
Continue: megy tovább, de az üzenetet megjeleníti
Inquire: rékérdez, hogy mi legyen
Ignore: némán megy tovább és az üzenetet is eldobja (PowerShell 3.0 után elérhető)
Suspend: felfüggeszti a működést, alpromptot nyit, folytatható
Az előbb emlegetett változó a hibáknál alaphelyzetben az $error tömb. A figyelmeztetéseknek és az információknak (PowerShell 5.0) nincs alaphelyzetben változójuk, ezek csak akkor tárolódnak, ha használjuk a megfelelő -…Variable paramétert.
Például:
PS C:\> Register-PSSessionConfiguration -Name Uj -RunAsCredential $cred -Warnin
gVariable figyelmeztetes
WARNING: When RunAs is enabled in a Windows PowerShell session configuration,
the Windows security model cannot enforce a security boundary between
different user sessions that are created by using this endpoint. Verify that
the Windows PowerShell runspace configuration is restricted to only the
necessary set of cmdlets and capabilities.
WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Plugin
Type Keys Name
---- ---- ----
Container {Name=Uj} Uj
Kaptam fent egy figyelmeztetést, de ugyanakkor az eltárolódott a $figyelmeztetes változóban is.
PS C:\> $figyelmeztetes
When RunAs is enabled in a Windows PowerShell session configuration, the Windo
ws security model cannot enforce a security boundary between different user se
ssions that are created by using this endpoint. Verify that the Windows PowerS
hell runspace configuration is restricted to only the necessary set of cmdlets
and capabilities.
Érdekes lehetőség, hogy ha a változó neve elé egy „+” jelet teszünk, akkor a változó tartalmához hozzáadódik újabb elemként a figyelmeztetés:
PS C:\> Write-Warning "Ez mégegy figyelmeztetés" -WarningVariable +figyelmeztet
es
WARNING: Ez mégegy figyelmeztetés
PS C:\> $figyelmeztetes
When RunAs is enabled in a Windows PowerShell session configuration, the Windo
ws security model cannot enforce a security boundary between different user se
ssions that are created by using this endpoint. Verify that the Windows PowerS
hell runspace configuration is restricted to only the necessary set of cmdlets
and capabilities.
Ez mégegy figyelmeztetés
Ezzel létre tudunk hozni a figyelmeztetésekhez az $error-hoz hasonló tömböt.
Az -OutVariable változó megadásával a kimenetet tudjuk betölteni egy változóba. Ez egy alternatív tárolóhely, mellette az igazi kimenetre is kikerülnek az adatok:
PS C:\> Get-Service h* -OutVariable szolgáltatások
Status Name DisplayName
------ ---- -----------
Stopped hidserv Human Interface Device Service
Stopped HomeGroupProvider HomeGroup Provider
PS C:\> $szolgáltatások
Status Name DisplayName
------ ---- -----------
Stopped hidserv Human Interface Device Service
Stopped HomeGroupProvider HomeGroup Provider
Ha nem szeretnénk az „igazi” kimenetet megkapni, akkor valamilyen elnyomási lehetőséggel kell éljünk.
A -PipelineVariable nagyon hasznos tud lenni, ha egymásba ágyazott csővezetékeket használunk, hiszen így az egyes csőszakaszok elemeire nem csak a $_ változóval hivatkozhatunk, hanem minden szakasznak más, nevesített változója lehet:
PS C:\> Get-ChildItem C:\PowerShell -Directory -PipelineVariable könyvtár | %{
>>> Get-ChildItem -Path $könyvtár.FullName -PipelineVariable belül | %{
>>> "$($könyvtár.name): $($belül.name)"
>>> }
>>> }
20150923: PowerShell_transcript.STLENO.hEISfK_G.20150923171910.txt
20150923: PowerShell_transcript.STLENO.ME7m43pf.20150923172347.txt
Carbon: ActiveDirectory
Carbon: bin
Carbon: Certificates
A fenti példában az első Get-ChildItemmel a könyvtárakat listázom ki, a második szakaszban ezen könyvtárak tartalmát. Eredményül a könyvtár neve mellett a belső elem nevét akarok kiírni. Az alkalmazott ‑PipelineVariable paraméterrel nagyon egyszerűen tudtam hivatkozni a különböző szakaszok elemeire.
Az -OutBuffer paraméterrel azt határozhatjuk meg, hogy hány elem összegyűjtése után továbbítódjanak az adatok a következő csőszakaszba. Ez alaphelyzetben 1, azaz minden egyes elem rögtön továbbmegy. Bizonyos esetekben, ha egynél nagyobb értéket állítunk be, ezzel hatékonyabbá tehetjük a feldolgozást. Ennek a paraméternek a működését viszonylag nehéz szemléltetni, hiszen kívülről ez nem nagyon látszik, főleg egy könyvben. A következő két kifejezést futtatva azonban észrevehető, hogy az első szinte azonnal adja az első elemet, míg a második csak néhány másodperces késéssel, ami azt mutatja, hogy tényleg legyártotta a 10000 elemet (vagy a összeset, ha az kevesebb, mint 10000) és csak utána került sor a Select-Object-re:
PS C:\> Get-ChildItem c:\ -ErrorAction SilentlyContinue -Recurse | Select-Objec
t -First 1
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2015.08.01. 23:31 Downloads
PS C:\> Get-ChildItem c:\ -ErrorAction SilentlyContinue -Recurse -OutBuffer 100
00| Select-Object -First 1
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2015.08.01. 23:31 Downloads
Az óvatos végrehajtás paramétereit már ismerjük: -WhatIf és -Confirm.