Ich habe eine .ps1-Datei, in der ich benutzerdefinierte Funktionen definieren möchte.
Stellen Sie sich vor, die Datei heißt MyFunctions.ps1 und der Inhalt lautet wie folgt:
Write-Host "Installing functions"
function A1
{
Write-Host "A1 is running!"
}
Write-Host "Done"
Um dieses Skript auszuführen und die A1-Funktion theoretisch zu registrieren, navigiere ich zu dem Ordner, in dem sich die .ps1-Datei befindet, und führe die Datei aus:
.\MyFunctions.ps1
Dies gibt aus:
Installing functions
Done
Wenn ich jedoch versuche, A1 aufzurufen, wird einfach die Fehlermeldung angezeigt, dass es keinen Befehl / keine Funktion mit diesem Namen gibt:
The term 'A1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:3
+ A1 <<<<
+ CategoryInfo : ObjectNotFound: (A1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Ich muss einige PowerShell-Konzepte falsch verstehen. Kann ich keine Funktionen in Skriptdateien definieren?
Beachten Sie, dass ich meine Ausführungsrichtlinie bereits auf 'RemoteSigned' festgelegt habe. Und ich weiß, dass .ps1-Dateien mit einem Punkt vor dem Dateinamen ausgeführt werden :. \ MyFile.ps1
quelle
Antworten:
Versuchen Sie dies in der PowerShell-Befehlszeile:
Der Punktoperator wird für das Skript-Include verwendet.
quelle
. "$PSScriptRoot\MyFunctions.ps1"
. Verfügbar ab Version 3, vorher siehe stackoverflow.com/questions/3667238/… . Es ist sehr gängig.Sie sprechen von Dot Sourcing . Und es ist böse. Aber keine Sorge, es gibt eine bessere und einfachere Möglichkeit, mit Modulen das zu tun, was Sie wollen (es klingt viel beängstigender als es ist). Der Hauptvorteil der Verwendung von Modulen besteht darin, dass Sie sie bei Bedarf aus der Shell entladen können und die Variablen in den Funktionen nicht in die Shell eindringen können (versuchen Sie, eine der Variablen von a aufzurufen, sobald Sie eine Funktionsdatei als Punktquelle erstellt haben) Funktion in der Shell, und Sie werden sehen, was ich meine).
Benennen Sie also zuerst die .ps1-Datei mit all Ihren Funktionen in MyFunctions.psm1 um (Sie haben gerade ein Modul erstellt!). Damit ein Modul ordnungsgemäß geladen werden kann, müssen Sie einige bestimmte Dinge mit der Datei tun. Damit Import-Module das Modul sehen kann (Sie verwenden dieses Cmdlet, um das Modul in die Shell zu laden), muss es sich an einer bestimmten Stelle befinden. Der Standardpfad zum Modulordner lautet $ home \ Documents \ WindowsPowerShell \ Modules.
Erstellen Sie in diesem Ordner einen Ordner mit dem Namen MyFunctions und legen Sie die Datei MyFunctions.psm1 darin ab (die Moduldatei muss sich in einem Ordner mit genau demselben Namen wie die PSM1-Datei befinden).
Öffnen Sie anschließend PowerShell und führen Sie den folgenden Befehl aus:
Wenn Sie eine mit dem Namen MyFunctions sehen, haben Sie es richtig gemacht und Ihr Modul kann geladen werden (dies dient nur dazu, sicherzustellen, dass dies richtig eingerichtet ist. Sie müssen dies nur einmal tun).
Um das Modul zu verwenden, geben Sie Folgendes in die Shell ein (oder fügen Sie diese Zeile in Ihr $ -Profil ein oder fügen Sie dies als erste Zeile in ein Skript ein):
Sie können jetzt Ihre Funktionen ausführen. Das Coole daran ist, dass Sie, sobald Sie 10-15 Funktionen haben, den Namen eines Paares vergessen werden. Wenn Sie sie in einem Modul haben, können Sie den folgenden Befehl ausführen, um eine Liste aller Funktionen in Ihrem Modul abzurufen:
Es ist ziemlich süß und der kleine Aufwand, der erforderlich ist, um sich auf der Vorderseite einzurichten, ist es auf jeden Fall wert.
quelle
Import-Module .\buildsystem\PSUtils.psm1
.
mit zu ändernImport-Module
und die Erweiterung umzubenennen , und nicht erfordert, dass die Module in einem bestimmten Ordner abgelegt werden, dh ich kann es in jedem gewünschten Verzeichnis haben, genau wie beim Dot Sourcing Gibt es einen Grund, Dot Sourcing über Module durchzuführen, wenn man die Vorteile des Scoping berücksichtigt? (es sei denn natürlich, dieser Bereich "Probleme" ist, was Sie wollen). "$PSScriptRoot\MyFunctions.ps1" MyA1Func
Verfügbar ab Version 3, vorher siehe Wie kann ich den Dateisystemspeicherort eines PowerShell-Skripts abrufen ? . Es ist sehr gängig.
PS Ich abonniere nicht die Regel "Alles ist ein Modul". Meine Skripte werden von anderen Entwicklern außerhalb von GIT verwendet, daher möchte ich keine Inhalte an einem bestimmten Ort ablegen oder Systemumgebungsvariablen ändern, bevor mein Skript ausgeführt wird. Es ist nur ein Skript (oder zwei oder drei).
quelle
Get-Command -Module FluentMigrator.PowerShell
ist ganz nett?Sie können sicherlich Funktionen in Skriptdateien definieren (ich neige dann dazu, sie beim Laden über mein Powershell-Profil zu laden).
Zuerst müssen Sie überprüfen, ob die Funktion geladen ist, indem Sie Folgendes ausführen:
Und überprüfen Sie, ob es in der Liste erscheint (sollte eine Liste von 1 sein!), Dann teilen Sie uns mit, welche Ausgabe Sie erhalten!
quelle
Sie können folgende Funktionen hinzufügen:
Und die Funktion wird verfügbar sein.
quelle
Wenn Ihre Datei nur eine Hauptfunktion hat, die Sie aufrufen / verfügbar machen möchten, können Sie die Datei auch einfach starten mit:
Sie können es dann zB wie folgt nennen:
Dies macht es viel bequemer, wenn Sie einfach nur diese Funktion aufrufen möchten, ohne die Funktion importieren zu müssen.
quelle
[CmdletBinding()]
Attribut automatisch hinzufügt und es kostenlos zu einer erweiterten Funktion aktualisiert. :-)Angenommen, Sie haben eine Moduldatei namens Dummy-Name.psm1 mit einer Methode namens Function-Dumb ()
quelle