Ich habe ein großes Skript, das ich jetzt mit Funktionen aufräume. Aber ich habe festgestellt, dass es irgendwie unordentlich wird, sie alle oben im Skript zu platzieren. Ich muss an hunderten Zeilen Code vorbei scrollen, um zum Skript selbst zu gelangen.
Wie halten Sie Ihre Skripte sauber? Haben Sie Ihre Funktionen in einer separaten Datei?
Wenn Sie den Skript-Editor PowerGUI verwenden, können Sie Regionen wie diese verwenden:
%Vor%Wenn Sie das Skript im PowerGUI-Skript-Editor öffnen, werden die Bereiche ausgeblendet, so dass Sie nicht blättern müssen, um zur Hauptlogik zu gelangen. Dies funktioniert auch in Microsoft ISE. Nicht alle Skript-Editoren berücksichtigen jedoch die Regions-Tags.
Eine weitere Möglichkeit besteht darin, Ihre Funktionen entweder in ein anderes Skript zu externalisieren und das so genannte dot sourcing . C:\myfunctions.ps1
auszuführen oder sie in eine Moduldatei mit der Erweiterung .psm1
einzufügen und Import-Module
zu verwenden.
Eine nützliche Technik besteht darin, Ihr gesamtes Skript in eine Funktion zu stellen:
%Vor% Ich habe gerade festgestellt, dass diese Frage mit powershell
markiert wurde, während das obige Beispiel für Bourne ist. Die Technik ist wahrscheinlich gültig, aber die Syntax kann abweichen.
Die Technik, die wir eingeführt haben, besteht darin, alle unsere Funktionen über ein Skriptmodul zu laden. Wir haben einen Ordner erstellt, der alle einzelnen Funktionsdateien enthält und diese in die entsprechenden Kategorien unterteilt. Sobald dies geschehen ist, erstellen wir eine .psm1
-Datei, um dem Modul mitzuteilen, was geladen werden soll, und fügen dann den Modulpfad zu unserem PowerShell-Profil hinzu (falls nicht im Standardmodul-Speicherort).
Module-Name.psm1 (befindet sich unter einem Ordner mit demselben Namen - Erforderlich)
%Vor%Microsoft.PowershellISE_profile.ps1 / Microsoft.Powershell_profile.ps1
%Vor%Der obige Code bedeutet, dass Sie das Modul nicht an der gleichen Stelle wie der Rest speichern müssen (nützlich in unserem Fall, da wir SVN verwenden, um unsere Sachen mit unserem Team zu versionieren und zu teilen).
Zur Erinnerung:
Wir fügen den "ps1" -Dateien die Präfixe "func_" hinzu, so dass bei der Vervollständigung des Funktionsnamens durch die Tabs, wenn sie sich im selben Verzeichnis wie die Datei befinden, keine Verwirrung entsteht. Außerdem fügen wir den Namespace (Firmeninitialen usw.) voran, damit unsere Funktionsnamen nicht mit anderen hinzugefügten Funktionen kollidieren.
Ein zusätzlicher nützlicher Tipp, der sich während der Entwicklung als nützlich erweisen könnte, ist die Definition eines Alias, "reload" in unserem Fall, der das Modul zum Nachladen zwingt. Das heißt, sobald Sie eine Datei geändert haben, müssen Sie nur noch die Datei eingeben und sie wird mit Ihren Änderungen erneut in den Speicher geladen.
%Vor%Der Grund, warum ich "int_" anstelle unserer normalen Benennungsstruktur verwende, ist, dass sich diese Funktion in unserem Profil befindet und ich es als interne und nicht als vollständige Funktion ansehe.
Ich hoffe, das gibt dir ein paar gute Ideen, es hat bis jetzt super für uns geklappt!
-Adam
Eine Sache, auf die man achten muss, ist der Umfang. Dies wird nicht funktionieren:
%Vor%Die load-functions-Funktion hat ihren eigenen Bereich, und die Funktionen, die sie erstellt, existieren nur in ihrem lokalen Bereich. Sie werden weg sein, wenn die Funktion beendet und der Bereich entsorgt wird.
Sie müssen diese im lokalen Bereich ausführen, indem Sie die Funktionen wie folgt dot-sourcen:
(Beachten Sie, dass zwischen dem Punkt und den Funktionsnamen ein Leerzeichen steht.)
Es funktioniert, wenn main
nicht im lokalen Bereich ausgeführt wird, aber wenn Sie Argumente an das Skript übergeben, müssen Sie dies tun, damit $args
im Skriptbereich verwendet wird.
Eine andere mögliche Lösung besteht darin, die Funktionen in separate Dateien zu zerlegen und sie als Modul zu packen. Dann können Sie das Modul einfach in das Hauptskript importieren.
Sie haben zwar eine Anzahl von .ps1-Dateien, aber es macht die Verwaltung (und das Testen) jeder einzelnen Funktion viel einfacher.
Webcast, wie man das macht (etwa 1/2 in):
[http://powershell.com/cs/media/p/8773.aspx] [1]
[1]: Ссылка
Es enthält auch ein praktisches Modul zum Erstellen von Modulen.
Tags und Links powershell function