Az előző fejezetben láthattuk, hogy az $ExecutionContext segítségével például egy függvénnyel felüldefiniált cmldet eredetijét is el tudjuk érni és tudjuk futtatni, de sok egyéb praktikus dolgot is végre tudunk segítségével hajtani.
Az első példában nézzünk egy olyan feladatot, amikor a felhasználótól várunk egy kifejezést, amit végre akarunk hajtani:
PS C:\> $a = 1
PS C:\> $expression = Read-Host
Az 'a' tartalma: $a
PS C:\> $expression
Az 'a' tartalma: $a
Az $expression változóban egy szöveg van, mivel Read-Host mindig szövegként adja vissza a beadott kifejezést, de most ez az, amit végre szeretnénk hajtani. A legelegánsabb módja ennek az $ExecutionContext.InvokeCommand.ExpandString metódus használata:
PS C:\> $ExecutionContext.InvokeCommand.ExpandString($expression)
Az 'a' tartalma: 1
Persze erre használhatunk más módszereket is, de talán ezek nem annyira szépek a sok idézőjel használata miatt:
PS C:\> & ([scriptblock]::Create("""$expression"""))
Az 'a' tartalma: 1
PS C:\> Invoke-Expression """$expression"""
Az 'a' tartalma: 1
Az $ExecutionContext-el szabályozhatjuk, hogy mely alkalmazások és szkriptel legyenek futtathatók az aktuális PowerShell munkamenetben. Alaphelyzetben mindkettőre a „*”, azaz „minden” van megadva:
PS C:\> $ExecutionContext.SessionState.Scripts
*
PS C:\> $ExecutionContext.SessionState.Applications
*
Ezeket át lehet írni tetszőleges listákkal. Az alábbi példában mind az engedélyezett szkriptek körét, mind az alkalmazásokat leszűkítettem 1-1 lehetőségre:
PS C:\> $ExecutionContext.SessionState.Scripts.Clear()
PS C:\> $ExecutionContext.SessionState.Scripts.Add("C:\PSKönyv\multi-step.ps1")
PS C:\>
PS C:\> $ExecutionContext.SessionState.Applications.Clear()
PS C:\> $ExecutionContext.SessionState.Applications.Add("notepad.exe")
PS C:\> ping.exe
ping.exe : The term 'PING.EXE' is not recognized as the name of a cmdlet, func
tion, 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:1
+ ping.exe
+ ~~~~~~~~
+ CategoryInfo : ObjectNotFound: (PING.EXE:String) [], CommandNo
tFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\> C:\PSKönyv\Realjobs.ps1
C:\PSKönyv\Realjobs.ps1 : The term 'C:\PSKönyv\Realjobs.ps1' is not recognized
as the name of a cmdlet, function, script file, or operable program. Check th
e spelling of the name, or if a path was included, verify that the path is cor
rect and try again.
At line:1 char:1
+ C:\PSKönyv\Realjobs.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\PSKönyv\Realjobs.ps1:String
) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Látható, ha ezektől eltérő dolgot akarok futtatni, hibajelzést kapok. Mondjuk ez a hibajelzés lehetne kicsit egyértelműbb is…