Megosztás a következőn keresztül:


PowerShell-szkriptmodul írása

A szkriptmodul egy .psm1 bővítményben mentett érvényes PowerShell-szkript. Ez a bővítmény lehetővé teszi, hogy a PowerShell-motor szabályokat és modulparancsmagokat használjon a fájlon. A legtöbb ilyen képesség segít a kód más rendszerekre való telepítésében, valamint a hatókörkezelés kezelésében. Használhat egy moduljegyzékfájlt is, amely összetettebb telepítéseket és megoldásokat ír le.

PowerShell-szkriptmodul írása

Szkriptmodul létrehozásához mentsen egy érvényes PowerShell-szkriptet egy .psm1 fájlba. A szkriptnek és a könyvtárnak, ahol a tároló található, ugyanazt a nevet kell használnia. Egy MyPsScript.psm1 nevű szkript például egy MyPsScriptnevű könyvtárban van tárolva.

A modul könyvtárának a $Env:PSModulePathmegadott elérési úton kell lennie. A modul könyvtára tartalmazhat minden olyan erőforrást, amely a szkript futtatásához szükséges, és egy moduljegyzékfájlt, amely leírja a PowerShellnek a modul működését.

Alapszintű PowerShell-modul létrehozása

Az alábbi lépések bemutatják, hogyan hozhat létre PowerShell-modult.

  1. PowerShell-szkript mentése .psm1 kiterjesztéssel. Használja ugyanazt a nevet a szkripthez és a könyvtárhoz, amelyben a szkriptet menti.

    A szkriptek .psm1 kiterjesztéssel való mentése azt jelenti, hogy használhatja a modul parancsmagjait, például Import-Module. A modul parancsmagjai elsősorban azért léteznek, hogy importálhassa és exportálhassa a kódot más felhasználók rendszereibe. A másik megoldás az lenne, ha a kódot más rendszerekre töltené be, majd pontozná be az aktív memóriába, ami nem skálázható megoldás. További információ: Windows PowerShell-modulismertetése. Alapértelmezés szerint, amikor a felhasználók importálják a .psm1 fájlt, a szkript összes függvénye elérhető, de a változók nem.

    A cikk végén egy Show-Calendarcímű PowerShell-példaszkript érhető el.

    function Show-Calendar {
    param(
        [datetime] $Start = [datetime]::Today,
        [datetime] $End = $Start,
        $FirstDayOfWeek,
        [int[]] $HighlightDay,
        [string[]] $HighlightDate = [datetime]::Today.ToString('yyyy-MM-dd')
        )
    
        #actual code for the function goes here see the end of the topic for the complete code sample
    }
    
  2. Ha szabályozni szeretné a felhasználók hozzáférését bizonyos függvényekhez vagy változókhoz, hívja meg Export-ModuleMember a szkript végén.

    A cikk alján található példakódnak csak egy függvénye van, amely alapértelmezés szerint elérhető lesz. Javasoljuk azonban, hogy kifejezetten hívja fel, hogy mely függvényeket szeretné elérhetővé tenni az alábbi kódban leírtak szerint:

    function Show-Calendar {
          }
    Export-ModuleMember -Function Show-Calendar
    

    A moduljegyzék használatával korlátozhatja az importált adatokat. További információ: PowerShell-modul importálása és PowerShell-moduljegyzékírása.

  3. Ha vannak olyan moduljai, amelyeket a saját moduljának be kell töltenie, használhatja a Import-Module, a modul tetején.

    A Import-Module parancsmag egy célzott modult importál egy rendszerbe, és az eljárás egy későbbi szakaszában a saját modul telepítéséhez használható. A cikk alján található mintakód nem használ importálási modulokat. Ha mégis, akkor a fájl tetején jelennek meg, ahogy az a következő kódban is látható:

    Import-Module GenericModule
    
  4. A modul PowerShell-súgórendszerben való leírásához használhat szabványos súgó megjegyzéseket a fájlban, vagy létrehozhat egy további súgófájlt.

    A cikk alján található kódminta a megjegyzésekben található súgóinformációkat tartalmazza. Kibontott XML-fájlokat is írhat, amelyek további súgótartalmakat tartalmaznak. További információ: Súgó írása Windows PowerShell-modulokhoz.

  5. Ha további modulokkal, XML-fájlokkal vagy más, a modulhoz csomagolni kívánt tartalommal rendelkezik, használhat egy moduljegyzéket.

    A moduljegyzék olyan fájl, amely más modulok nevét, könyvtárelrendezéseket, verziószámokat, szerzői adatokat és egyéb információkat tartalmaz. A PowerShell a modul jegyzékfájlját használja a megoldás rendszerezésére és üzembe helyezésére. További információ: PowerShell-moduljegyzékírása.

  6. A modul telepítéséhez és futtatásához mentse a modult a megfelelő PowerShell-elérési utak egyikére, és használja a Import-Module.

    A modul telepítéséhez szükséges útvonalak a $Env:PSModulePath globális változóban találhatók. Egy modul rendszeren való mentésének gyakori elérési útja például %SystemRoot%/users/<user>/Documents/PowerShell/Modules/<moduleName>. Mindenképpen hozzon létre egy könyvtárat a modulhoz, amely ugyanazt a nevet használja, mint a szkriptmodul, még akkor is, ha csak egyetlen .psm1 fájlról van szó. Ha nem mentette a modult ezen útvonalak egyikére, meg kell adnia a modul helyét a Import-Module parancsban. Ellenkező esetben a PowerShell nem találja a modult.

    Megjegyzés

    A PowerShell 3.0-tól kezdve, ha a modult a PowerShell-modul egyik elérési útján helyezte el, nem kell explicit módon importálnia. A modul automatikusan betöltődik, amikor egy felhasználó meghívja a függvényt. A modul elérési útjáról további információt PowerShell-modul importálása és about_PSModulePathcímű témakörben talál.

  7. Ha el szeretne távolítani egy modult az aktív szolgáltatásból az aktuális PowerShell-munkamenetben, használja Remove-Module.

    Megjegyzés

    Remove-Module eltávolít egy modult az aktuális PowerShell-munkamenetből, de nem távolítja el a modult, és nem törli a modul fájljait.

példakód Show-Calendar

Az alábbi példa egy szkriptmodul, amely egyetlen Show-Calendarnevű függvényt tartalmaz. Ez a függvény egy naptár vizuális ábrázolását jeleníti meg. A minta tartalmazza a PowerShell súgósztringeit a szinopszishoz, a leíráshoz, a paraméterértékekhez és a kódhoz. A modul importálásakor a Export-ModuleMember parancs gondoskodik arról, hogy a Show-Calendar függvényt a rendszer modultagként exportálja.

<#
 .SYNOPSIS
  Displays a visual representation of a calendar.

 .DESCRIPTION
  Displays a visual representation of a calendar. This function supports multiple months
  and lets you highlight specific date ranges or days.

 .PARAMETER Start
  The first month to display.

 .PARAMETER End
  The last month to display.

 .PARAMETER FirstDayOfWeek
  The day of the month on which the week begins.

 .PARAMETER HighlightDay
  Specific days (numbered) to highlight. Used for date ranges like (25..31).
  Date ranges are specified by the Windows PowerShell range syntax. These dates are
  enclosed in square brackets.

 .PARAMETER HighlightDate
  Specific days (named) to highlight. These dates are surrounded by asterisks.

 .EXAMPLE
   # Show a default display of this month.
   Show-Calendar

 .EXAMPLE
   # Display a date range.
   Show-Calendar -Start "March, 2010" -End "May, 2010"

 .EXAMPLE
   # Highlight a range of days.
   Show-Calendar -HighlightDay (1..10 + 22) -HighlightDate "2008-12-25"
#>
function Show-Calendar {
param(
    [datetime] $Start = [datetime]::Today,
    [datetime] $End = $Start,
    $FirstDayOfWeek,
    [int[]] $HighlightDay,
    [string[]] $HighlightDate = [datetime]::Today.ToString('yyyy-MM-dd')
    )

## Determine the first day of the start and end months.
$Start = New-Object DateTime $Start.Year,$Start.Month,1
$End = New-Object DateTime $End.Year,$End.Month,1

## Convert the highlighted dates into real dates.
[datetime[]] $HighlightDate = [datetime[]] $HighlightDate

## Retrieve the DateTimeFormat information so that the
## calendar can be manipulated.
$dateTimeFormat  = (Get-Culture).DateTimeFormat
if($FirstDayOfWeek)
{
    $dateTimeFormat.FirstDayOfWeek = $FirstDayOfWeek
}

$currentDay = $Start

## Process the requested months.
while($Start -le $End)
{
    ## Return to an earlier point in the function if the first day of the month
    ## is in the middle of the week.
    while($currentDay.DayOfWeek -ne $dateTimeFormat.FirstDayOfWeek)
    {
        $currentDay = $currentDay.AddDays(-1)
    }

    ## Prepare to store information about this date range.
    $currentWeek = New-Object PsObject
    $dayNames = @()
    $weeks = @()

    ## Continue processing dates until the function reaches the end of the month.
    ## The function continues until the week is completed with
    ## days from the next month.
    while(($currentDay -lt $Start.AddMonths(1)) -or
        ($currentDay.DayOfWeek -ne $dateTimeFormat.FirstDayOfWeek))
    {
        ## Determine the day names to use to label the columns.
        $dayName = "{0:ddd}" -f $currentDay
        if($dayNames -notcontains $dayName)
        {
            $dayNames += $dayName
        }

        ## Pad the day number for display, highlighting if necessary.
        $displayDay = " {0,2} " -f $currentDay.Day

        ## Determine whether to highlight a specific date.
        if($HighlightDate)
        {
            $compareDate = New-Object DateTime $currentDay.Year,
                $currentDay.Month,$currentDay.Day
            if($HighlightDate -contains $compareDate)
            {
                $displayDay = "*" + ("{0,2}" -f $currentDay.Day) + "*"
            }
        }

        ## Otherwise, highlight as part of a date range.
        if($HighlightDay -and ($HighlightDay[0] -eq $currentDay.Day))
        {
            $displayDay = "[" + ("{0,2}" -f $currentDay.Day) + "]"
            $null,$HighlightDay = $HighlightDay
        }

        ## Add the day of the week and the day of the month as note properties.
        $currentWeek | Add-Member NoteProperty $dayName $displayDay

        ## Move to the next day of the month.
        $currentDay = $currentDay.AddDays(1)

        ## If the function reaches the next week, store the current week
        ## in the week list and continue.
        if($currentDay.DayOfWeek -eq $dateTimeFormat.FirstDayOfWeek)
        {
            $weeks += $currentWeek
            $currentWeek = New-Object PsObject
        }
    }

    ## Format the weeks as a table.
    $calendar = $weeks | Format-Table $dayNames -AutoSize | Out-String

    ## Add a centered header.
    $width = ($calendar.Split("`n") | Measure-Object -Maximum Length).Maximum
    $header = "{0:MMMM yyyy}" -f $Start
    $padding = " " * (($width - $header.Length) / 2)
    $displayCalendar = " `n" + $padding + $header + "`n " + $calendar
    $displayCalendar.TrimEnd()

    ## Move to the next month.
    $Start = $Start.AddMonths(1)

}
}
Export-ModuleMember -Function Show-Calendar