Zum Hauptinhalt springen

Skriptmodule erstellen

Module können als Binärmodule mit einer .NET-Sprache oder in Powershell selbst erstellt werden. In Powershell geschriebene Module werden auch als Skriptmodule bezeichnet und sind letztlich nichts weiter als Skripte, die nur Funktionen enthalten.

Prinzipiell kann jedes Skript über den Befehl Import-Module als Modul geladen werden. Bei einem klassischen Skript macht das aber nur wenig Sinn. Stattdessen sollte ein Skriptmodul nur aus Funktio-nen oder Variablen bestehen, die auch nach dem Aufruf des Skriptmoduls noch verwendet werden kön-nen.

Mit der Einführung von Modulen in Powershell 2 musste tatsächlich jedes zusätzliche Modul, das man verwenden wollte, mit Import-Module nachgeladen werden. Ab Powershell 3.0 erledigt die Powershell das für uns automatisch, wenn man sich bei der Erstellung an eine Reihe von Regeln hält:


• Die Module müssen in einem der Module-Ordner abgelegt sein, die in der Umgebungsvariablen PSModulePath hinterlegt sind. Sie können sie über $ENV:PSModulePath abfragen

• Skriptmodule müssen für das Autoloading sta� der Dateiendung .ps1 mit der Endung .psm1 gespeichert werden. Dadurch erkennt Powershell beim Laden, welche Datei gestartet werden muss und versucht nicht, alle Skriptdateien im Modulordner zu starten.

• Die .psm1-Datei muss den gleichen Namen tragen wie der Ordner, in dem sie gespeichert ist.

Hier ein Beispiel:


C:\Program Files\WindowsPowerShell\Modules\BCDStore\BCDStore.psm1

• "C:\Program Files\WindowsPowerShell\Modules\" ist der Modulordner, den Sie zum Speichern von Systemweit verfügbaren Modulen verwenden sollten.

• "BCDStore" ist der Name des Modul-Ordners

• "BCDStore.psm1" ist der Name der Skriptdatei. Der Name der Datei (ohne Endung) muss dem Namen des Ordners entsprechen.

Dieses Feature wird als Autodiscovery bezeichnet, weil Powershell das Skriptmodul erst dann ausführt, wenn eine Ihrer Funktionen zum ersten Mal aufgerufen wird. Beim Start der Powershell werden die Funktionen in Ihrem Skript nur ermittelt und in der Konsole sichtbar gemacht. Dadurch müssen Sie beim Öffnen eines Powershell-Prozesses nicht warten, bis alle Skriptmodule ausgeführt wurden.

Im Folgenden werden die Funktionen Write-ReturnArrayFromScriptblock sowie Test-ParameterValue-FromPipeline in ein Skriptmodul ausgelagert.


Function Write-ReturnArrayFromScriptblock

{

Param( [int]$Wert1, [int]$Wert2

)


'Summe: ' + ( $Wert1 + $Wert2 ) 'Produkt: ' + ( $Wert1 * $Wert2 )

}


Function Test-ParameterValueFromPipeline

{

param(

[Parameter(ValueFromPipelineByPropertyName=$true)] [Alias('Fullname','FilePath')]

[string]$Path

)


Process {

$Path

}

}

image

Get-Module -name NWHelperfunctions -Listavailable

ModuleType ExportedCommands

Script {Write-ReturnArrayFromScriptblock, Test-ParameterValueFromPipeline}

Speichern Sie die Funktionen als Skript mit dem Namen NWHelperfunctions.psm1 im Ordner NWHel-perfunctions. Achten Sie darauf, dass der Name des Ordners und der Datei identisch ist. Nun kopieren Sie den Ordner in einen der Modulordner und starten eine neue Powershell-Konsole. Ihr Modul wird angezeigt, wenn Sie Get-Module -Listavailable eingeben.


Wie sie sehen können, hat Autodiscovery die Funktionen aus Ihrem Skriptmodul erkannt und als Expor-tedCommands aufgelistet. (Die Spalten Version und Name sind im Beispiel entfernt worden). Sie kön-nen die Funktionen auch in der Konsole per Tabulator-Ergänzung auflösen lassen. Wenn Sie Get-Modu-le -Name NWHelperfunctions aufrufen, wird Ihr Module aber nicht angezeigt. Das liegt daran, dass Sie noch keine der Funktionen des Moduls gestartet haben – das Skriptmodul wurde noch gar nicht ausge-führt.

Mit Get-Command -Module <IhrModul> können Sie sich die Funktionen Ihres Moduls auflisten lassen.


Get-Command -Module NWHelperfunctions

CommandType

Name

Version …

-----------

----

-------

Function

Test-ParameterValueFromPipeline

0.0

Function

Write-ReturnArrayFromScriptblock

0.0

Mit Aufrufen von Get-Command hat Powershell das Skriptmodul ausgeführt. Ein erneuter Aufruf von Get-Module -Name Helperfunctions zeigt das Modul jetzt an. Das gleiche passiert, wenn Sie eins der Kommandos aus dem Modul aufrufen.