A $ExecutionContext változó

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…



Word To HTML Converter