A PowerShell számos változót definiál, amelyek a futtatási környezetre vonatkozó információkkal látnak el bennünket. Nézzük ezeket:
Név |
Érték (pl.) |
Magyarázat |
$ |
c:\hkh.txt |
Az
utolsó paraméter vagy kifejezés az utolsó végrehajtott sorból |
? |
FALSE |
Az
utolsó kifejezés végrehajtásának sikeressége |
^ |
Get-Item |
Az
utolsó cmdlet |
_ |
A
csőelem tartalma |
|
args |
{} |
A
nem nevesített paraméterekhez rendelt paraméterek |
ConfirmPreference |
High |
Rákérdezési
preferencia, High = csak a "nagyon veszélyes" cmdletekre kérdez rá. |
ConsoleFileName |
A
felhasznált konzolfájl |
|
DebugPreference |
SilentlyContinue |
Hibakeresési
preferencia, a Write-Debug cmdlet kezelése |
Error |
{Cannot
find path 'C:\hkh.txt' because it do... |
Az
utolsó $MaximumErrorCount hiba |
ErrorActionPreference |
Continue |
Nem
megszakító hiba esetén továbblépés |
ErrorView |
NormalView |
Hiba
megjelenítésének formája |
ExecutionContext |
System.Management.Automation.EngineIntrinsics |
PowerShell
gazdaalkalmazás futtatási környezete |
FALSE |
FALSE |
A
"hamis" értéke |
FormatEnumerationLimit |
4 |
Gyűjteménytulajdonságok
megjelenítésének maximum darabszáma, utána "…" |
HOME |
C:\Users\Administrator |
Felhasználó
Home könyvtára |
Host |
System.Management.Automation.Internal.Host.I... |
PowerShellt
megjelenítő alkalmazás |
input |
System.Collections.ArrayList+ArrayListEnumer... |
Csővezeték
tartalma |
MaximumAliasCount |
4096 |
Álnevek
maximális száma |
MaximumDriveCount |
4096 |
Meghajtók
maximális száma |
MaximumErrorCount |
256 |
A
$Error változóban megőrzött hibák száma |
MaximumFunctionCount |
4096 |
Függvények
maximális száma |
MaximumHistoryCount |
64 |
Parancstörténet
hossza |
MaximumVariableCount |
4096 |
Változók
maximális száma |
MyInvocation |
System.Management.Automation.InvocationInfo |
A
parancs futtatási környezetének jellemzői |
NestedPromptLevel |
0 |
Aktuális
beágyazottsági szint |
null |
A
Null értéket tartalmazó változó |
|
OutputEncoding |
System.Text.ASCIIEncoding |
A
csővezeték elemei |
PID |
3468 |
A
PowerShell folyamat azonosítója |
PROFILE |
C:\Users\Administrator\Documents\WindowsPowe... |
A
PowerShell alkalmazás profilja |
ProgressPreference |
Continue |
A
Progressbar megszakítási módja |
PSBoundParameters |
{} |
A
függvény meghívásakor megadott paraméterekből és értékeikből képzett
hashtábla |
PSCulture |
hu-HU |
Futtatási
környezet nyelvi beállítása |
PSEmailServer |
PowerShell
számára megadott SMTP kiszolgáló |
|
PSHOME |
C:\Windows\System32\WindowsPowerShell\v1.0 |
PowerShell
telepítési helye |
PSSessionApplicationName |
Wsman |
Távoli
végrehajtás csatlakozási pontjánál meghatározott alkalmazás |
PSSessionConfigurationName |
http://schemas.microsoft.com/powershell/Micr... |
Távoli
végrehajtás alaphelyzet szerinti környezete |
PSSessionOption |
System.Management.Automation.Remoting.PSSess... |
Távoli
csatlakozás beállításai |
PSUICulture |
en-US |
A
Windows nyelvi verziója |
PSVersionTable |
{CLRVersion,
BuildVersion, PSVersion, WSManS... |
PowerShell
által használt technológiák verziószáma |
PWD |
C:\ |
Aktuális
könyvtár |
ReportErrorShowExceptionClass |
0 |
Még
nincs implementálva |
ReportErrorShowInnerException |
0 |
Még
nincs implementálva |
ReportErrorShowSource |
1 |
Még
nincs implementálva |
ReportErrorShowStackTrace |
0 |
Még
nincs implementálva |
ShellId |
Microsoft.PowerShell |
PowerShell
környezet azonosítója |
StackTrace |
Legutóbbi
hiba nyomkövetési információi |
|
TRUE |
TRUE |
Az
"igaz" értéke |
VerbosePreference |
SilentlyContinue |
Write-Verbose
kezelése |
WarningPreference |
Continue |
Write-Warning
kezelése |
WhatIfPreference |
FALSE |
Alaphelyzet
szerinti -WhatIf hozzáillesztése |
Nézzük kicsit részletesebben ezek közül a fontosabbak gyakorlati felhasználását!
Elsőként nézzük a $PSBoundParameters változót! Létrehoztam egy nagyon egyszerű függvényt, aminek csak egy paramétere van, és a függvény törzsében csak annyi történik, hogy kiíratom a $PSBoundParameters változót. Nézzük, hogyan működik:
[14] PS C:\> function vars ($egy) { write-host "PSBound:"; $psboundparameters}
[15] PS C:\> vars
PSBound:
A [15]-ös sorban paraméter nélkül hívtam meg a vars nevű függvényemet és - nem meglepő módon – mivel a $PSBoundParameters nem is kapott semmi értéket, ezért a függvényemnek nincs a címkén kívül igazi kimenete. Ezzel szemben mi történik, ha a paraméternek kifejezetten $null értéket akarunk átadni?
[16] PS C:\> vars -egy $null
PSBound:
Key Value
--- -----
egy
Itt már van kimenete a függvényemnek. A $PSBoundParaméters segítségével tehát el lehet különíteni a kétféle függvényhívási módot. De ez a változó még további dolgokra is képes. Készítek egy újabb függvényt, ami ennek tagjellemzőit írja ki:
[19] PS C:\> function varsmembers ($egy) { write-host "PSBound:"; $psboundparam
eters | Get-Member }
[20] PS C:\> varsmembers 1
PSBound:
TypeName: System.Collections.Generic.Dictionary`2[[System.String, mscorlib,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Ob
ject, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e
089]]
Name MemberType Definition
---- ---------- ----------
Add Method System.Void Add(string key, System....
Clear Method System.Void Clear()
ContainsKey Method bool ContainsKey(string key)
ContainsValue Method bool ContainsValue(System.Object va...
Equals Method bool Equals(System.Object obj)
GetEnumerator Method System.Collections.Generic.Dictiona...
GetHashCode Method int GetHashCode()
GetObjectData Method System.Void GetObjectData(System.Ru...
GetType Method type GetType()
OnDeserialization Method System.Void OnDeserialization(Syste...
Remove Method bool Remove(string key)
ToString Method string ToString()
TryGetValue Method bool TryGetValue(string key, System...
BoundPositionally NoteProperty System.Collections.Generic.List`1[[...
Item ParameterizedProperty System.Object Item(string key) {get...
Comparer Property System.Collections.Generic.IEqualit...
Count Property System.Int32 Count {get;}
Keys Property System.Collections.Generic.Dictiona...
Values Property System.Collections.Generic.Dictiona...
Látható, hogy ez nagyjából hashtábla, de mégsem teljesen. Ennek vizsgálatára készítettem egy egyszerű hashtáblát és összehasonlítottam a két dolog tagjellemzőit:
[21] PS C:\> $h = @{egy = 1}
[22] PS C:\> $o1 = varsmembers 1
PSBound:
[23] PS C:\> $o2 = $h | gm
[24] PS C:\> Compare-Object $o2 $o1 -Property name
name SideIndicator
---- -------------
TryGetValue =>
BoundPositionally =>
Comparer =>
Clone <=
Contains <=
CopyTo <=
IsFixedSize <=
IsReadOnly <=
IsSynchronized <=
SyncRoot <=
Látható, hogy ennek a $PSBoundParameters hashtábla-szerűségnek van TryGetValue, BoundPositionally és Comparer metódusa, de nincs Clone, Contains, CopyTo metódusa és néhány tulajdonsága. Ezen kívül van számos közös jellemzőjük:
[29] PS C:\> Compare-Object $o2 $o1 -Property name -IncludeEqual -ExcludeDiffer
ent
name SideIndicator
---- -------------
Add ==
Clear ==
ContainsKey ==
ContainsValue ==
Equals ==
GetEnumerator ==
GetHashCode ==
GetObjectData ==
GetType ==
OnDeserialization ==
Remove ==
ToString ==
Item ==
Count ==
Keys ==
Values ==
Azaz menet közben hozzá lehet adni a paraméterekhez még egyet az Add metódussal, vagy el lehet távolítani közülük (Remove, Clear), meg lehet vizsgálni, hogy van-e használatban valamelyik paraméter (ContainsKey). Ezekkel a lehetőségekkel majd a fejlett függvényeknél fogunk játszani a 2.5.7 Meglevő cmdletek kiegészítése, átalakítása fejezetben, amikor is meglevő cmdletekhez készítünk olyan „burkoló” függvényeket, amelyekkel további paramétereket tudunk megadni, vagy meglevőket tudunk elrejteni.
Az automatikus változók egy jó része a PowerShell működésének néhány alapvető jellemzőjét befolyásolja. Ezeknek a nevében ott van a Preference kifejezés:
[43] PS C:\> Get-Variable *preference
Name Value
---- -----
ConfirmPreference High
DebugPreference SilentlyContinue
ErrorActionPreference Continue
ProgressPreference Continue
VerbosePreference SilentlyContinue
WarningPreference Continue
WhatIfPreference False
Illetve PowerShell 5.0-tól kezdődően van még:
InformationPreference SilentlyContinue
Nézzük az elsőt kicsit részletesebben. A $ConfirmPreference változó lehetséges értékei és hatásuk:
Érték |
Működés |
None |
Automatikusan nem kérdez rá egyetlen cmdlet végrehajtására sem. De a -Confirm paraméter használatával egyedileg beállítható ettől eltérő működés. |
Low |
Azok a cmdletek, melyek bármilyen veszélyességűek (magas, közepes, alacsony) megerősítést kérnek. Egyedileg a –confirm paraméterrel kikapcsolható a rákérdezés. |
Medium |
A közepes és magas kockázatú cmdletek kérnek megerősítést, az alacsonyak lefutnak enélkül. Megint csak a –confirm paraméterrel felülbírálható ez a működés. |
High |
Ez az alaphelyzet szerinti beállítás. Csak a magas kockázatú cmdletek kérnek megerősítést. |
A $WhatIfPreference két értéket vehet fel: $true vagy $false. Ha $true értéket adunk, akkor minden „ShouldProcess” típusú provideren végrehajtott változást okozó cmdlet csak számot ad arról, hogy mit csinálna, de tényleges változást nem okoz, csak ha használjuk a ‑WhatIf:$false paramétert.
A többi preferenciaváltozó a szkriptek és a csőfeldolgozás tovább haladást szabályozza. Látható, hogy alaphelyzetben minden esetben (kivéve a megszakító hibák) a szkriptjeink futása tovább halad, a Debug, Verbose és Information üzenetek némán, a többi kiadja magából a közlendőjét és folytatja a tevékenységet. Ezeket felülbírálhatjuk, és a következő lehetőségeket állíthatjuk be: SilentlyContinue, Stop, Continue, Inquire, Suspend és PowerShell 3.0-tól még Ignore is. Ezekről bővebben a 2.4 Hibakezelés fejezetben lesz szó.
Jó lenne a PowerShell ablakot is minél komfortosabbá tenni. Ennek néhány lehetősége (QuickEdit mode, ablakszélesség, stb.) már a 1.1.5 Gyorsbillentyűk, beállítások fejezetben szerepelt. Az ott leírtaknál kicsit több is rendelkezésünkre áll, ehhez tudni kell, hogy létezik egy $host automatikus változó, ami a PowerShell ablak sok jellemzőjét tartalmazza.
[1] PS C:\> $host
Name : ConsoleHost
Version : 2.0
InstanceId : f6cc65f2-c8aa-4c7b-87c9-f1d2e1e6ade8
UI : System.Management.Automation.Internal.Host.InternalHos
tUserInterface
CurrentCulture : hu-HU
CurrentUICulture : en-US
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace
Közvetlenül a $host még nem igazán a mi barátunk, de nézzük ennek tagjellemzőit:
[3] PS C:\> $host | gm
TypeName: System.Management.Automation.Internal.Host.InternalHost
Name MemberType Definition
---- ---------- ----------
EnterNestedPrompt Method System.Void EnterNestedPrompt()
Equals Method bool Equals(System.Object obj)
ExitNestedPrompt Method System.Void ExitNestedPrompt()
GetHashCode Method int GetHashCode()
GetType Method type GetType()
NotifyBeginApplication Method System.Void NotifyBeginApplication()
NotifyEndApplication Method System.Void NotifyEndApplication()
PopRunspace Method System.Void PopRunspace()
PushRunspace Method System.Void PushRunspace(runspace runs...
SetShouldExit Method System.Void SetShouldExit(int exitCode)
ToString Method string ToString()
CurrentCulture Property System.Globalization.CultureInfo Curre...
CurrentUICulture Property System.Globalization.CultureInfo Curre...
InstanceId Property System.Guid InstanceId {get;}
IsRunspacePushed Property System.Boolean IsRunspacePushed {get;}
Name Property System.String Name {get;}
PrivateData Property System.Management.Automation.PSObject ...
Runspace Property System.Management.Automation.Runspaces...
UI Property System.Management.Automation.Host.PSHo...
Version Property System.Version Version {get;}
Még itt sem biztos, hogy felcsillan a szemünk, de nézzük a sokat sejtető RawUI-t:
[5] PS C:\> $host.ui.rawui | gm
TypeName: System.Management.Automation.Internal.Host.InternalHostRawUserI
nterface
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
FlushInputBuffer Method System.Void FlushInputBuffer()
GetBufferContents Method System.Management.Automation.Host.Buffer...
GetHashCode Method int GetHashCode()
GetType Method type GetType()
LengthInBufferCells Method int LengthInBufferCells(string str), int...
NewBufferCellArray Method System.Management.Automation.Host.Buffer...
ReadKey Method System.Management.Automation.Host.KeyInf...
ScrollBufferContents Method System.Void ScrollBufferContents(System....
SetBufferContents Method System.Void SetBufferContents(System.Man...
ToString Method string ToString()
BackgroundColor Property System.ConsoleColor BackgroundColor {get...
BufferSize Property System.Management.Automation.Host.Size B...
CursorPosition Property System.Management.Automation.Host.Coordi...
CursorSize Property System.Int32 CursorSize {get;set;}
ForegroundColor Property System.ConsoleColor ForegroundColor {get...
KeyAvailable Property System.Boolean KeyAvailable {get;}
MaxPhysicalWindowSize Property System.Management.Automation.Host.Size M...
MaxWindowSize Property System.Management.Automation.Host.Size M...
WindowPosition Property System.Management.Automation.Host.Coordi...
WindowSize Property System.Management.Automation.Host.Size W...
WindowTitle Property System.String WindowTitle {get;set;}
Itt már minden van, ami hasznos lehet. Gyakorlatilag az ablak legtöbb tulajdonsága ezen objektumon keresztül lekérdezhető és beállítható. Például cseréljük le az ablak fejlécének szövegét:
65 . ábra Megváltoztatott ablak-fejléc
A konzol különleges helyzetekben (hibajelzés, figyelmeztető üzenetek, stb.) az alaphelyzet szerinti színektől eltérő módon jelzi a hátteret és a karaktereket. Ezeket a privatedata tulajdonságon keresztül tudjuk lekérdezni és módosítani:
[6] PS C:\> $host.PrivateData
ErrorForegroundColor : Red
ErrorBackgroundColor : Black
WarningForegroundColor : Yellow
WarningBackgroundColor : Black
DebugForegroundColor : Yellow
DebugBackgroundColor : Black
VerboseForegroundColor : Yellow
VerboseBackgroundColor : Black
ProgressForegroundColor : Yellow
ProgressBackgroundColor : DarkCyan
Billentyűleütésre váró programok készíthetők a ReadKey() metódus segítségével:
[13] PS I:\>$host.ui.rawui.ReadKey()
a
VirtualKeyCode Character ControlKeyState KeyDown
-------------- --------- --------------- -------
65 a NumLockOn True
Kimeneteként láthatjuk a karakterkódot és a leütött karaktert magát is. Ha nem akarjuk látni a leütött karaktert, akkor használhatjuk a ReadKey() különböző opciói közül a NoEcho-t, amelyet vagy az IncludeKeyDown, vagy az IncludeKeyDown opcióval együtt kell használni:
[14] PS C:\>$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
VirtualKeyCode Character ControlKeyState KeyDown
-------------- --------- --------------- -------
74 j NumLockOn True
Az IncludeKeyUp használatával csak a billentyű felengedésekor ad kimenetet a kifejezés. Ez akkor hasznos, ha a Shift vagy egyéb kiegészítő billentyűt is akarjuk használni, hiszen ha a lenyomásra élesedne, akkor már a Shifthez való hozzáéréskor lefutna a metódus és nem lenne idő az „igazi” billentyű lenyomására. Például egy Shift+Ctrl+Alt+w megnyomása esetén a metódus futásának eredménye így néz ki:
[15] PS C:\>$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") | fl *
VirtualKeyCode : 87
Character :
ControlKeyState : LeftAltPressed, LeftCtrlPressed, ShiftPressed, NumLockOn
KeyDown : False
Ezzel, és még egy opció, az „AllowCtrlC” megadásával akár a Ctrl+C is megfigyeltethető:
[16] PS C:\>$host.UI.RawUI.ReadKey("NoEcho,AllowCtrlC,IncludeKeyUp")
VirtualKeyCode Character ControlKeyState KeyDown
-------------- --------- --------------- -------
67 ♥ LeftCtrlPressed False
A PowerShell saját adatbekérő komponensét is felhasználhatjuk intelligensebb interakció megvalósításához. Nézzünk erre is egy példát:
$title = "Kérem a véleményed!"
$message = "Szereted-e a PowerShellt?"
$yes = New-Object System.Management.Automation.Host.ChoiceDescription `
"&Igen", "Már nagyon szeretem."
$no = New-Object System.Management.Automation.Host.ChoiceDescription `
"&Nemsokára fogom", "Még nem, de hamarosan nagyon fogom szeretni."
$maybe = New-Object System.Management.Automation.Host.ChoiceDescription `
"&Talán", "Még sokat kell tanulnom, de szerintem menni fog."
$options = [System.Management.Automation.Host.ChoiceDescription[]](
$yes, $no, $maybe)
$result = $host.ui.PromptForChoice($title, $message, $options, 0)
switch ($result)
{
0 {"Azt mondtad, hogy szereted!"}
1 {"Azt mondtad, hogy szeretni fogod."}
2 {"Azt mondtad, hogy éppen tanulod."}
}
Ha ezt futtatjuk, akkor a „confirm” üzemmódnál látott felület jelenik meg:
[21] PS C:\> $result = $host.ui.PromptForChoice($title, $message, $options, 0)
Kérem a véleményed!
Szereted-e a PowerShellt?
[I] Igen [N] Nemsokára fogom [T] Talán [?] Help (default is "I"): ?
I - Már nagyon szeretem.
N - Még nem, de hamarosan nagyon fogom szeretni.
T - Még sokat kell tanulnom, de szerintem menni fog.
[I] Igen [N] Nemsokára fogom [T] Talán [?] Help (default is "I"): n
Ha kérdőjelet adunk be, akkor előjönnek a magyarázó szövegek, az alaphelyzet szerinti válasz a sárgán kiemelt, jelen esetben az Igen, hiszen a $host.ui.PromptForChoice metódus negyedik paraméterének a 0 lett megadva, ez jelzi azt, hogy melyik az alaphelyzet szerinti válasz.