10. fejezet – Szkriptmodulok

Az egysoros és a PowerShell-beli szkriptek újrafelhasználható eszközökké alakítása még fontosabb lesz, ha ezt gyakran fogja használni. Ha egy szkriptmodulba csomagolja a függvényeket, professzionálisabbá és könnyebben megoszthatóvá teszi őket.

Dot-Sourcing Functions

Az előző fejezetben nem beszéltünk a pont-forrás függvényekről. Ha egy szkript egyik függvénye nem része egy modulnak, csak úgy töltheti be a memóriába, ha pontforrásként beszedi a .PS1 mentett fájlt.

A program a következő függvényt mentette.Get-MrPSVersion.ps1

function Get-MrPSVersion {
    $PSVersionTable
}

A szkript futtatásakor semmi sem történik.

.\Get-MrPSVersion.ps1

Ha megpróbálja meghívni a függvényt, hibaüzenet jelenik meg.

Get-MrPSVersion
Get-MrPSVersion : The term 'Get-MrPSVersion' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
At line:1 char:1
+ Get-MrPSVersion
    + CategoryInfo          : ObjectNotFound: (Get-MrPSVersion:String) [], CommandNotFou
   ndException
    + FullyQualifiedErrorId : CommandNotFoundException

Ha meg szeretné állapítani, hogy a függvények be vannak-e töltve a memóriába, ellenőrizze, hogy léteznek-e a függvény PSDrive-on.

Get-ChildItem -Path Function:\Get-MrPSVersion
Get-ChildItem : Cannot find path 'Get-MrPSVersion' because it does not exist.
At line:1 char:1
+ Get-ChildItem -Path Function:\Get-MrPSVersion
    + CategoryInfo          : ObjectNotFound: (Get-MrPSVersion:String) [Get-ChildItem],
   ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

A függvényt tartalmazó szkript meghívásával az a probléma, hogy a függvények betöltődnek a Szkript hatókörébe. Amikor a szkript befejeződött, a hatókör el lesz távolítva, és a függvény is törlődik vele.

A függvényt be kell tölteni a globális hatókörbe. Ez a függvényt tartalmazó szkript pontozásával valósítható meg. A relatív elérési út használható.

. .\Get-MrPSVersion.ps1

A teljes elérési út is használható.

. C:\Demo\Get-MrPSVersion.ps1

Ha az elérési út egy része változóban van tárolva, akkor kombinálható az elérési út többi részével. Nincs ok sztringösszefűzéssel kombinálni a változót az elérési út többi részével.

$Path = 'C:\'
. $Path\Get-MrPSVersion.ps1

Most, amikor megnézem a PSDrive függvényt , a Get-MrPSVersion függvény létezik.

Get-ChildItem -Path Function:\Get-MrPSVersion
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Get-MrPSVersion

Szkriptmodulok

A PowerShell szkriptmodulja egyszerűen egy fájl, amely egy vagy több függvényt tartalmaz, amely fájlként van mentve .PSM1 fájl helyett .PS1 .

Hogyan hozhat létre szkriptmodult? Valószínűleg egy hasonló New-Modulenevű paranccsal találgat. Az ön feltételezése helytelen lenne. Bár a PowerShellben van egy parancs neve New-Module, ez a parancs dinamikus modult hoz létre, nem szkriptmodult. Mindig olvassa el a parancsok súgóját, még akkor is, ha úgy gondolja, hogy megtalálta a szükséges parancsot.

help New-Module
NAME
    New-Module

SYNOPSIS
    Creates a new dynamic module that exists only in memory.

SYNTAX
    New-Module [-Name] <String> [-ScriptBlock] <ScriptBlock> [-ArgumentList <Object[]>]
    [-AsCustomObject] [-Cmdlet <String[]>] [-Function <String[]>] [-ReturnResult]
    [<CommonParameters>]

DESCRIPTION
    The New-Module cmdlet creates a dynamic module from a script block. The members of
    the dynamic module, such as functions and variables, are immediately available in
    the session and remain available until you close the session.

    Like static modules, by default, the cmdlets and functions in a dynamic module are
    exported and the variables and aliases are not. However, you can use the
    Export-ModuleMember cmdlet and the parameters of New-Module to override the defaults.

    You can also use the AsCustomObject parameter of New-Module to return the dynamic
    module as a custom object. The members of the modules, such as functions, are
    implemented as script methods of the custom object instead of being imported into
    the session.

    Dynamic modules exist only in memory, not on disk. Like all modules, the members of
    dynamic modules run in a private module scope that is a child of the global scope.
    Get-Module cannot get a dynamic module, but Get-Command can get the exported members.

    To make a dynamic module available to Get-Module , pipe a New-Module command to
    Import-Module, or pipe the module object that New-Module returns to Import-Module .
    This action adds the dynamic module to the Get-Module list, but it does not save the
    module to disk or make it persistent.

RELATED LINKS
    Online Version: http://go.microsoft.com/fwlink/?LinkId=821495
    Export-ModuleMember
    Get-Module
    Import-Module
    Remove-Module

REMARKS
    To see the examples, type: "get-help New-Module -examples".
    For more information, type: "get-help New-Module -detailed".
    For technical information, type: "get-help New-Module -full".
    For online help, type: "get-help New-Module -online"

Az előző fejezetben már említettem, hogy a függvényeknek jóváhagyott parancsokat kell használniuk, különben figyelmeztető üzenetet fognak generálni a modul importálásakor. Az alábbi kód a New-Module parancsmag használatával hoz létre egy dinamikus modult a memóriában. Ez a modul a nem jóváhagyott igére vonatkozó figyelmeztetést mutatja be.

New-Module -Name MyModule -ScriptBlock {

    function Return-MrOsVersion {
        Get-CimInstance -ClassName Win32_OperatingSystem |
        Select-Object -Property @{label='OperatingSystem';expression={$_.Caption}}
    }

    Export-ModuleMember -Function Return-MrOsVersion

} | Import-Module
WARNING: The names of some imported commands from the module 'MyModule' include
unapproved verbs that might make them less discoverable. To find the commands with
unapproved verbs, run the Import-Module command again with the Verbose parameter. For a
list of approved verbs, type Get-Verb.

Csak hogy megismételjük, bár az előző példában a New-Module parancsmagot használták, nem ez a parancs szkriptmodulok PowerShellben való létrehozásához.

Mentse az alábbi két függvényt egy nevű MyScriptModule.psm1fájlba.

function Get-MrPSVersion {
    $PSVersionTable
}

function Get-MrComputerName {
    $env:COMPUTERNAME
}

Próbálja meg meghívni az egyik függvényt.

Get-MrComputerName
Get-MrComputerName : The term 'Get-MrComputerName' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of the name, or
if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Get-MrComputerName
    + CategoryInfo          : ObjectNotFound: (Get-MrComputerName:String) [], CommandNot
   FoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Hibaüzenet jelenik meg, amely szerint a függvény nem található. A psdrive függvényt ugyanúgy ellenőrizheti, mint korábban, és azt is tapasztalhatja, hogy ott sem létezik.

A parancsmaggal manuálisan is importálhatja a Import-Module fájlt.

Import-Module C:\MyScriptModule.psm1

A modul automatikus betöltési funkcióját a PowerShell 3-as verziójában vezettük be. A modul automatikus betöltésének előnyeinek kihasználásához a szkriptmodult egy olyan mappába kell menteni, amelynek az alapneve megegyezik a fájllal és a .PSM1 megadott $env:PSModulePathhelyen.

$env:PSModulePath
C:\Users\mike-ladm\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\
Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules;C:\Program Files (x86)\Microsof
t SQL Server\130\Tools\PowerShell\Modules\

Az eredmények nehezen olvashatók. Mivel az elérési utakat pontosvessző választja el egymástól, az eredményeket feloszthatja úgy, hogy mindegyik elérési utat külön sorban adja vissza. Így könnyebben olvashatók.

$env:PSModulePath -split ';'
C:\Users\mike-ladm\Documents\WindowsPowerShell\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\Windows\system32\WindowsPowerShell\v1.0\Modules
C:\Program Files (x86)\Microsoft SQL Server\130\Tools\PowerShell\Modules\

A lista első három elérési útja az alapértelmezett. A SQL Server Management Studio telepítésekor az utolsó elérési út lett hozzáadva. Ahhoz, hogy a modul automatikus betöltése működjön, a MyScriptModule.psm1 fájlt egy közvetlenül ezen elérési utak egyikében elnevezett MyScriptModule mappában kell elhelyezni.

Nem olyan gyors. Számomra az aktuális felhasználói útvonal nem az első a listában. Szinte soha nem használom ezt az útvonalat, mivel a Windowsba a PowerShell futtatásához használt felhasználótól eltérő felhasználóval jelentkezem be. Ez azt jelenti, hogy nem a normál Dokumentumok mappában található.

A második elérési út az AllUsers elérési útja. Itt tárolom az összes modulomat.

A harmadik elérési út alatt C:\Windows\System32található. Csak a Microsoft tárolhat modulokat ezen a helyen, mivel az az operációs rendszerek mappájában található.

Ha a .PSM1 fájl a megfelelő elérési úton található, a modul automatikusan betöltődik, amikor meghívja valamelyik parancsát.

Moduljegyzékek

Minden modulnak rendelkeznie kell egy moduljegyzékvel. A moduljegyzék a modul metaadatait tartalmazza. A modul jegyzékfájljának fájlkiterjesztése a következő .PSD1: . Nem minden kiterjesztésű .PSD1 fájl moduljegyzék. Olyan célokra is használhatók, mint a DSC-konfiguráció környezeti részének tárolása. New-ModuleManifest A moduljegyzék létrehozásához használható. Az elérési út az egyetlen kötelező érték. A modul azonban nem fog működni, ha nincs megadva RootModule . Érdemes megadni a szerzőt és a leírást , ha úgy dönt, hogy feltölti a modult egy NuGet-adattárba a PowerShellGet használatával, mivel ezekre az értékekre szükség van ebben a forgatókönyvben.

A jegyzékfájl nélküli modul verziója 0.0. Ez egy halott ajándék, hogy a modul nem rendelkezik jegyzékfájllal.

Get-Module -Name MyScriptModule
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     0.0        myscriptmodule                      {Get-MrComputerName, Get-MrP...

A moduljegyzék az összes ajánlott információval létrehozható.

New-ModuleManifest -Path $env:ProgramFiles\WindowsPowerShell\Modules\MyScriptModule\MyScriptModule.psd1 -RootModule MyScriptModule -Author 'Mike F Robbins' -Description 'MyScriptModule' -CompanyName 'mikefrobbins.com'

Ha a moduljegyzék kezdeti létrehozása során ezek az információk kimaradnak, akkor később hozzáadhatók vagy frissíthetők a használatával Update-ModuleManifest. Ne hozza létre újra a jegyzékfájlt New-ModuleManifest , ha már létrejött, mert a GUID megváltozik.

Nyilvános és privát függvények definiálása

Lehetnek olyan segédfüggvényei, amelyeket érdemes lehet privátként használni, és csak a modul más függvényei érhetik el. A modul felhasználói nem érhetik el őket. Ezt többféleképpen is el lehet érni.

Ha nem követi az ajánlott eljárásokat, és csak egy .PSM1 fájllal rendelkezik, akkor az egyetlen lehetőség a Export-ModuleMember parancsmag használata.

function Get-MrPSVersion {
    $PSVersionTable
}

function Get-MrComputerName {
    $env:COMPUTERNAME
}

Export-ModuleMember -Function Get-MrPSVersion

Az előző példában csak a Get-MrPSVersion függvény érhető el a modul felhasználói számára, de a Get-MrComputerName függvény a modul más függvényei számára is elérhető.

Get-Command -Module MyScriptModule

CommandType     Name                        Version    Source
-----------     ----                        -------    ------
Function        Get-MrPSVersion             1.0        MyScript...

Ha már felvett egy moduljegyzéket a modulba (és érdemes), akkor azt javaslom, hogy adja meg az exportálni kívánt egyes függvényeket a moduljegyzék FunctionsToExport szakaszában.

FunctionsToExport = 'Get-MrPSVersion'

A moduljegyzék fájljában és FunctionsToExport szakaszában .PSM1 nem szükséges használniExport-ModuleMember. Az egyik vagy a másik elegendő.

Összefoglalás

Ebben a fejezetben megtanulta, hogyan alakíthatja át függvényeit szkriptmodulokká a PowerShellben. Megismert néhány ajánlott eljárást is a szkriptmodulok létrehozásához, például egy moduljegyzék létrehozását a szkriptmodulhoz.

Áttekintés

  1. Hogyan hozhat létre szkriptmodult a PowerShellben?
  2. Miért fontos, hogy a függvények jóváhagyott igét használjanak?
  3. Hogyan hozhat létre moduljegyzéket a PowerShellben?
  4. Milyen két lehetőség van arra, hogy csak bizonyos függvényeket exportáljon a modulból?
  5. Mire van szükség ahhoz, hogy a modulok automatikusan betöltsenek egy parancs meghívásakor?