A PowerShell modulokkal való munka a PowerShell automatizálás fontos része. Amikor elkezdjük tanulni a PowerShellt, az első lépések általában az egyes parancsok használatával történnek. Ez szkriptek készítéséhez vezet, amelyek aztán függvények készítéséhez vezetnek.

A függvények használatával modulárisabbá teheti szkriptjeit. Ez lehetővé teszi, hogy ugyanazt a kódot sok helyen használhassa anélkül, hogy a kódot mindenhova másolná és beillesztené. A függvények használatával kevesebb időt tölthet azzal, hogy ugyanazt a kódot mindenhol ugyanazzal a szerkesztéssel módosítja. Ehelyett egyetlen helyen dolgozhat a kódja jobbá tételén.

A függvények magasabb szintre emeléséhez ezeket a függvényeket modulban egyesítheti.

A modul függvények gyűjteménye egy psm1 kiterjesztésű szövegfájlban. Van néhány opcionális kiegészítés, mint például a modul manifeszt és a komment alapú vagy külső súgó, amely szintén tartalmazhat. Ezekről később lesz szó.

Tartalomjegyzék

Előfeltételek

Ez a cikk a Windows PowerShell 5.1-et használja. Ha régebbi verziót vagy a PowerShell Core-t használja, a látott eredményeket illetően eltérhet a mérföldköze.

A modulokkal való interakció

A PowerShell munkamenet első megnyitásakor két modullal indul. Az első a Microsoft.PowerShell.Utility, amely számos olyan alapvető PowerShell-funkciót tartalmaz, amelyet már használ. A másik modul a PSReadline. Ezeket a kezdőmodulokat a Get-Module paranccsal láthatja.

Modulok listázása a Get-Module

Azt mondjuk, hogy ez nem egy teljes lista az összes elérhető modulról. A PowerShell 3 óta a telepített modulok szükség szerint importálódnak. Ha a PowerShell egy régebbi verzióját használja, akkor a Import-Module paranccsal először importálnia kell a modult, mielőtt bármelyik parancsot használná.

Vannak olyan esetek, amikor még a későbbi verziókban is érdemes használni a Import-Module parancsot. Ha egy modult a már telepített modul után szeretnénk importálni, akkor a Import-Module parancsot a következőképpen használhatjuk:

Modulok importálása az Import-Module

Míg a Get-Module megmutatja az összes importált modult, addig a még nem importált modulokat nem látjuk. Ekkor a ListAvailable paraméterrel megjelenítheti az összes többi elérhető modult.

Az összes elérhető modul megjelenítése a Get-Module -ListAvailable

Nem minden parancs jelenik meg alapértelmezés szerint

A ExportedCommands tulajdonság tartalmazza a modulból exportált összes elérhető parancs listáját. Előfordulhat, hogy eltérés van e lista és a modulfájlban található lista között. Az exportált parancsok a modul manifesztjébe épített funkció, amely lehetővé teszi az író számára, hogy egy funkciót rejtve hagyjon. A modulírók használhatják a Export-ModuleMember cmdletet is, de ez nem tartozik ennek a cikknek a tárgykörébe.

A modulíróknak lehet, hogy azért kell elrejteniük egy funkciót, mert az más funkciók támogatására szolgál, nem pedig a felhasználó számára. Ahhoz, hogy egy függvényt elrejtsenek, a szerzőnek ki kell zárnia azt a FunctionsToExport tömbből a manifesztben. Itt látható a ExportedCommands tulajdonság kibővített nézete.

Exportált parancsok megtekintése

Modulok importálása

A modulok használatának megkezdéséhez számos lehetőség van. Kézzel importálhatja a modult a modulfájlok elérési útvonalának segítségével. Ez lehetővé teszi, hogy sok munka nélkül tesztelhesse és frissíthesse a modult. Ez azonban nem sok hordozhatóságot tesz lehetővé, mivel a modul pontos elérési útvonalát kellene használnod. A PowerShell a $env:PSModulePath változóban nem szereplő modulokat sem importálja automatikusan.

Parancsok szelektív importálása

A Import-Module paraméter használatával a Function paraméter segítségével a teljes modul helyett csak bizonyos funkciókat importálhat. Ez időt takaríthat meg a távoli rendszerekből származó modulok, például az Office 365 modulok importálásakor.

Minden felhasználói modul

Az összes felhasználó számára telepített modulok a C:\Program Files\WindowsPowerShell\Modules könyvtárba kerülnek. Ez a könyvtár számos előre hozzáadott modult tartalmaz, beleértve a Install-Module használatával telepített modulokat is, az alapértelmezett AllUsers hatókörrel.

Jelenlegi felhasználói modulok

Ha egy modult telepít, de csak egyetlen felhasználó szeretné használni, akkor van egy CurrentUser hatókör. Ez a modulfájlokat a Dokumentumok mappába helyezi a C:\Users\<felhasználónév>\Dokumentumok\WindowsPowerShell\Modules címre. Ez hasznos lehet olyan környezetben, ahol mappaátirányítást használ a Documents mappával.

Ebben az esetben telepíthet egy modult az egyik számítógépre, és használhatja a másikon, mivel mindkettő ugyanazt a documents mappát használja.

Rendszer modulok

A teljesség kedvéért a C:\Windows\System32\WindowsPowerShell\1.0\Modules könyvtárban is van egy modulkönyvtár. Bár technikailag egy ebbe az elérési útvonalba helyezett modul ugyanúgy importálható, mint a többi elérési útvonal valamelyike, de ez nem ajánlott, mivel ez a Microsoft rendszermoduljai számára van fenntartva.

Az elnevezés fontos

A modulját manuálisan is elhelyezheti ezen elérési utak egyikébe, hogy alapértelmezés szerint elérhető legyen egy új munkamenettel, de ügyelnie kell arra, hogy a modulokra előírt elnevezést kövesse. A mappának, amelybe a modulfájlok kerülnek, ugyanolyan nevűnek kell lennie, mint a psm1 modulfájlnak és a psd1 modul manifesztjének, ha van ilyen.

A korábban említett Get-Module -ListAvailable használata utal ezekre az elérési utakra. Az összes modul elérési útvonalát a $env:PSModulePath -Split ';' használatával láthatja. Lehet, hogy más elérési utakat is észrevesz a listában, mint ami itt látható. Sok program telepítéskor saját modulútvonalakat ad hozzá. Az egyik példa erre az SQL, amelynek saját moduljai a saját modulútvonalaiban szerepelnek.

Modulútvonalak megtekintése a $env:PSModulePath

Modulútvonalak megtekintése a $env:PSModulePath

Ezek között vannak olyan modulok is, amelyeket egy másik folyamattal telepítene. Az egyik legjelentősebb példa erre az ActiveDirectory modul. A Windows 7-től egészen a Windows 10 1803-ig a Remote Server Administration Tools (RSAT) telepítőprogrammal telepítené.

A Windows 10 újabb verzióinál (1809+) ez csak a Features On Demand segítségével érhető el. Az RSAT telepítése telepíti az ActiveDirectory modulokat és sok mást, amelyeket más Windows-szerepkörök kezeléséhez használna. A Windows kiszolgáló operációs rendszereken ezek a modulok a Kiszolgálókezelőn keresztül települnek.

Távoli modulok importálása (Implicit Remoting)

Vannak olyan esetek, amikor nem célszerű, hogy egy modul helyben fusson. Ehelyett jobb, ha egy távoli eszközhöz csatlakozunk, és az arra telepített modult importáljuk. Ilyenkor a parancsok ténylegesen a távoli gépen kerülnek végrehajtásra. Ezt gyakran használják a Microsoft Office 365 moduljainál. Sokan csatlakoznak egy Office 365 kiszolgálóhoz, amely aztán importál egy modult. Amikor bármelyik parancsot futtatja, azok lefutnak a távoli kiszolgálón, majd a kimenet visszakerül a munkamenetébe.

A távoli modulok importálásának másik felhasználási módja az, amikor a modul nincs helyileg telepítve. Ezt kapná, ha nem lenne telepítve az ActiveDirectory modul, de megpróbálná importálni.

Modul nincs telepítve

Távoli modul importálásához először létre kell hoznia egy PSSessiont. A munkamenet létrehozásához használhatja a New-PSSession parancsot. Ezután a távoli eszközön elérhető modult a PSSession paraméterrel a Import-Module segítségével importálja a

PS51> $AdminServer = New-PSSession -ComputerName $AdminServerName -Credential (Get-Credential)PS51> Import-Module -Name ActiveDirectory -PSSession $AdminServer -Prefix 'Rmt'

A távoli modulok importálásának ezen módszerét használva gyorsabb kódfuttatást tesz lehetővé elosztott környezetben. Ha például a saját számítógépéről dolgozik, de a kiszolgálók, amelyeken dolgozik, az Egyesült Államokban vannak, bizonyos parancsok helyi futtatása a kiszolgálókkal szemben jelentősen tovább tarthat. Míg a parancsok futtatása egy kiszolgálón és a kimenet visszatáplálása a helyi munkamenetbe sokkal gyorsabb.

Modul előtag hozzáadása

A távoli gépről importált függvényekhez előtagot is hozzáadhat. Ez a lehetőség a helyi modulok importálása során áll rendelkezésre, de egy modul különböző verzióinak egymás melletti tesztelésén kívül ritkán használjuk.

Ha a fenti import parancsot futtatjuk, és a parancsok megtekintésekor ezt látjuk:

Egy modul összes elérhető parancsának megtekintése

Ez esetben egy előtaggal jelezhetjük, hogy nem helyi modulról van szó. Ez olyan esetekben használható, amikor olyan modult importál, amely lokálisan is elérhető. Az előtag hozzáadása csökkenti a kód végrehajtási helyével kapcsolatos félreértéseket.

Modulok eltávolítása

Eltávolíthat egy modult az aktuális munkamenetből a Remove-Module használata nélkül is. Ez eltávolít egy modult a helyi munkamenetből a modulfájlok eltávolítása nélkül. Ezt abban az esetben érdemes használni, ha egy modult távoli munkamenetben használtunk. A Remove-Module segítségével megtisztíthatja a munkamenetet, majd megszakíthatja a távoli munkamenetet.

Modul eltávolítása a munkamenetből

A Remove-Module másik felhasználási módja, ha egy modulon változtat, és nem akar új PowerShell-munkamenetet indítani. Ebben az esetben a Remove-Module és az utána következő Import-Module segítségével tölthetjük vissza a munkamenetbe. Alternatív megoldásként használhatja a Force paramétert a Import-Module paraméterrel együtt. Ez elvégzi a modul ki- és visszatöltését az Ön számára.

Mi alkotja a PowerShell modult

A modul egy vagy több fájlból állhat. Ahhoz, hogy egy modul minimális követelményeinek megfeleljen, rendelkeznie kell egy modulfájllal. Ez lehet egy PSM1 fájl vagy bármilyen más modulfájl, például egy bináris modulfájl. Hogy erre építhessünk, a psm1 modulodnak tartalmaznia kell benne definiált függvényeket, különben senkinek sem lesz sok haszna belőle.

Noha nincsenek követelmények arra vonatkozóan, hogy a függvényeknek hogyan kell kinézniük vagy mit kell tenniük, van néhány irányelv. Általában előnyösebb, ha egy modulban az összes függvény ugyanarra a koncepcióra épül.

A modulok hasonló jellegű függvényeket tartalmaznak

Az ActiveDirectory modul például csak olyan függvényeket tartalmaz, amelyek valamilyen módon kölcsönhatásba lépnek az Active Directoryval. Általában a függvénynevek is tartalmaznak egy előtagot. Visszatérve az ActiveDirectory modulra mint példára, a függvénynevekben az összes főnév AD-vel kezdődik.

Ezen irányelvek használata segíti a függvények felfedezhetőségét. Képzelje el, hogy éppen most importálta ezt az új modult, és a függvények között szeretne lapozni. Ezt sokkal könnyebb megtenni, ha az összes függvénynek hasonló a névszerkezete. Bár gyakran láthatja, hogy a modulok PS-sel kezdődnek, ez az előtag hivatalosan csak a Microsoft modulok számára van fenntartva. Valószínűleg nem okoz problémát, ha a PS-t használja a modul elején, konfliktust okozhat egy másik modul nevével.

Ezeket az irányelveket használva, ha egy csomó olyan függvénye lenne, amelyeknek mind a registryvel való interakcióhoz van közük, akkor valami ilyesmi lehetne:

function Get-ATARegistryKey {...}function Set-ATARegistryKey {...}

Modulmanifesztek

A szöveges modulfájlra építve modulmanifesztet is csatolhat. Ezek a fájlok PSD1 kiterjesztésűek, és a modulra vonatkozó metaadatokat tartalmaznak. Ide kerülhetnek a szerzőre, a modul leírására, más szükséges modulokra és sok más attribútumra vonatkozó információk. A tárolóba való közzétételhez szükséges, hogy a Author és Description mezők kitöltve legyenek.

Itt egy példa egy manifesztre, amelyet a regisztrációs modulunkhoz készíthetünk:

#Module manifest for module 'ATARegistry'#Generated by: Tyler#Generated on: 8/11/2019@{#Script module or binary module file associated with this manifest.RootModule = 'ATARegistry'#Version number of this module.ModuleVersion = '1.0'#Supported PSEditions#CompatiblePSEditions = @()#ID used to uniquely identify this moduleGUID = 'fef619fa-016d-4b11-a09d-b222e094de3e'#Author of this moduleAuthor = 'Tyler Muir'#Company or vendor of this moduleCompanyName = 'Adam the Automator'#Copyright statement for this moduleCopyright = '(c) 2019 tyler. All rights reserved.'#Description of the functionality provided by this moduleDescription = 'This is a test module.'#Minimum version of the Windows PowerShell engine required by this module#PowerShellVersion = ''#Name of the Windows PowerShell host required by this module#PowerShellHostName = ''#Minimum version of the Windows PowerShell host required by this module#PowerShellHostVersion = ''#Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only.#DotNetFrameworkVersion = ''#Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only.#CLRVersion = ''#Processor architecture (None, X86, Amd64) required by this module#ProcessorArchitecture = ''#Modules that must be imported into the global environment prior to importing this module#RequiredModules = @()#Assemblies that must be loaded prior to importing this module#RequiredAssemblies = @()#Script files (.ps1) that are run in the caller's environment prior to importing this module.#ScriptsToProcess = @()#Type files (.ps1xml) to be loaded when importing this module#TypesToProcess = @()#Format files (.ps1xml) to be loaded when importing this module#FormatsToProcess = @()#Modules to import as nested modules of the module specified in RootModule/ModuleToProcess#NestedModules = @()#Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.FunctionsToExport = @('Get-RegistryKey','Set-RegistryKey')#Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.CmdletsToExport = @()#Variables to export from this moduleVariablesToExport = '*'#Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.AliasesToExport = @()#DSC resources to export from this module#DscResourcesToExport = @()#List of all modules packaged with this module#ModuleList = @()#List of all files packaged with this module#FileList = @()#Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.PrivateData = @{PSData = @{#Tags applied to this module. These help with module discovery in online galleries.#Tags = @()#A URL to the license for this module.#LicenseUri = ''#A URL to the main website for this project.#ProjectUri = ''#A URL to an icon representing this module.#IconUri = ''#ReleaseNotes of this module#ReleaseNotes = ''} #End of PSData hashtable} #End of PrivateData hashtable#HelpInfo URI of this module#HelpInfoURI = ''#Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.#DefaultCommandPrefix = ''}

Bár ez elsőre ijesztőnek tűnhet, a Microsoftnak van egy praktikus cmdletje, amellyel létrehozhat egy modulmanifesztet. A mellékelt parancs a New-ModuleManifest. A fent látható manifeszt létrehozásához a következő parancsot használhatja:

PS51> New-ModuleManifest -Path .\Scripts\TestModule.psd1 -Author 'Tyler Muir' -CompanyName 'Adam the Automator' -RootModule 'TestModule.psm1' -FunctionsToExport @('Get-RegistryKey','Set-RegistryKey') -Description 'This is a test module.'

Külső súgófájlok

Egyes modulokban külső súgófájlokat is láthat. Ezeket a fájlnév végén található <Modulnév>-Help.xml azonosíthatja. Ezek a külső súgófájlok ugyanazokat az információkat tartalmazzák, amelyeket általában a függvénydefinícióban található parancsalapú súgó tartalmaz.

Ezeknél is szükséges a # .ExternalHelp <ModulePath>-Help.xml hozzáadása a függvényhez, hogy a modul importálása után a Get-Help parancs használatakor megfelelően működjön. Külső súgófájlokkal általában csak nagyon nagy moduloknál találkozunk, és emiatt nem tartoznak a hatókörbe.

Míg ezek a leggyakoribb fájltípusok, amelyekkel egy modulban találkozhatunk, nem ezek az egyedüli fájlok. Néha egy szöveges modul mellett bináris fájlokat is látni fog, mivel más függőségek is vannak. A modul elérési útvonalakat vizsgálva számos példát találhat a modulokban található további fájltípusokra.

A nem szabványos modulfájlok megfelelő közzétételéhez a modul manifesztjének FileList paraméterében más fájlokat kell felvennie.

A modul manifesztjében számos más paramétert is észrevehet, amelyek jelenleg üresek. Ezeket felhasználhatja a modul használatához szükséges egyéb követelmények meghatározására. Például meghatározhatja a PowerShell azon verzióit, amelyekkel a modul működhet. Ha a modult a PowerShell egy nem támogatott verzióján próbálja importálni, a következőt látja:

A PowerShell bizonyos verzióinak megkövetelése

PSRepozitóriumok

A modulok egyik legfontosabb terjesztési lehetősége a PSRepozitórium. Egy 1000′-es nézetben a PSRepository egy olyan hely, ahol több ember vagy több eszköz férhet hozzá a modulfájlokhoz. Ezek gyakran webkiszolgálók, ahol közzéteheti a fájlokat.

Egy könyvtárat is használhat az adattárhoz, de ez korlátozza az adattár funkcionalitását. A PSRepository-t maga is üzemeltetheti, vagy felhasználhatja az interneten elérhető számos lehetőség egyikét, például a PowerShell Galériát. A PSRepozitóriumait a Get-PSRepository parancs segítségével láthatja.

A PowerShell NuGet tárolók alapértelmezett beállításai

Egyetlen bejegyzés van alapértelmezés szerint, és ez a PowerShell Galéria. Észreveheti, hogy azt fogja mondani, hogy nem megbízható. Ez azért van, mert a PowerShell felhívja a figyelmét arra, hogy a PowerShell Galéria használatával olyan kódot használhat, amelyet nem a Microsoft írt és hagyott jóvá. Ez azt jelenti, hogy mielőtt bármilyen modult telepítene belőle, kifejezett engedélyt kell adnia.

PSRepositories hozzáadása

A saját tárolókat is hozzáadhat. Ha megbízik a PowerShell Galériában, akkor futtathatja a Get-PSRepository -Name PSGallery | Set-PSRepository -InstallationPolicy Trusted vagy elfogadhatja a figyelmeztetést, amikor először telepít modult a PowerShell Galériából.

Az összes parancs, amelyet ezekkel a PSRepositorykkal való interakcióhoz használna, megtalálható a PowerShellGet modulban. A funkciókat itt tekintheti meg:

Parancsok a PowerShellGet modulban

A PowerShellGet modul frissítése szükséges lehet bizonyos tárolókkal való interakció előtt.

Modulok keresése

A PSRepository használatának másik fontos jellemzője a modulok keresése. Ezt a Find-Module paranccsal érhetjük el. Többféleképpen lehet szűrni, hogy pontosan azt találjuk meg, amit keresünk, de egyelőre a következőképpen kereshetünk a VMware modulokra:

Modulok keresése a PowerShell Galériában

Ez az összes olyan modult megmutatja, amely VMware-rel kezdődik. Bár ezek többsége a VMware-től származik, meg kell nézni a szerzői attribútumot, hogy megtudjuk, ki tette közzé a modult.

Mivel bárki feltöltheti a PowerShell Galériába, több ezer modul áll rendelkezésre. Ez azt jelenti, hogy találhat olyan modulokat, amelyek nem működnek megfelelően az Ön felhasználási esetéhez. Sok modul, amit talál, nyílt forráskódú, így hozzájárulhat hozzájuk, hogy javítsa a modul funkcionalitását.

Modulok telepítése

A Install-Module parancs használatához egy megbízható PSRepositoryra van szükség, amely a modult tárolja. Ez lehet a PowerShell Galéria, egy másik internetes PSRepository vagy egy saját tárhelyű webhely. A Find-Module parancsból pipázhat, hogy a modul telepítése előtt könnyen megerősíthesse a modult.

PSRepositoryból telepített modulok keresése

A modul verzióját a MinimumVersion, MaximumVersion vagy RequiredVersion paraméterekkel is meghatározhatja.

A Install-Module paranccsal telepített összes modul megtekintéséhez használhatja a Get-InstalledModule parancsot. Ez felsorolja a AllUsers hatókörbe vagy a CurrentUser hatókörbe telepített összes modult.

Modulok eltávolítása

Ahogyan, ahogyan telepíthet egy modult, úgy távolíthat el egy modult is. Ha a modult nem a Install-Module paranccsal telepítettük, akkor a Uninstall-Module paranccsal nem tudjuk eltávolítani.

PSRepositoryból telepített modulok eltávolítása a Uninstall-Module

Mint látható, itt az ActiveDirectory modult próbáljuk eltávolítani. Mivel ez a modul nincs telepítve a Install-Module segítségével, hibaüzenetet kapnánk, ha megpróbálnánk használni a Uninstall-Module-at. Ahhoz, hogy ezt a modult eltávolíthassuk, fordított módon kellene eltávolítanunk, amit a modul telepítéséhez használtunk.

A modul sikeres eltávolítását láthatjuk a korábban telepített VMware.PowerCLI modul eltávolításával.

A PowerShell Galériából letöltött modul eltávolítása

A VMware.PowerCLI eltávolítása ellenére is látható, hogy még mindig számos függőség van telepítve. Ha az összes modult szeretnénk eltávolítani, akkor használhatjuk a Get-InstalledModule VMware.* | Uninstall-Module -Force.

A modul teljes eltávolítása azért okozna ilyen nehézséget, mert nagyon sok függőséget tartalmaz. Ráadásul ezek közül néhány modul egymás függősége, ezért lenne szükség a Force paraméterre.

Modulok frissítése

Most, hogy már tudja, hogyan kell telepíteni és eltávolítani egy modult, talán kíváncsi, hogyan lehet frissíteni egy már telepített modult.

A többi folyamathoz hasonlóan, ha a modult nem a Install-Module segítségével telepítette, nem tudja frissíteni a PowerShell parancsok segítségével. A Update-Module segítségével frissítheti a modult a legújabb kiadásra vagy egy újabb specifikus verzióra.

A AllowPreRelease kapcsoló is létezik, amely lehetővé tenné a frissítést egy hivatalosan még ki nem adott verzióra. Néha ez segíthet, mivel lehet, hogy javítás történt egy általad tapasztalt hibára, vagy egy új funkciót adtak hozzá, amit használni szeretnél.

Modulok frissítése a Update-Module

Modul ellenőrzése/mentése

Az egyik sokkal ritkábban használt parancs, ami nagyon hasznos a modulok használat előtti ellenőrzésénél, a Save-Module. Ezzel a paranccsal letölthetünk egy modult egy elérési útvonalra anélkül, hogy telepítenénk.

Ezután megvizsgálhatjuk a fájlokat, és ha a modul nem bináris modul, akkor megnyithatjuk és megnézhetjük a modult alkotó kódot. Ez nem csak arra lehet jó, hogy megbizonyosodjon arról, hogy egy modul nem csinál semmi rosszindulatú dolgot, hanem arra is, hogy megtudja, mások hogyan strukturálják a moduljaikat.

Modulok letöltése Save-Module

Ebben a példában nem csak a VMware.PowerCLI modul kerül letöltésre, hanem az összes függőség is. Íme, mi látható a VMware.PowerCLI mappában:

VMware.PowerCLI modul tartalma

Ez egy jó példa arra, hogy néha nem szabványos modulfájlok is szerepelnek a modulban, például a végfelhasználói licencszerződés.

Saját modul írása

Most láthatta, hogyan léphet kapcsolatba valaki más moduljával. Most azt szeretné megtanulni, hogyan hozza létre a sajátját, hogy elkezdhesse optimalizálni a kódját a skálázhatóság érdekében.

Sablonfájlok létrehozása

Először is létre kell hoznia egy mappát az összes modulfájljának. Miután megvan a tároló, létre kell hoznia a modulfájlját. Meg kell győződnie arról, hogy a modulfájlnak ugyanaz a neve, mint a mappának, különben a modul közzétételénél a PowerShell nem fogja helyesen felfedezni a modult.

PS51> New-Item -Path .\Scripts -Name ATARegistry -ItemType DirectoryPS51> New-Item -Path .\Scripts\ATARegistry -Name ATARegistry.psm1

Most ha manifesztet is szeretne használni, akkor azt is ugyanúgy kell elneveznie, mint a konténert és a modulfájlt.

PS51> New-ModuleManifest -Path .\Scripts\ATARegistry\ATARegistry.psd1 -Author 'Tyler Muir' -CompanyName 'Adam the Automator' -RootModule ATARegistry.psm1 -Description 'Used for interacting with registry keys'

A konténer, a modulfájl és a manifeszt fájl segítségével egy teljesen működő modulja van. Ezt a modult közzéteheted egy PSRepositoryban, és elkezdheted telepíteni, ahová csak akarod. Bár mivel a modulfájl üres, valószínűleg nem sok jót fog tenni. Ezeket a fájlokat még mindig használhatja a közzététel tesztelésére, hogy megbizonyosodjon arról, hogy az adattár működik.

PSRepository regisztrálása

A modul közzététele előtt hozzá kell adnia egy másik PSRepository-t a munkamenetéhez. A teszteléshez használhatsz egy helyi elérési utat PSRepository-ként, mivel azt könnyű lesz felállítani és leszerelni.

Normális esetben, ha egy PSRepository-t egy könyvtárral állítanál be, biztosítani szeretnéd, hogy több számítógép is hozzáférhessen. A helyi adattárat így hozhatja létre:

PS51> New-Item -Path C:\ -Name Repo -ItemType DirectoryPS51> Register-PSRepository -Name 'LocalRepo' -SourceLocation 'C:\Repo' -PublishLocation 'C:\Repo' -InstallationPolicy Trusted

Ha csak a PSRepositoryból töltene le, és soha nem publikálna, akkor a PublishLocation paramétert kizárhatná.

A modul publikálása

Mivel a telepítési házirendet már megbízhatóra állította, nem kap visszaigazolást a modul telepítésének engedélyezésére az adattárból. Most, hogy egy új PSRepository áll rendelkezésre, a Publish-Module -Name .\Scripts\ATARegistry -Repository LocalRepo segítségével közzéteheti a modulját.

A modul közzététele után a fenti parancsokkal megkeresheti és telepítheti a modult.

Most, hogy telepítette a modult, a Get-Module segítségével láthatja a modul importálását a helyi munkamenetbe. Mivel a manifesztben a FunctionsToExport tömbhöz nem adtál hozzá függvényeket, a ExportedCommands tulajdonság üres.

Nincsenek exportált parancsok

Hozzáadás a modulodhoz

Most, hogy tudod, hogy közzéteheted és telepítheted a modulodat, elkezdheted hozzáadni néhány funkciót. Hozzáadhatsz egy függvényt, amely visszaad egy registry kulcsot, így néz ki:

function Get-ATARegistryKey { param ( $Path ) Get-Item $Path}

Ha a manifesztet úgy hagynád, ahogy van, és megpróbálnád feltölteni az új modulodat, két problémába ütköznél. Az első, hogy hibaüzenetet kapnál, miszerint a modulod verziója már létezik az adattáradban. Ez azért van, mert nem változtatta meg a modul verzióját a manifeszt fájlban.

Modulfüggvények exportálása

A másik probléma az lenne, hogy a modul importálása után még mindig nem látna függvényeket a ExportedCommands tulajdonságban, mert nem adta hozzá az új függvényét a manifeszthez.

Míg a függvénye használható lenne anélkül is, hogy a FunctionsToExport listában szerepelne, sokkal nehezebbé tenné a megtalálását.

Az említett két probléma megoldásához a következőképpen frissítheti a modulfájlját:

ModuleVersion = '1.1'FunctionsToExport = 'Get-RegistryKey'

Most, miután hozzáadott egy funkciót a moduljához, és frissítette a manifesztjét, hogy tükrözze ezeket a változásokat, a modul új verzióját ugyanazzal a paranccsal közzéteheti, mint korábban.

PS51> Publish-Module -Name .\Scripts\ATARegistry -Repository LocalRepo.

A modul frissítése

Az utolsó lépés az lenne, hogy frissítse a modulját a munkamenetben, hogy használni tudja a frissített fájlokat. A Update-Module ATARegistry segítségével letölti a frissítést, amelyet az imént publikált a tárolóba.

Az exportált parancsok most megjelennek

Most láthatja, hogy megvan a modul új verziója, és láthatja a manifesztben meghatározott funkciót.

Súgó tartalom építése

A korábban átadott lehetőségek egyike a PowerShellbe épített súgórendszer. Valószínűleg Ön is használt már valamikor Get-Help egy függvényen. Ezt az információt elsősorban kétféleképpen lehet hozzáadni.

Az első az, hogy a függvénydefinícióhoz megjegyzésalapú súgó adható. Ezt a módot általában sok modulíró valósítja meg. A másik mód egy külső súgófájl használata. A Full paraméterrel mindent megmutathat, amit a súgó kínál.

Súgó keresése a Get-Help

Amint látja, valóban nem sok információ áll rendelkezésre, és az a kevés információ, amit kap, valószínűleg senkinek sem lenne hasznos.

A modulfájljához hozzáadhat néhány megjegyzésalapú segítséget, hogy feltöltse ezeket a mezőket a súgórendszerben. A megjegyzés alapú súgó összes lehetőségéről a Get-Help about_Comment_Based_Help segítségével olvashat.

Előre frissítheti a függvényét, hogy az alábbiak szerint nézzen ki. Ez a leggyakrabban használt súgóparaméterek listája, de ezek mindegyike továbbra is opcionális, és vannak mások is, amelyeket hozzáadhatunk helyettük.

Most a függvényed így néz ki:

 function Get-RegistryKey {<# .SYNOPSIS Returns registry key using provided path. .DESCRIPTION The function uses the Get-Item command to return the information for a provided registry key. .PARAMETER Path The path that will be searched for a registry key. .EXAMPLE Get-RegistryKey -Path 'HKLM:\HARDWARE\DESCRIPTION\System' .INPUTS System.String .OUTPUTS Microsoft.Win32.RegistryKey .NOTES This module is an example of what a well documented function could look. .LINKhttps://adamtheautomator.com#>param($Path)Get-Item $Path}

Létezik néhány speciális súgóparaméter, például a .FORWARDHELPTARGETNAME. Ez az opció minden bejövő súgó kérést továbbít egy másik parancshoz. Ezt olyan esetben lehet használni, amikor a súgónak több parancshoz ugyanazt az információt kell megjelenítenie.

Most, hogy hozzáadtad a súgót, frissítheted a verziót a modul manifesztjében, közzéteheted az új verziót, és frissítheted a telepített verziót a munkamenethez, ahogy korábban tetted.

Ha most megnézed a funkció súgóját, láthatod, hogy sokkal több információ áll rendelkezésre. Ez egy nagyszerű módja annak, hogy a függvények használatára vonatkozó dokumentációt is tartalmazzon, különösen azok számára, akik kevésbé gyakorlottak, és a kódot megnézve esetleg nem tudják gyorsan megérteni, hogy mit csinál a modul.

A teljes súgó tartalmának Get-Help

A külső súgófájl esetében a hozzáadott információ ugyanaz, de az információ egy külön fájlban van elhelyezve, és a függvényen belül kapcsolódik.

Ha megnézzük a AllUsersmodul elérési útvonalát, akkor láthatjuk a modul verzióját és az összes telepített modulfájlt.

A mappa neve a modul verziója

Ha visszamegyünk a korábban létrehozott PSRepository C:\Repo elérési útvonalára, akkor egy csomó NUPKG fájlt láthatunk. Minden egyes közzétett verzióhoz lesz egy. Ezek tömörített változatai annak, amit a Publish-Module.

Összefoglaló

Ha már megismerte a PowerShell konzolt, a PowerShellt mint nyelvet és a szkriptek írását, a saját modulok készítése az utolsó lépés. A modulok lehetővé teszik, hogy elkezdje a hasznos eszközök fejlesztését a PowerShellben. Ha helyesen tervezed és építed meg a modulok létrehozásával egyetlen célra, akkor idővel elkerülhetetlenül egyre kevesebb kódot fogsz írni. Elkezd majd több kódban hivatkozni a modulfüggvényeire, és onnan építkezik.

A modulfüggvények lehetővé teszik, hogy absztrahálja a szkriptekben ismétlődő kódot. Olyan “címkéket” jelentenek, amelyekre később hivatkozhatsz a kódban, amelyeket bármikor meghívhatsz, ahelyett, hogy újra feltalálnád a kereket, és megpróbálnád kitalálni, hogyan érted el már korábban a célodat. A modulok a PowerShell kód végső “csomagolása”, amely csoportosítja a hasonló jellegű kódokat, hogy ne pazarolja az időt a már megoldott problémákra.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.