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 legegyszerű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.