Kifejezés- és parancsfeldolgozás

A PowerShell két különböző üzemmódban képes értelmezni a beírt szöveget – kifejezés és parancs üzemmódban. Kifejezés üzemmódban a shell a legtöbb magas szintű programnyelvhez hasonlóan viselkedik: a számokat számnak tekinti, a karakterláncokat idézőjelek közé kell tennünk, stb. Kifejezések például a következők:

2+2

"Helló" + " világ!"

Parancs üzemmódban a karakterláncokhoz nincs szükség idézőjelekre, mivel a shell a változókon és a zárójelben lévő kifejezéseken kívül mindent karakterláncnak tekint. Ilyen módon értelmezi a parancsfeldolgozó az alábbi utasításokat:

write-host 2+2

copy-item egyik.txt masik.txt

Most már csak azt kellene tudnunk, hogy pontosan mi az, aminek hatására a PowerShell egyik vagy másik üzemmódot választja a parancsunk értelmezésére. Az üzemmódot az első beolvasott token (vagyis értelmezhető parancsdarab) fogja meghatározni az alábbiaknak megfelelően:

Kifejezés üzemmódba vált a PowerShell, ha a beírt szöveg számmal (vagy egy pont karaktert követő számmal), idézőjelek közé tett karakterlánccal, vagy $ jellel kezdődik.

Parancs üzemmódba vált a PowerShell, ha a beírt szöveg bármilyen betűvel, a &  karakterrel, egy pont utáni szóközzel, vagy pont utáni betűvel kezdődik.

A két üzemmód vegyes használatát zárójelezéssel érhetjük el, a zárójelek közötti szövegre minden esetben újra megtörténik az üzemmód meghatározása a fenti szempontok szerint.

PS C:\> 2+2

4

PS C:\> Write-Host 2+2

2+2

PS C:\> Write-Host (2+2)

4

PS C:\> (Get-Date).Year + 3

2010

PS C:\> "Get-Date"

Get-Date

PS C:\> &"Get-Date"

 

2007. július 11. 15:37:51

A fenti példákon jól látható a két üzemmód közötti különbség és az üzemmód váltás kényszerítése. Az első utasítást a PowerShell kifejezés üzemmódban értelmezte, elvégezte a műveletet és kiírta az eredményt. A második sor egy cmdlet nevével, vagyis betűvel kezdődik, ennek hatására aktiválódik a parancs üzemmód, és a shell már nem adja össze a két számot, egyszerű karakterláncként (pedig nincs idézőjelek között!) olvassa be. A harmadik sor betűvel kezdődik (parancs üzemmód), de a zárójelek miatt később újra megtörténik az üzemmód meghatározása, és a zárójelben lévő számok hatására a PowerShell az összeadás erejéig kifejezés üzemmódra vált. Az negyedik sorban a zárójeles szövegre parancs üzemmód indul, így a cmdlet kimenete kerül a teljes kifejezésbe. Az ötödik sorban egy karakterláncot adunk meg (ami éppen egy cmdlet neve), de az idézőjelek miatt a PowerShell kifejezés üzemmódra vált, így nem ismeri fel a cmdletet, a nevet egyszerű karakterláncnak tekinti. Az utolsó sorban a & karakter segítségével lefuttatjuk a karakterláncot, vagyis parancs üzemmódra kényszerítjük a shellt.

Ha meg akarjuk számolni, hogy hány parancs (cmdlet) van a PowerShellben, akkor ezt nagyon egyszerűen megtehetjük. A cmdletek listáját a Get-Command adja vissza egy objektumcsoport képében, a .NET-ben pedig minden objektumcsoporthoz tartozik egy Count tulajdonság, amely az elemek számát adja vissza. Vagyis:

[25] PS C:\> get-command.Count

The term 'get-command.Count' is not recognized as the name of a cmdlet, functi

on, script file, or operable program. Check the spelling of the name, or if a

path was included, verify that the path is correct and try again.

At line:1 char:18

+ get-command.Count <<<<

    + CategoryInfo          : ObjectNotFound: (get-command.Count:String) [],

   CommandNotFoundException

    + FullyQualifiedErrorId : CommandNotFoundException

A hibaüzenetből megtudhatjuk, hogy nem sikerült a „Get-Command.Count” utasítást végrehajtani, ahogyan az várható is volt. Természetesen nem egyszerre kellene végrehajtani az egész parancsot, hanem elsőként csak a Get-Command-nak kellene lefutnia, ezután pedig a kimeneten megjelenő gyűjteményre kellene Count-ot kérni. Ezt az alábbi szintaktika szerint érhetjük el:

[26] PS C:\> (get-command).Count

410

Láttuk a fenti példákban, hogy a PowerShell a cmdletek paramétereit alapvetően szövegként értelmezi (parancsmód), kivéve a változókat:

PS C:\> $bla="PowerShell"

PS C:\> Write-Output $bla

PowerShell

Sőt! Ilyenkor még a változó metódusaira és tulajdonságaira is lehet hivatkozni különösebb trükközés nélkül:

PS C:\> Write-Output $bla.Length

10

PS C:\> Write-Output $bla.split("S")

Power

hell



Word To HTML Converter