Jak napsat modul skriptu PowerShellu
Modul skriptu je libovolný platný skript PowerShellu uložený v rozšíření .psm1
. Toto rozšíření umožňuje modulu PowerShellu používat ve vašem souboru pravidla a rutiny modulů. Většina z těchto možností vám pomůže s instalací kódu do jiných systémů a také správou oborů. Můžete také použít soubor manifestu modulu, který popisuje složitější instalace a řešení.
Vytvoření modulu skriptu PowerShellu
Pokud chcete vytvořit modul skriptu, uložte platný skript PowerShellu do souboru .psm1
. Skript a adresář, ve kterém je uložený, musí používat stejný název. Například skript s názvem MyPsScript.psm1
je uložen v adresáři s názvem MyPsScript
.
Adresář modulu musí být v cestě zadané v $Env:PSModulePath
. Adresář modulu může obsahovat všechny prostředky potřebné ke spuštění skriptu a soubor manifestu modulu, který popisuje, jak modul funguje.
Vytvoření základního modulu PowerShellu
Následující kroky popisují, jak vytvořit modul PowerShellu.
Uložte skript PowerShellu s rozšířením
.psm1
. Použijte stejný název pro skript a adresář, do kterého se skript uloží.Uložení skriptu s rozšířením
.psm1
znamená, že můžete použít rutiny modulu, například Import-Module . Rutiny modulu existují především proto, abyste mohli importovat a exportovat kód do systémů jiných uživatelů. Alternativním řešením by bylo načíst kód do jiných systémů a pak ho načíst do aktivní paměti, což není škálovatelné řešení. Další informace najdete v tématu Principy modulu Prostředí Windows PowerShell. Když uživatelé naimportují soubor.psm1
, jsou ve výchozím nastavení všechny funkce ve vašem skriptu přístupné, ale proměnné nejsou.Příklad skriptu PowerShellu s názvem
Show-Calendar
je k dispozici na konci tohoto článku.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 }
Pokud chcete řídit přístup uživatelů k určitým funkcím nebo proměnným, zavolejte Export-ModuleMember na konci skriptu.
Ukázkový kód v dolní části článku má pouze jednu funkci, která by se ve výchozím nastavení zobrazila. Doporučujeme však explicitně volat, které funkce chcete zveřejnit, jak je popsáno v následujícím kódu:
function Show-Calendar { } Export-ModuleMember -Function Show-Calendar
To, co se importuje, můžete omezit pomocí manifestu modulu. Další informace najdete v tématu Import modulu PowerShellu a Postup zápisu manifestu modulu PowerShellu.
Pokud máte moduly, které je potřeba načíst, můžete v horní části modulu použít
Import-Module
.Rutina
Import-Module
naimportuje cílový modul do systému a můžete ho použít později v postupu k instalaci vlastního modulu. Vzorový kód v dolní části tohoto článku nepoužívá žádné moduly importu. Pokud ano, zobrazí se v horní části souboru, jak je znázorněno v následujícím kódu:Import-Module GenericModule
Pokud chcete popsat modul systému nápovědy PowerShellu, můžete buď použít standardní komentáře nápovědy v souboru, nebo vytvořit další soubor nápovědy.
Ukázka kódu v dolní části tohoto článku obsahuje informace nápovědy v komentářích. Můžete také napsat rozbalené soubory XML, které obsahují další obsah nápovědy. Další informace najdete v tématu Nápověda k zápisu modulů prostředí Windows PowerShell.
Pokud máte další moduly, soubory XML nebo jiný obsah, který chcete s modulem zabalit, můžete použít manifest modulu.
Manifest modulu je soubor, který obsahuje názvy jiných modulů, rozložení adresářů, čísla verzí, data autora a další informace. PowerShell pomocí souboru manifestu modulu uspořádá a nasadí řešení. Další informace najdete v tématu Jak napsat manifest modulu PowerShellu.
Pokud chcete nainstalovat a spustit modul, uložte ho do jedné z příslušných cest PowerShellu a použijte
Import-Module
.Cesty, kam můžete modul nainstalovat, se nacházejí v globální proměnné
$Env:PSModulePath
. Například běžná cesta k uložení modulu do systému by byla%SystemRoot%/users/<user>/Documents/PowerShell/Modules/<moduleName>
. Nezapomeňte vytvořit adresář pro modul, který používá stejný název jako modul skriptu, i když se jedná pouze o jeden.psm1
soubor. Pokud jste modul neuložili do jedné z těchto cest, museli byste v příkazuImport-Module
zadat umístění modulu. Jinak by PowerShell nemohl modul najít.Poznámka:
Počínaje PowerShellem 3.0, pokud jste modul umístili do jedné z cest modulu PowerShellu, nemusíte ho explicitně importovat. Modul se automaticky načte, když uživatel zavolá vaši funkci. Další informace o cestě k modulu najdete v tématu Import modulu PowerShell a about_PSModulePath.
Pokud chcete odebrat modul z aktivní služby v aktuální relaci PowerShellu, použijte Remove-Module .
Poznámka:
Remove-Module
odebere modul z aktuální relace PowerShellu, ale neodinstaluje modul ani neodstraní soubory modulu.
příklad kódu Show-Calendar
Následující příklad je modul skriptu, který obsahuje jednu funkci s názvem Show-Calendar
. Tato funkce zobrazí vizuální reprezentaci kalendáře. Ukázka obsahuje řetězce nápovědy PowerShellu pro synopzi, popis, hodnoty parametrů a kód. Po importu modulu příkaz Export-ModuleMember
zajistí, že se funkce Show-Calendar
exportuje jako člen modulu.
<#
.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