Szkriptmodulok

Eddig a „gyári”, mások által létrehozott modulokat láttuk. De – ellentétben a snapinekkel, ahol már fejlesztőeszköz kellene a készítésükhöz – modult mi is könnyen tudunk készíteni.

A PowerShell 2.0-ban többfajta modult lehet létrehozni, importálni. Ezek közül számunkra, rendszergazdáknak a legfontosabbak a szkriptmodulok. A szkriptmodul egy psm1 kiterjesztésű fájl, ami PowerShell szkriptet tartalmaz. Ezt tudjuk legegszerűbben létrehozni, hiszen akár egy már meglevő, bevált szkriptünket egyszerű fájlátnevezéssel modullá tehetjük. Mivel tud többet egy szkriptmodul, mint a szkriptfájl? Elsősorban a szkriptben található függvények, változók és egyéb elemek láthatóságát, hozzáférhetőségét tudjuk kényelmesebben szabályozni a csak modulokban alkalmazható export‑modulemember cmdlet segítségével. A másik előny, hogy nem kell „dotsourcing” segítségével átemelni az szkript függvényeit és egyéb elemeit. Nézzünk erre egy példát! A következőkben létrehozok egy szkriptmodult, ami egy olyan függvényt definiál (Read-Popup), amivel egy felugró ablakot lehet kirakni a képernyőre:

$ButtonTypes = @{

    OK = 0;

    OKCancel = 1;

    AbortRetryIgnore = 2;

    YesNoCancel = 3; 

    YesNo = 4;

    RetryCancel = 5

}

 

$IconTypes = @{

    Stop = 16;

    Question = 32;

    Exclamation = 48;

    Information = 64

}

 

$ReturnButtons = @{

    1 = "OK";

    2 = "Cancel";

    3 = "Abort";

    4 = "Retry";

    5 = "Ignore";

    6 = "Yes";

    7 = "No"

    -1 = "TimeOut"

}

 

function Read-Popup

{

    param (

        [string] $str = "",

        [int] $wait = 0,

        [string] $title = "Message",

        [string] $buttontype = "OK",

        [string] $icontype = "Information"

    )

    $com = New-Object -ComObject WScript.Shell

   

    $button = if(!$buttontypes.$buttontype){0} else {$buttontypes.$buttontype}

    $icon = if(!$icontypes.$icontype){64} else {$icontypes.$icontype}

   

    $ret = $com.popup($str,$wait,$title,$button+$icon)

    return $returnbuttons.$ret

}

New-Alias -Name popup -Value Read-Popup

Export-ModuleMember -Function Read-Popup -Variable ReturnButtons -Alias popup

Ezt a fájlt elmentettem popup.psm1 néven egy Popup nevű könyvtárba, amit a C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ helyre tettem.

Megjegyzés

Fontos, hogy a modulfájl neve és a könyvtár neve egyforma legyen. Ha különbözők, akkor nem lehet importálni.

A szkriptfájl elején definiáltam néhány hashtábla változót, hogy a függvényemet könnyebben lehessen paraméterezni. Ezután definiáltam magát a függvényt, majd létrehoztam egy becenevet a függvényemhez, majd az Export-ModuleMember  cmdlet segítségével meghatároztam, hogy ebből a szkriptmodulból mit akarok  láttatni a külvilággal. Például nem akarom láttatni a $ButtonTypes és a $IconTypes változóimat, mert erre nem valószínű, hogy az én függvényemen kívül bárkinek is szüksége lehet. De a többi elemet, magát a függvényt, a $ReturnButtons változót és a becenevet exportáltam, mert ezek fontosak a későbbi felhasználást tekintve.

Ha meg akarom közvetlenül hívni a popup.psm1 fájlt, mint egy szkriptet, akkor az nem hajtódik végre, hanem a hozzá rendelt szkripszerkesztőben megnyílik szerkesztésre.

Nézzük, akkor hogyan lehet felhasználni ezt a modult:

[1] PS C:\> Get-Module -ListAvailable

 

ModuleType Name                      ExportedCommands

---------- ----                      ----------------

Manifest   ActiveDirectory           {}

Manifest   ADRMS                     {}

Manifest   AppLocker                 {}

Manifest   BestPractices             {}

Manifest   BitsTransfer              {}

Manifest   GroupPolicy               {}

Script     PopUp                     {}

Manifest   psdiagnostics             {Enable-PSTrace, Enable-WSManTrace, ...

Manifest   ServerManager             {}

Manifest   TroubleshootingPack       {}

Látható, hogy megtalálta a PopUp modulomat a get-module cmdlet. Importálom a modult, és nézzük meg, hogy mit hozott be a PowerShell környezetbe:

[2] PS C:\> Import-Module popup

[3] PS C:\> Get-Module popup | fl

 

 

Name              : popup

Path              : C:\Windows\system32\WindowsPowerShell\v1.0\Modules\popup

                    \popup.psm1

Description       :

ModuleType        : Script

Version           : 0.0

NestedModules     : {}

ExportedFunctions : Read-Popup

ExportedCmdlets   : {}

ExportedVariables : ReturnButtons

ExportedAliases   : popup

A Get-Module megadta, hogy pont azok az elemek érhetők el, amit engedélyeztem az export‑modulemember cmdlet segítségével.

Amúgy az export-modulemember cmdlet elhagyható a modulból, csakhogy a PowerShell ilyenkor automatikusan exportálja az összes függvényt, viszont nem exportál egy változót és becenevet sem. Nézzük ezt meg a következő példában, itt kivettem a szkriptmodul fájlból az utolsó sort:

[4] PS C:\> Remove-Module popup

[5] PS C:\> Import-Module popup

[6] PS C:\> Get-Module popup | fl

 

 

Name              : popup

Path              : C:\Windows\system32\WindowsPowerShell\v1.0\Modules\popup

                    \popup.psm1

Description       :

ModuleType        : Script

Version           : 0.0

NestedModules     : {}

ExportedFunctions : Read-Popup

ExportedCmdlets   : {}

ExportedVariables : {}

ExportedAliases   : {}

A [4]-es sorban eltávolítottam a korábban importált popup modult, majd a módosított fájlt újra importáltam az [5]-ös sorban. Ha megnézzük így a modul jellemzőit a [6]-os sorban, akkor látható, hogy csak a függvényem érhető el.



Word To HTML Converter