Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein Skriptmodul ist ein beliebiges gültiges PowerShell-Skript, das in einer .psm1
Erweiterung gespeichert ist. Mit dieser Erweiterung kann das PowerShell-Modul Regeln und Modul-Cmdlets in Ihrer Datei verwenden. Die meisten dieser Funktionen helfen Ihnen beim Installieren ihres Codes auf anderen Systemen sowie beim Verwalten von Bereichsdefinitionen. Sie können auch eine Modulmanifestdatei verwenden, die komplexere Installationen und Lösungen beschreibt.
Schreiben eines PowerShell-Skriptmoduls
Um ein Skriptmodul zu erstellen, speichern Sie ein gültiges PowerShell-Skript in einer .psm1
Datei. Das Skript und das Verzeichnis, in dem es gespeichert ist, müssen denselben Namen verwenden. Beispielsweise wird ein Skript mit dem Namen MyPsScript.psm1
in einem Verzeichnis mit dem Namen MyPsScript
gespeichert.
Das Verzeichnis des Moduls muss sich in einem Pfad befinden, der in $Env:PSModulePath
angegeben ist. Das Verzeichnis des Moduls kann alle Ressourcen enthalten, die zum Ausführen des Skripts erforderlich sind, und eine Modulmanifestdatei, die powerShell beschreibt, wie Ihr Modul funktioniert.
Erstellen eines einfachen PowerShell-Moduls
In den folgenden Schritten wird beschrieben, wie Sie ein PowerShell-Modul erstellen.
Speichern Sie ein PowerShell-Skript mit einer
.psm1
-Erweiterung. Verwenden Sie denselben Namen für das Skript und das Verzeichnis, in dem das Skript gespeichert wird.Das Speichern eines Skripts mit der erweiterung
.psm1
bedeutet, dass Sie die Modul-Cmdlets wie Import-Module-verwenden können. Die Modul-Cmdlets sind in erster Linie vorhanden, damit Sie Ihren Code in die Systeme anderer Benutzer importieren und exportieren können. Die alternative Lösung wäre das Laden des Codes auf anderen Systemen und dann die Dot-Source in den aktiven Speicher, was keine skalierbare Lösung ist. Weitere Informationen finden Sie unter Grundlegendes zu einem Windows PowerShell-Modul. Wenn Benutzer Ihre.psm1
Datei importieren, sind standardmäßig alle Funktionen in Ihrem Skript zugänglich, Variablen sind jedoch nicht möglich.Ein PowerShell-Beispielskript mit dem Titel
Show-Calendar
ist am Ende dieses Artikels verfügbar.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 }
Um den Benutzerzugriff auf bestimmte Funktionen oder Variablen zu steuern, rufen Sie Export-ModuleMember- am Ende Des Skripts auf.
Der Beispielcode unten im Artikel verfügt nur über eine Funktion, die standardmäßig verfügbar gemacht wird. Es wird jedoch empfohlen, explizit aufzurufen, welche Funktionen Sie verfügbar machen möchten, wie im folgenden Code beschrieben:
function Show-Calendar { } Export-ModuleMember -Function Show-Calendar
Sie können einschränken, was mithilfe eines Modulmanifests importiert wird. Weitere Informationen finden Sie unter Importieren eines PowerShell-Moduls und Schreiben eines PowerShell-Modulmanifests.
Wenn Sie Über Module verfügen, die Ihr eigenes Modul laden muss, können Sie
Import-Module
oben im Modul verwenden.Das cmdlet
Import-Module
importiert ein zielorientiertes Modul in ein System und kann zu einem späteren Zeitpunkt im Verfahren verwendet werden, um Ihr eigenes Modul zu installieren. Der Beispielcode unten in diesem Artikel verwendet keine Importmodule. Aber wenn dies der Vorgang getan hat, werden sie oben in der Datei aufgeführt, wie im folgenden Code dargestellt:Import-Module GenericModule
Um Ihr Modul im PowerShell-Hilfesystem zu beschreiben, können Sie entweder Standardhilfekommentare innerhalb der Datei verwenden oder eine zusätzliche Hilfedatei erstellen.
Das Codebeispiel unten in diesem Artikel enthält die Hilfeinformationen in den Kommentaren. Sie können auch erweiterte XML-Dateien schreiben, die zusätzliche Hilfeinhalte enthalten. Weitere Informationen finden Sie unter Schreiben der Hilfe für Windows PowerShell-Module.
Wenn Sie über zusätzliche Module, XML-Dateien oder andere Inhalte verfügen, die Sie mit Ihrem Modul verpacken möchten, können Sie ein Modulmanifest verwenden.
Ein Modulmanifest ist eine Datei, die die Namen anderer Module, Verzeichnislayouts, Versionsverwaltungsnummern, Autorendaten und andere Informationen enthält. PowerShell verwendet die Modulmanifestdatei, um Ihre Lösung zu organisieren und bereitzustellen. Weitere Informationen finden Sie unter Schreiben eines PowerShell-Modulmanifests.
Um Ihr Modul zu installieren und auszuführen, speichern Sie das Modul in einem der entsprechenden PowerShell-Pfade, und verwenden Sie
Import-Module
.Die Pfade, in denen Sie Ihr Modul installieren können, befinden sich in der globalen Variablen
$Env:PSModulePath
. Ein allgemeiner Pfad zum Speichern eines Moduls auf einem System wäre z. B.%SystemRoot%/users/<user>/Documents/PowerShell/Modules/<moduleName>
. Erstellen Sie unbedingt ein Verzeichnis für Ihr Modul, das denselben Namen wie das Skriptmodul verwendet, auch wenn es sich nur um eine einzelne.psm1
Datei handelt. Wenn Sie Das Modul nicht in einem dieser Pfade gespeichert haben, müssen Sie den Speicherort des Moduls im BefehlImport-Module
angeben. Andernfalls konnte PowerShell das Modul nicht finden.Hinweis
Ab PowerShell 3.0 müssen Sie es nicht explizit importieren, wenn Sie Ihr Modul in einem der PowerShell-Modulpfade platziert haben. Ihr Modul wird automatisch geladen, wenn ein Benutzer Ihre Funktion aufruft. Weitere Informationen zum Modulpfad finden Sie unter Importieren eines PowerShell-Moduls und about_PSModulePath.
Um ein Modul aus dem aktiven Dienst in der aktuellen PowerShell-Sitzung zu entfernen, verwenden Sie Remove-Module.
Hinweis
Remove-Module
entfernt ein Modul aus der aktuellen PowerShell-Sitzung, deinstalliert aber nicht das Modul oder löscht die Dateien des Moduls.
Show-Calendar Codebeispiel
Das folgende Beispiel ist ein Skriptmodul, das eine einzelne Funktion mit dem Namen Show-Calendar
enthält. Diese Funktion zeigt eine visuelle Darstellung eines Kalenders an. Das Beispiel enthält die PowerShell-Hilfezeichenfolgen für die Veröffentlichungen, Beschreibung, Parameterwerte und Code. Wenn das Modul importiert wird, stellt der Befehl Export-ModuleMember
sicher, dass die Show-Calendar
-Funktion als Modulelement exportiert wird.
<#
.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