312 votes

Dans PowerShell, comment définir une fonction dans un fichier et l'appeler depuis la ligne de commande PowerShell ?

J'ai un fichier .ps1 dans lequel je veux définir des fonctions personnalisées.

Imaginons que le fichier s'appelle MyFunctions.ps1, et que son contenu soit le suivant :

Write-Host "Installing functions"
function A1
{
    Write-Host "A1 is running!"
}
Write-Host "Done"

Pour exécuter ce script et théoriquement enregistrer la fonction A1, je navigue vers le dossier dans lequel réside le fichier .ps1 et j'exécute le fichier :

.\MyFunctions.ps1

Ces sorties :

Installing functions
Done

Pourtant, lorsque j'essaie d'appeler A1, j'obtiens simplement une erreur indiquant qu'il n'existe 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 de PowerShell. Ne puis-je pas définir des fonctions dans les fichiers script ?

Nota que j'ai déjà défini ma politique d'exécution sur 'RemoteSigned'. Et je sais qu'il faut exécuter les fichiers .ps1 en plaçant un point devant le nom du fichier : . \myFile.ps1

0 votes

Bon lien sur le chargement des fonctions au démarrage du PS : sandfeld.net/powershell-load-your-functions-at-startup

6voto

bergmeister Points 504

Si votre fichier n'a qu'une seule fonction principale que vous voulez appeler/exposer, vous pouvez également commencer le fichier avec :

Param($Param1)

Vous pouvez ensuite l'appeler, par exemple, comme suit :

.\MyFunctions.ps1 -Param1 'value1'

Cela est beaucoup plus pratique si vous souhaitez appeler facilement cette fonction sans avoir à importer la fonction.

0 votes

Je dois également noter que j'ai découvert aujourd'hui (après qu'un de mes collègues me l'ait dit) que PowerShell ajoute automatiquement l'élément [CmdletBinding()] et le met gratuitement à niveau vers une fonction avancée :-)

1voto

Bytekoder Points 97

Supposons que vous ayez un fichier de module appelé Dummy-Name.psm1 qui possède une méthode appelée Function-Dumb()

Import-Module "Dummy-Name.psm1";
Get-Command -Module "Function-Dumb";
#
#
Function-Dumb;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X