PowerShell-Modul - separate Datei für jedes Cmdlet

8

Damit kämpfe ich schon eine ganze Weile. Ich beabsichtige, ein neues PowerShell-Modul für mein Projekt zu erstellen. Ziel ist es, mehrere benutzerdefinierte Cmdlets in eine eigenständige Einheit zu packen, die ich über unser Nexus-Repository (oder über alles andere) auf anderen Rechnern bereitstellen kann.

Problem: Wo auch immer ich hinsehe, ich sehe Tutorials, die alle PowerShell-Funktionen / Cmdlets in eine einzige * .psm1 -Datei packen. Die Datei wird in einem gleichnamigen Verzeichnis gespeichert, das das Modul selbst repräsentiert.

Frage: Gibt es eine Möglichkeit, wie Sie jedes Cmdlet / jede Funktion in eine eigenständige Datei aufteilen? Wenn ich ein Modul habe, das aus mehreren Cmdlets besteht, ist es nicht sehr praktisch, sie alle in eine einzige * .psm1-Datei zu schreiben.

Danke Matthäus

    
Matthew Lowe 15.04.2015, 06:12
quelle

3 Antworten

12

Sie können auch eine Manifestdatei verwenden. "Ein Modulmanifest ist eine .psd1-Datei, die eine Hashtabelle enthält. Die Schlüssel und Werte in der Hashtabelle machen Folgendes:

  • Beschreiben Sie die Inhalte und Attribute des Moduls.
  • Definieren Sie die Voraussetzungen
  • Bestimmen Sie, wie die Komponenten verarbeitet werden.

Für ein Modul sind keine Manifeste erforderlich. Module können auf Skriptdateien (.ps1), Skriptmoduldateien (.psm1), Manifestdateien (.psd1), Formatierungs- und Dateitypen (.ps1xml), Cmdlet- und Providerassemblys (.dll), Ressourcendateien, Hilfedateien, Lokalisierung verweisen Dateien oder jede andere Art von Datei oder Ressource, die als Teil des Moduls gebündelt ist. Bei einem internationalisierten Skript enthält der Modulordner auch eine Reihe von Nachrichtenkatalogdateien. Wenn Sie dem Modulordner eine Manifestdatei hinzufügen, können Sie die mehreren Dateien als einzelne Einheit referenzieren, indem Sie auf das Manifest verweisen. "( Quelle )

Sie können also ps1-Dateien anstelle von psm1-Dateien direkt aus psd1-Dateien verwenden:

%Vor%     
Johan de Haan 15.04.2015 07:21
quelle
1

Nachdem wir @ MatthewLowe verfolgt haben, habe ich meine .psm1 wie folgt zu einem "One Liner" gemacht; dies scheint zu funktionieren, vorausgesetzt, dass keiner der Scriptlets von einem abhängt, dessen Name alphabetisch nach sich selbst steht :

Get-ChildItem -Path $psScriptRoot\*.ps1 | ForEach-Object { . $_.fullname; Export-ModuleMember -Function ([IO.PATH]::GetFileNameWithoutExtension($_.fullname)) }

    
Jeff Zeitlin 05.05.2017 13:45
quelle
0

Einfach diese Antwort posten, die ich gefunden habe, da ich eigentlich selbst Fragen gestellt habe :-). Ich habe ein paar PowerShell-Module aus dem Internet heruntergeladen und nach innen geschaut. Dort habe ich eine Antwort gefunden. Aber da ich für einige Stunden hier feststeckte (neu bei Powershell ;-)), entschloss ich mich, dies für zukünftige Generationen zu posten :-P.

Sie können Ihre Cmdlets (* .ps1-Dateien) EACH in eine separate Datei einfügen. Speichern Sie sie in Ihrem Modulverzeichnis und erstellen Sie die * .psm1-Datei. Dann dot-source Ihre * .ps1 Cmdlets / Funktionen in diese * .psm1.

Der Verweis auf das aktuelle Modulverzeichnis, in dem Ihre * .ps1-Dateien gespeichert sind, muss jedoch wie folgt bereitgestellt werden: ". $ PsScriptRoot / moduleFunc1.ps1" UND NICHT WIE " . ./moduleFunc1.ps1 "

Viel Spaß Matthäus

    
Matthew Lowe 15.04.2015 06:12
quelle