Automatikus változók

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!

Paraméterezés vizsgálata ($PSBoundParameters)

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.

Preferencia-változók

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ábbhaladást szabályozza. Látható, hogy alaphelyzetben minden esetben (kivéve a megszakító hibák) a szkriptjeink futása továbbhalad, 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ó.

Lépjünk kapcsolatba a konzolablakkal ($host)

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:

57 . á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

Adatbevitel feleletválasztással

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.



Word To HTML Converter