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:
- Get-Module: Azonosítja az importált vagy importálható modulokat
- Import-Module: Hozzáad egy vagy több modult az aktuális munkamenethez (lásd :11.4)
- Export-ModuleMember: Azonosítja az exportálni következő modultagokat:
- Remove-Module: Eltávolít egy vagy több modult az aktuális munkamenetből (lásd :11.5)
- New-Module: Dinamikus modult hoz létre (lásd : 11.7)
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 " + (Convert-CentigradeToFahrenheit 0) + " 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-Path
kö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-Module
szá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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: