J'ai un fichier .ps1 dans lequel je souhaite définir des fonctions personnalisées.
Imaginez que le fichier s'appelle MyFunctions.ps1 et que le contenu est le suivant:
Write-Host "Installing functions"
function A1
{
Write-Host "A1 is running!"
}
Write-Host "Done"
Pour exécuter ce script et enregistrer théoriquement la fonction A1, je navigue jusqu'au dossier dans lequel réside le fichier .ps1 et exécute le fichier:
.\MyFunctions.ps1
Cela produit:
Installing functions
Done
Pourtant, lorsque j'essaie d'appeler A1, j'obtiens simplement l'erreur indiquant qu'il n'y a pas de commande / fonction de ce nom:
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
Je dois mal comprendre certains concepts PowerShell. Puis-je ne pas définir de fonctions dans les fichiers de script?
Notez que j'ai déjà défini ma stratégie d'exécution sur «RemoteSigned». Et je sais exécuter des fichiers .ps1 en utilisant un point devant le nom de fichier:. \ MyFile.ps1
la source
Réponses:
Essayez ceci sur la ligne de commande PowerShell:
L'opérateur point est utilisé pour l'inclusion de script.
la source
. "$PSScriptRoot\MyFunctions.ps1"
. Disponible à partir de la v3, avant cela, voir stackoverflow.com/questions/3667238/… . C'est TRÈS commun.Ce dont vous parlez est appelé dot sourcing . Et c'est mal. Mais ne vous inquiétez pas, il existe un moyen meilleur et plus facile de faire ce que vous voulez avec des modules (cela semble beaucoup plus effrayant qu'il ne l'est). Le principal avantage de l'utilisation des modules est que vous pouvez les décharger du shell si vous en avez besoin, et cela empêche les variables dans les fonctions de se glisser dans le shell (une fois que vous sourcez un fichier de fonction, essayez d'appeler l'une des variables à partir d'un fonctionner dans le shell, et vous verrez ce que je veux dire).
Donc, tout d'abord, renommez le fichier .ps1 qui contient toutes vos fonctions en MyFunctions.psm1 (vous venez de créer un module!). Maintenant, pour qu'un module se charge correctement, vous devez faire certaines choses spécifiques avec le fichier. Tout d'abord pour Import-Module pour voir le module (vous utilisez cette applet de commande pour charger le module dans le shell), il doit être dans un emplacement spécifique. Le chemin par défaut vers le dossier des modules est $ home \ Documents \ WindowsPowerShell \ Modules.
Dans ce dossier, créez un dossier nommé MyFunctions et placez-y le fichier MyFunctions.psm1 (le fichier de module doit résider dans un dossier portant exactement le même nom que le fichier PSM1).
Une fois cela fait, ouvrez PowerShell et exécutez cette commande:
Si vous en voyez un appelé MyFunctions, vous l'avez bien fait, et votre module est prêt à être chargé (c'est juste pour vous assurer qu'il est bien configuré, vous ne devez le faire qu'une seule fois).
Pour utiliser le module, tapez ce qui suit dans le shell (ou placez cette ligne dans votre profil $, ou mettez-la comme première ligne dans un script):
Vous pouvez maintenant exécuter vos fonctions. La chose intéressante à ce sujet est qu'une fois que vous avez 10 à 15 fonctions, vous allez oublier le nom d'un couple. Si vous les avez dans un module, vous pouvez exécuter la commande suivante pour obtenir une liste de toutes les fonctions de votre module:
C'est assez doux, et le petit effort qu'il faut pour mettre en place sur la face avant en vaut vraiment la peine.
la source
Import-Module .\buildsystem\PSUtils.psm1
.
avecImport-Module
et renommer l'extension, et ne nécessite pas que les modules soient placés dans un dossier spécifique, c'est-à-dire que je peux l'avoir dans n'importe quel répertoire que je veux, tout comme avec le sourcing de points, est Y a-t-il une raison de faire du sourcing par points sur les modules, compte tenu des avantages de la portée? (à moins bien sûr que ces "problèmes" de portée soient ce que vous voulez). "$PSScriptRoot\MyFunctions.ps1" MyA1Func
Disponible à partir de la version 3, avant cela, voir Comment puis-je obtenir l'emplacement du système de fichiers d'un script PowerShell? . C'est TRÈS commun.
PS Je ne souscris pas à la règle "tout est un module". Mes scripts sont utilisés par d'autres développeurs hors de GIT, donc je n'aime pas mettre des choses dans un endroit spécifique ou modifier les variables d'environnement système avant que mon script ne s'exécute. C'est juste un script (ou deux ou trois).
la source
Get-Command -Module FluentMigrator.PowerShell
est assez agréable?Vous pouvez certainement définir des fonctions dans des fichiers de script (j'ai ensuite tendance à les charger via mon profil Powershell lors du chargement).
Vous devez d'abord vérifier que la fonction est chargée en exécutant:
Et vérifiez qu'il apparaît dans la liste (devrait être une liste de 1!), Puis faites-nous savoir quelle sortie vous obtenez!
la source
Vous pouvez ajouter une fonction à:
Une fonction sera disponible.
la source
Si votre fichier n'a qu'une seule fonction principale que vous souhaitez appeler / exposer, vous pouvez également simplement démarrer le fichier avec:
Vous pouvez ensuite l'appeler par exemple comme suit:
Cela le rend beaucoup plus pratique si vous souhaitez appeler facilement cette fonction sans avoir à importer la fonction.
la source
[CmdletBinding()]
attribut et le met à niveau gratuitement vers une fonction avancée. :-)En supposant que vous avez un fichier de module appelé Dummy-Name.psm1 qui a une méthode appelée Function-Dumb ()
la source