Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En skriptmodul är ett giltigt PowerShell-skript som sparats i ett .psm1
-tillägg. Med det här tillägget kan PowerShell-motorn använda regler och modul-cmdletar i filen. De flesta av dessa funktioner finns där för att hjälpa dig att installera koden på andra system samt hantera omfång. Du kan också använda en modulmanifestfil som beskriver mer komplexa installationer och lösningar.
Skriva en PowerShell-skriptmodul
Om du vill skapa en skriptmodul sparar du ett giltigt PowerShell-skript i en .psm1
fil. Skriptet och katalogen där det lagras måste använda samma namn. Ett skript med namnet MyPsScript.psm1
lagras till exempel i en katalog med namnet MyPsScript
.
Modulens katalog måste finnas i en sökväg som anges i $Env:PSModulePath
. Modulens katalog kan innehålla alla resurser som behövs för att köra skriptet och en modulmanifestfil som beskriver för PowerShell hur modulen fungerar.
Skapa en grundläggande PowerShell-modul
Följande steg beskriver hur du skapar en PowerShell-modul.
Spara ett PowerShell-skript med ett
.psm1
-tillägg. Använd samma namn för skriptet och katalogen där skriptet sparas.Om du sparar ett skript med tillägget
.psm1
kan du använda modul-cmdletarna, till exempel Import-Module. Modul-cmdletarna finns främst så att du kan importera och exportera koden till andra användares system. Den alternativa lösningen skulle vara att läsa in koden på andra system och sedan punktkälla den till aktivt minne, vilket inte är en skalbar lösning. Mer information finns i Förstå en Windows PowerShell-modul. När användarna importerar din.psm1
-fil är alla funktioner i skriptet tillgängliga som standard, men variabler är det inte.Ett exempel på Ett PowerShell-skript med titeln
Show-Calendar
är tillgängligt i slutet av den här artikeln.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 }
Om du vill styra användaråtkomsten till vissa funktioner eller variabler anropar du Export-ModuleMember i slutet av skriptet.
Exempelkoden längst ned i artikeln har bara en funktion, som som standard skulle exponeras. Vi rekommenderar dock att du uttryckligen anger vilka funktioner du vill exponera, enligt beskrivningen i följande kod:
function Show-Calendar { } Export-ModuleMember -Function Show-Calendar
Du kan begränsa vad som importeras med hjälp av ett modulmanifest. Mer information finns i Importera en PowerShell-modul och Skriva ett PowerShell-modulmanifest.
Om du har moduler som din egen modul behöver läsas in kan du använda
Import-Module
, överst i modulen.Cmdleten
Import-Module
importerar en målmodul till ett system och kan användas senare i proceduren för att installera din egen modul. Exempelkoden längst ned i den här artikeln använder inga importmoduler. Men om det gjorde det skulle de visas överst i filen, som du ser i följande kod:Import-Module GenericModule
Om du vill beskriva modulen i PowerShell-hjälpsystemet kan du antingen använda vanliga hjälpkommentare i filen eller skapa ytterligare en hjälpfil.
Kodexemplet längst ned i den här artikeln innehåller hjälpinformationen i kommentarerna. Du kan också skriva expanderade XML-filer som innehåller ytterligare hjälpinnehåll. Mer information finns i Skriva hjälp för Windows PowerShell-moduler.
Om du har ytterligare moduler, XML-filer eller annat innehåll som du vill paketera med modulen kan du använda ett modulmanifest.
Ett modulmanifest är en fil som innehåller namnen på andra moduler, kataloglayouter, versionsnummer, redigeringsdata och annan information. PowerShell använder modulmanifestfilen för att organisera och distribuera din lösning. Mer information finns i Så här skriver du ett PowerShell-modulmanifest.
Om du vill installera och köra modulen sparar du modulen på någon av lämpliga PowerShell-sökvägar och använder
Import-Module
.Sökvägarna där du kan installera modulen finns i den
$Env:PSModulePath
globala variabeln. En vanlig sökväg för att spara en modul i ett system skulle till exempel vara%SystemRoot%/users/<user>/Documents/PowerShell/Modules/<moduleName>
. Se till att skapa en katalog för din modul som använder samma namn som skriptmodulen, även om det bara är en enda.psm1
fil. Om du inte sparade modulen på någon av dessa sökvägar måste du ange modulens plats i kommandotImport-Module
. Annars skulle PowerShell inte kunna hitta modulen.Anmärkning
Från och med PowerShell 3.0 behöver du inte uttryckligen importera den om du har placerat modulen i någon av PowerShell-modulsökvägarna. Modulen läses in automatiskt när en användare anropar din funktion. Mer information om modulsökvägen finns i Importera en PowerShell-modul och about_PSModulePath.
Om du vill ta bort en modul från den aktiva tjänsten i den aktuella PowerShell-sessionen använder du Remove-Module.
Anmärkning
Remove-Module
tar bort en modul från den aktuella PowerShell-sessionen, men avinstallerar inte modulen eller tar bort modulens filer.
Show-Calendar kodexempel
Följande exempel är en skriptmodul som innehåller en enda funktion med namnet Show-Calendar
. Den här funktionen visar en visuell representation av en kalender. Exemplet innehåller PowerShell-hjälpsträngarna för synopsis, beskrivning, parametervärden och kod. När modulen importeras ser kommandot Export-ModuleMember
till att funktionen Show-Calendar
exporteras som modulmedlem.
<#
.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