10. fejezet – Szkriptmodulok

Az egysoros és a PowerShell-szkriptek újrafelhasználható eszközökké alakítása még fontosabbá válik, ha ezt gyakran fogja használni. A függvények szkriptmodulba való csomagolása professzionálisabbá teszi őket, és megkönnyíti a megosztásukat.

Dot-Sourcing Functions

Valami, amiről az előző fejezetben nem beszéltünk, a dot-sourcing függvény. Ha egy szkript egy függvénye nem része egy modulnak, az egyetlen módja annak, hogy betöltse a memóriába, ha pontozza 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üzenetet hoz létre.

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

Annak megállapításához, hogy a függvények betöltve vannak-e 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öltve vannak 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 vele együtt törlődik.

A függvényt be kell tölteni a globális hatókörbe. Ez a függvényt tartalmazó szkript pontszerű beszerzésével 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, az az elérési út többi részével kombinálható. 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 parancsfájlmodulja egyszerűen egy fájl helyett fájlként .PSM1 mentett egy vagy több függvényt .PS1 tartalmazó fájl.

Hogyan hozhat létre szkriptmodult? Valószínűleg egy ilyen New-Modulenevű paranccsal találgat. A feltételezése helytelen lenne. Bár a PowerShellben van egy parancs neve New-Module, ez a parancs dinamikus modult hoz létre, nem pedig 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 említettem, hogy a függvényeknek jóváhagyott igéket kell használniuk, különben figyelmeztető üzenetet fognak generálni a modul importálásakor. Az alábbi kód a New-Module parancsmaggal hoz létre egy dinamikus modult a memóriában. Ez a modul a nem jóváhagyott igejelzé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 a szkriptmodulok PowerShellben való létrehozásához.

Mentse a következő két függvényt egy nevű MyScriptModule.psm1fájlban.

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 függvény PSDrive-ját is ugyanúgy ellenőrizheti, mint korábban, és azt is láthatja, hogy nem létezik ott sem.

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ájl nevével é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, 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. Az SQL Server Management Studio telepítésekor hozzáadta az utolsó elérési utat. Ahhoz, hogy a modul automatikus betöltése működjön, a MyScriptModule.psm1 fájlnak egy közvetlenül ezen elérési utak egyikén belül elnevezett MyScriptModule mappában kell lennie.

Nem olyan gyors. Számomra nem az aktuális felhasználói útvonal az első a listában. Szinte soha nem használom ezt az útvonalat, mivel a PowerShell futtatásához használt felhasználótól eltérő felhasználóval jelentkezem be a Windowsba. 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árolja a modulokat ezen a helyen, mivel az az operációs rendszerek mappájában található.

Miután a .PSM1 fájl a megfelelő elérési úton található, a modul automatikusan betöltődik, amikor az egyik parancsot meghívja.

Moduljegyzékek

Minden modulnak rendelkeznie kell egy moduljegyzékvel. A moduljegyzék metaadatokat tartalmaz a modulról. A moduljegyzékfájl fájlkiterjesztése a következő .PSD1: . Nem minden kiterjesztésű .PSD1 fájl moduljegyzék. Olyan dolgokhoz is használhatók, mint a DSC-konfiguráció környezeti részének tárolása. New-ModuleManifest moduljegyzék létrehozásához használható. Az elérési út az egyetlen kötelező érték. A modul azonban nem működik, ha a RootModule nincs megadva. É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 ebben a forgatókönyvben van szükség.

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

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 egyik információ sem jelenik meg, azokat később is hozzáadhatja vagy frissítheti 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 privátnak szeretne lennie, és csak a modulon belüli más függvények érhetik el. Nem célja, hogy elérhetőek legyenek a modul felhasználói számára. Ezt többféleképpen is meg lehet valósítani.

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 modulon belül más függvények számára is elérhető.

Get-Command -Module MyScriptModule
CommandType     Name                                            Version    Source
-----------     ----                                            -------    ------
Function        Get-MrPSVersion                                 1.0        MyScriptModule

Ha egy moduljegyzéket adott hozzá a modulhoz (és így kell), 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'

Nem szükséges mind a fájlban, mind Export-ModuleMember a .PSM1Moduljegyzék FunctionsToExport szakaszában használni. Az egyik vagy a másik elegendő.

Összegzés

Ebben a fejezetben megtanulhatta, hogyan alakíthatja a függvényeket szkriptmodultá a PowerShellben. Megismerkedett a szkriptmodulok létrehozásának ajánlott eljárásaival is, például egy moduljegyzék létrehozásával 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. Mi szükséges ahhoz, hogy a modulok automatikusan betöltődjenek egy parancs meghívásakor?