Powershell Skript Module erstellen

Hier wird gezeigt, wie aus einer Funktionsdatei functions.ps1 ein Powershell Modul bereitgestellt werden kann. Dabei wird functions.ps1 als Skriptmodul oder als Modul mit einem Manifest bereitgestellt.

Das Modul soll in beiden Fällen den Namen myModule erhalten.

Ein kurzer Blick in die Datei functions.ps1. Die Datei enthält vier Funktionen:

Invoke-WorkFlowgetInfoErstellt einen Workflow um Informationen über die angegebenen Computer zu ermitteln.
Get-infoAboutComputerDie Funktion sollt verwendet werden, um die Informationen über Computer abzurufen (win32_Computersystem, win32_OperationsSystem, win32_networkadapterConfiguration). Die Informationen werden in einer Liste mit Objekten sortiert nach den Computernamen zurückgegeben.
Invoke-WorkFlowGetProcessErstellt einen Workflow, um die Prozessliste von den angegebenen Computern abzurufen.
Get-ProcessonComputerDie Funktion ruft die Prozesse von Computern ab. Die Prozessliste wird sortiert nach Computer- und Prozessnamen zurückgegeben.

Die Funktionen Invoke-WorkFlowgetInfo und Invoke-WorkFlowGetProcess sind als Hilfsfunktionen gedacht. Sie sollten nicht direkt aufgerufen werden. Diese Funktionen kapseln die Workflow Aufrufe. (Bei unten beschriebenen Verfahren, Funktionen aus Moduldateien auszublenden, erwies sich dies als notwendig, da sich Workflows nicht aus der Veröffentlichung ausblenden lassen.)

Script Modul

Die Funktionsdatei functions.ps1 kann einfach in ein Modul umgewandelt werden. Im Ablageverzeichnis der Datei functions.ps1 wird das Unterverzeichnis myModule erstellt. Die Datei functions.ps1 wird mit dem Namen myModule.psm1 in das Verzeichnis kopiert.

Das Modul kann mit

  • Import-module .\myModule

geladen werden.

Um das Modul allgemein auf einem Rechner zur Verfügung zu stellen, wird im Verzeichnis $pshome (i.d.R.: C:\Windows\System32\WindowsPowerShell\v1.0) im Verzeichnis Modules das Verzeichnis myModule erstellt und die Datei .\myModule\myModule.psm1 wird in dieses Verzeichnis kopiert.

Nun kann das Modul mit

  • Import-module myModule

geladen werden.

Damit stehen die erstellten Funktionen zur Verfügung, ohne das functions.ps1 per Dot-Sourcing geladen werden muss:

Allerdings sind auch die Hilfsfunktionen geladen und könnten direkt aufgerufen werden.

Um das zu verhindern, wird der Datei mymodule.psm1 der Befehl Export-ModuleMember hinzugefügt. (Ich mache dies nicht in functions.ps1, da ich diese Datei zur Entwicklung verwende.) Die Datei mymodule.ps1 bekommt als letzte Anweisung den Export-ModuleMember Befehlt:

Export-ModuleMember -function @(„get-processOnComputer“,“get-InfoaboutComputer“)

Nach dem Laden des Modules sind nur noch die Funktionen get-InfoAboutComputer und Get-ProcessOnComputer verfügbar:

(Möglicher Weise muss mit remove-module das Modul erst entladen werden, damit die Änderungen wirksam werden!)

Hinweis: Man kann noch andere Definitionen in der Datei myModule.psm1 vornehmen und diese exportieren (z.B. Variablen, Aliase). Für letzteres wird die Datei functions.ps1 ergänzt:

  • new-Alias GIAC -value Get-InfoAboutComputer
  • new-Alias GPOC -value Get-ProcessonComputer

Diese Änderungen werden in die Moduldatei übernommen und zusätzlich zu den Funktionen werden die Aliase exportiert:

  • Export-ModuleMember -function @(„get-processOnComputer“,“get-InfoaboutComputer“)
  • Export-ModuleMember -alais @(„GIAC“,“GPOC“)

Was fehlt?

Es gibt keine Metadaten zu dem Modul. Mit get-module <ModulName> -listavailable kann man z.B. die Version, eine Beschreibung und andere Angaben abrufen. Dies ist für unser Skriptmodul unsinnig, das diese Angaben nicht verfügbar sind.

Beispiel: Modul msOnline

Unser Modul:

Skript Modul mit Manifest

Ein Skript Modul mit einen Manifest ermöglicht es, diese Angaben zu machen. Es stehen dann noch wesentlich mehr Möglichkeiten zur Verfügung:

  • Wir können z.B. die Veröffentlichung der Funktionen und Aliase in das Manifest verlegen.
  • Wir können die Moduldatei mymodule.psm1 mit einem abweichenden Namen versehen, also müssen schließlich nur unsere Daten functions.ps1 als functions.psm1 in das Modulverzeichnis kopieren.
  • Wir können weitere Dateien in das Modul integrieren.

Zunächst einmal benötigen wir das Manifest. Das könnte man mit Notepad erstellen, denn die Manifest Datei ist eine  Textdatei. Einfacher ist es, die Manifest Datei zu generieren. Dazu steht das Cmdlet New-ModuleManifest zur Verfügung.

Das Verzeichnis .\myModule enthält zunächst die folgende Dateien, bevor wir das Manifest erzeugen:

Wir erzeugen das Manifest mit Hilfe eines kleinen Skripts, in dem die Parameter für New-ModulManifest als Hashtable bereitgestellt werden:

</p>
# manifest-myModule.ps1
param ( [String]$Guid=(New-GUID).GUID )
$manifest = @{
Path             = '.\myModule\myModule.psd1'
RootModule       = 'functions.psm1'
Author           = 'KB'
ModuleVersion     = "1.0"
GUID         = $Guid
CompanyName       = "foo"
Copyright          = "by KB"
Description       = "Getting Infos about Computers"
}@
New-ModuleManifest @manifest</p>

(Hinweis: Natürlich kann dies Datei so ergänzt werden, dass das Modulverzeichnis erstellt und alle notwendigen Dateien in das Modulverzeichnis kopiert werden.)

Wir erzeugen eine GUID:

  • $GUID = (new-GUID).GUID

Oder (Powershell Version <= 4)

  • $GUID = ([GUID]::NewGUID()).GUID

Der Befehl erstellt das Manifest:

  • .\manifest-myModul.ps1 –GUID $GUID

Jetzt stehen die Metadaten zur Verfügung:

Allerdings werden auch die Hilfsfunktionen exportiert:

Um das zu verhindern, editieren wir die Datei .\mymodule\mymodule.psd1 und ändern folgende Stellen:

  • FunctionsToExport = ‚*‘

zu:

  • FunctionsToExport = @(‚get-InfoAboutComputer‘,’get-ProcessOnComputer‘)

Außerdem

  • AliasesToExport = ‚*‘

zu

  • AliasesToExport = @(‚GIAC‘,’GPOC‘)

Das Cmdlet Export-ModulMember sollte in function.psm1 nicht verwendet werden. Nun werde die Hilfsfunktionen nicht mehr geladen:

Werden Funktionen oder Aliase hinzugefügt, müssen die Einträge in der Manifestdatei angepasst werden.

Um eine weitere Moduldatei in diese Modul einzubinden, kann so vorgegangen werden: Wir erstellen eine weitere Datei mit Powershell Funktionen (z.B. getProcessFileInfo.ps1). Darin ist die Funktion get-ProcessFileInfo implementiert. Diese Datei wird als getProcessFileInfo.psm1 in das Modulverzeichnis kopiert:

Das Manifest wird an folgenden Stellen geändert (Entfernen # und Eintragen der Moduldatei):

  • # NestedModules = @()

zu

  • NestedModules = @(‚getProcessFileInfo.psm1‘)

Die Funktion get-ProcessFileInfo wird den zu exportierenden Funktionen hinzugefügt (in einer Zeile!):

  • FunctionsToExport = @(‚get-InfoAboutComputer‘,’get-ProcessOnComputer‘,’Get-ProcessFileInfo‘)

Wir ändern noch die Versionsnummer:

  • ModuleVersion = ‚2.0‘

Nun exportiert das Modul folgende Funktionen und zeigt eine neue Versionsnummer an:

Um das Modul allgemein zur Verfügung zu stellen, werden alle Datei aus .\myModule nach $psHome\Modules\myModule kopiert.

Hier finden Sie die Dateien zum Nachbauen.

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on pinterest
Pinterest
Share on email
Email
Scroll to Top