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