11. Modulok

11.1 Bevezetés

Ahogy a 3.14-es dokumentumban is olvasható, a modulok önálló, újrahasználható egységek, amelyek lehetővé teszik a PowerShell-kód particionálását, rendszerezését és absztrakcióját. Egy modul egy vagy több modultagot tartalmazhat, amelyek parancsok (például parancsmagok és függvények) és elemek (például változók és aliasok). Ezeknek a tagoknak a nevei privátan is tarthatók a modul számára, vagy exportálhatók arra a munkamenetre, amelybe a modult importálják.

Három különböző modultípus létezik: jegyzék, szkript és bináris. A jegyzékmodul egy olyan fájl, amely információkat tartalmaz egy modulról, és szabályozza a modul használatának bizonyos aspektusait. A szkriptmodulok a helyett fájlkiterjesztésű PowerShell-parancsfájlok .psm1 .ps1. A bináris modulok parancsmagokat és szolgáltatókat definiáló osztálytípusokat tartalmaznak. A szkriptmodulokkal ellentétben a bináris modulok lefordított nyelveken vannak megírva. Ez a specifikáció nem terjed ki a bináris modulokra.

A bináris modul egy .NET-szerelvény (azaz EGY DLL), amely a PowerShell-kódtárakra lett lefordítva.

A modulok beágyazhatnak; ez azt jelenti, hogy egy modul importálhat egy másik modult. A beágyazott modulokkal társított modulok gyökérmodulok.

PowerShell-munkamenet létrehozásakor a rendszer alapértelmezés szerint nem importál modulokat.

Modulok importálásakor a kereséshez használt keresési útvonalat a PSModulePath környezeti változó határozza meg.

A következő parancsmagok a modulokkal foglalkoznak:

11.2 Szkriptmodul írása

A szkriptmodul egy szkriptfájl. Tekintse meg a következő szkriptmodult:

function Convert-CentigradeToFahrenheit ([double]$tempC) {
    return ($tempC * (9.0 / 5.0)) + 32.0
}
New-Alias c2f Convert-CentigradeToFahrenheit

function Convert-FahrenheitToCentigrade ([double]$tempF) {
    return ($tempF - 32.0) * (5.0 / 9.0)
}
New-Alias f2c Convert-FahrenheitToCentigrade

Export-ModuleMember -Function Convert-CentigradeToFahrenheit
Export-ModuleMember -Function Convert-FahrenheitToCentigrade
Export-ModuleMember -Alias c2f, f2c

Ez a modul két függvényt tartalmaz, amelyek mindegyikének van aliasa. Alapértelmezés szerint a rendszer az összes függvénynevet és csak a függvényneveket exportálja. Ha azonban a parancsmagot Export-ModuleMember már felhasználta bármi exportálására, akkor csak a kifejezetten exportált dolgok lesznek exportálva. Parancsok és elemek sorozata exportálható egyetlen hívásban vagy a parancsmag számos hívásában; Az ilyen hívások összegző jellegűek az aktuális munkamenethez.

11.3 Szkriptmodul telepítése

A szkriptmodul egy szkriptfájlban van definiálva, és a modulok bármilyen könyvtárban tárolhatók. A PSModulePath környezeti változó arra a könyvtárkészletre mutat, amelyekben keresni kell, amikor a modulhoz kapcsolódó parancsmagok olyan modulokat keresnek, amelyeknek a neve nem tartalmaz teljes elérési utat. További keresési útvonalakat is meg lehet adni; például:

$Env:PSModulepath = $Env:PSModulepath + ";<additional-path>"

A hozzáadott további elérési utak csak az aktuális munkamenetet érintik.

Azt is meg lehet adni, hogy a modul importálva van-e.

11.4 Szkriptmodul importálása

A modul erőforrásainak használata előtt a modult importálni kell az aktuális munkamenetbe a parancsmag használatával Import-Module. Import-Module korlátozhatja a ténylegesen importálható erőforrásokat.

Amikor importál egy modult, a rendszer végrehajtja annak szkriptfájlját. Ez a folyamat úgy konfigurálható, hogy meghatároz egy vagy több paramétert a szkriptfájlban, és a ArgumentList paraméterével adja meg a megfelelő argumentumokat Import-Module.

Vegyük például a következő szkriptet, amely a -11.2 által meghatározott függvényeket és aliasokat használja:

Import-Module "E:\Scripts\Modules\PSTestTemperature_" -Verbose

"0 degrees C is &quot; + (Convert-CentigradeToFahrenheit 0) + &quot; degrees F"
"100 degrees C is " + (c2f 100) + " degrees F"
"32 degrees F is " + (Convert-FahrenheitToCentigrade 32) + " degrees C"
"212 degrees F is " + (f2c 212) + " degrees C"

Egy modul importálása névütközést okoz, ha a modulban lévő parancsok vagy elemek neve megegyezik a munkamenet parancsai vagy elemei nevével. A névütközés azt váltja ki, hogy a név rejtett vagy lecserélve van. A Előtag paramétere Import-Module az elnevezési ütközések elkerülésére használható. Emellett az Alias, a Parancsmag**, a** Függvény és a Változó paraméter korlátozhatja az importálandó parancsok kiválasztását, ezáltal csökkentve a névütközés esélyét.

Még ha egy parancs rejtett is, akkor is futtatható, ha a nevét annak a modulnak a nevével minősíti, amelyből származik. A például meghívja & M\F 100 az F függvényt az M modulban, és átadja neki a 100-as argumentumot.

Ha a munkamenet azonos nevű parancsokat tartalmaz, például két azonos nevű parancsmagot, alapértelmezés szerint a legutóbb hozzáadott parancsot futtatja.

A modulok hatókörének megvitatásért tekintse meg a következőt: .3.5.6 .

11.5 Szkriptmodul eltávolítása

A parancsmaggal egy vagy több modul távolítható el a munkamenetből Remove-Module.

A modulok eltávolítása nem távolítja el a modult.

Egy szkriptmodulban az alábbiak szerint meg lehet adni a modul eltávolítása előtt végrehajtandó kódot:

$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = { *on-removal-code* }

11.6 Moduljegyzékek

Ahogy az a 11.1-es dokumentumban is található, a jegyzékmodul egy olyan fájl, amely információkat tartalmaz egy modulról, és szabályozza a modul használatának bizonyos aspektusait.

A modulnak nem kell egy megfelelő jegyzékfájllal, de ha igen, akkor a jegyzékfájl neve megegyezik az itt leírott modul nevével, .psd1 de fájlkiterjesztéssel.

A jegyzékfájl a PowerShell-szkript korlátozott részhalmazát tartalmazza, amely egy kulcskészletet tartalmazó kivonattáblát ad vissza. Ezek a kulcsok és azok értékei határozzák meg a modul jegyzékelemét. Ez azt jelenti, hogy ismertetik a modul tartalmát és attribútumát, meghatározzák az előfeltételeket, és meghatározzák az összetevők feldolgozásának folyamatát.

A jegyzék lényegében egy adatfájl; Azonban tartalmazhat adattípus-hivatkozásokat, az if utasítást, valamint az aritmetikai és összehasonlító operátorokat. (A hozzárendelések, függvénydefiníciók és hurkok nem engedélyezettek.) A jegyzékfájl olvasási hozzáféréssel rendelkezik a Join-Pathkörnyezeti változókhoz, és a parancsmag hívásait is tartalmazhatja, így elérési utakat lehet összeépíteni.

Megjegyzés

Szerkesztő megjegyzése: Az eredeti dokumentum a modul jegyzékfájljában engedélyezett kulcsok listáját tartalmazza. Ez a lista elavult és hiányos. A moduljegyzékben található kulcsok teljes listájáért lásd: New-ModuleManifest.

Az egyetlen szükséges kulcs a ModuleVersion.

Példa egy egyszerű jegyzékfájlra:

@{
ModuleVersion = '1.0'
Author = 'John Doe'
RequiredModules = @()
FunctionsToExport = 'Set*','Get*','Process*'
}

A kulcs GUID-ja rendelkezik egy string értékkel. Ez globálisan egyedi IDentifier (GUID) azonosítót ad meg a modulhoz. A GUID használatával megkülönböztethetők az azonos nevű modulok. Új GUID létrehozásához hívja meg a metódust [guid]::NewGuid().

11.7 Dinamikus modulok

A dinamikus modulok olyan modulok, amelyek futásidőben vannak létrehozva a memóriában a parancsmag által New-Module; nem töltődnek be a lemezről. Tekintse meg a következő példát:

$sb = {
    function Convert-CentigradeToFahrenheit ([double]$tempC) {
        return ($tempC * (9.0 / 5.0)) + 32.0
    }

    New-Alias c2f Convert-CentigradeToFahrenheit

    function Convert-FahrenheitToCentigrade ([double]$tempF) {
        return ($tempF - 32.0) * (5.0 / 9.0)
    }

    New-Alias f2c Convert-FahrenheitToCentigrade

    Export-ModuleMember -Function Convert-CentigradeToFahrenheit
    Export-ModuleMember -Function Convert-FahrenheitToCentigrade
    Export-ModuleMember -Alias c2f, f2c
}

New-Module -Name MyDynMod -ScriptBlock $sb
Convert-CentigradeToFahrenheit 100
c2f 100

A szkriptblokk $sb határozza meg a modul tartalmát, ebben az esetben a függvények két függvényét és két aliasát. A lemezen lévő modulokhoz mint a rendszer alapértelmezés szerint csak a függvényeket exportálja, Export-ModuleMember így parancsmaghívások is léteznek a függvények és az aliasok exportálásához.

A New-Module futtatás után az exportált négy név használható a munkamenetben, Convert-CentigradeToFahrenheit ahogy az és a c2f hívása is mutatja.

Mint minden modul, a dinamikus modulok tagjai is privát modulhatókörben futnak, amely a globális hatókör gyermeke. Get-Module A nem tud dinamikus modult leküldni, de Get-Command le tudja szerezni az exportált tagokat.

Ha egy dinamikus modult elérhetővé kell tenni a New-Module Import-ModuleszámáraGet-Module, a parancsnak át kell küldődni, vagy a visszaadott modulobjektumot New-Module a következőnek kell áthozni: Import-Module. Ez a művelet hozzáadja a dinamikus modult Get-Module a listához, de nem menti a modult lemezre, és nem teszi állandóvá.

11.8 Lezárások

A dinamikus modulokkal lezárást hozhat létre, csatolt adatokat tartalmazó függvényt. Tekintse meg a következő példát:

function Get-NextID ([int]$startValue = 1) {
    $nextID = $startValue
    {
        ($script:nextID++)
    }.GetNewClosure()
}

$v1 = Get-NextID      # get a scriptblock with $startValue of 0
& $v1                 # invoke Get-NextID getting back 1
& $v1                 # invoke Get-NextID getting back 1

$v2 = Get-NextID 100  # get a scriptblock with $startValue of 100
& $v2                 # invoke Get-NextID getting back 100
& $v2                 # invoke Get-NextID getting back 101

A szándék itt az, hogy egy Get-NextID sorozat következő olyan azonosítóját adja vissza, amelynek kezdőértéke meg van adva. Azonban több sorozatot is támogatni kell, mindegyiknek saját környezetével $startValue és környezetével $nextID . Ez a metódus hívásával érhető el [scriptblock]::GetNewClosure (").4.3.7).

Minden alkalommal GetNewClosure, amikor a létrehoz egy új lezárást, új dinamikus modul jön létre, és a hívó hatókörében (ebben az esetben a növekményt tartalmazó szkriptblokkban) található változókat a rendszer ebbe az új modulba másolja. Annak biztosításához, hogy a szülőf függvényben (de a szkriptblokkon kívül) meghatározott nextId értéke nő, szükség van az explicit szkript: hatókör-előtagra.

A szkriptblokknak természetesen nem kell elnevezett függvénynek lennie; például:

$v3 = & {      # get a scriptblock with $startValue of 200
    param ([int]$startValue = 1)
    $nextID = $startValue
    {
        ($script:nextID++)
    }.GetNewClosure()
} 200

& $v3          # invoke script getting back 200
& $v3          # invoke script getting back 201