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

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

Imaginez le fichier est appelé MyFunctions.ps1, et le contenu est comme suit:

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 vers le dossier dans lequel le .ps1 fichier réside et exécute le fichier:

.MyFunctions.ps1

Ce sorties:

Installing functions
Done

pourtant, quand j'essaie D'appeler A1, j'obtiens tout simplement l'erreur indiquant qu'il n'y a pas de commande/FONCTION sous 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 PowerShell concepts. Puis-je définir des fonctions dans des fichiers de script?

Note que j'ai déjà fixé ma politique d'exécution à "RemoteSigned". Et je sais à exécuter .ps1 fichiers en utilisant un point devant le nom de fichier: .myFile.ps1

177
demandé sur Peter Mortensen 2011-05-16 15:04:50

7 réponses

essayez ceci sur la ligne de commande PowerShell:

. .\MyFunctions.ps1
A1

l'opérateur dot est utilisé pour script include.

196
répondu rsc 2014-12-27 13:44:13

Ce dont vous parlez s'appelle point approvisionnement . Et c'est mal. Mais pas de soucis, il y a une façon meilleure et plus facile de faire ce que vous voulez avec modules (cela sonne bien plus effrayant que cela ne l'est). Le principal avantage de l'utilisation de modules est que vous pouvez les décharger du shell si vous en avez besoin, et il empêche les variables dans les fonctions de s'infiltrer dans le shell (une fois que vous dot source un fichier de fonction, essayez appeler une des variables à partir d'une fonction dans le shell, et vous verrez ce que je veux dire).

donc tout d'abord, renommer le .fichier ps1 qui contient toutes vos fonctions à MyFunctions.psm1 (vous venez de créer un module!). Maintenant, pour qu'un module se charge correctement, vous devez faire des choses spécifiques avec le fichier. D'abord pour l'Import-Module pour voir le module (vous utilisez cette commande pour charger le module dans le shell), il doit être dans un emplacement spécifique. Le chemin par défaut vers le dossier modules est $home\Documents\WindowsPowerShell\Modules.

dans ce dossier, créez un dossier nommé MyFunctions, et placez les MyFunctions.psm1 fichier (le fichier de module doit résider dans un dossier avec exactement le même nom que le PSM1 fichier).

une fois que c'est fait, ouvrez PowerShell, et lancez cette commande:

Get-Module -listavailable

si vous en voyez un appelé MyFunctions, vous l'avez bien fait, et votre module est prêt à être chargé (c'est juste pour s'assurer que c'est bien mis en place, vous n'avez qu'à le faire une seule fois).

pour utiliser le module, tapez ce qui suit dans le shell (ou mettez cette ligne dans votre profil$, ou mettez cette ligne comme première ligne dans un script):

Import-Module MyFunctions

Vous pouvez maintenant exécuter vos fonctions. Le truc cool, c'est qu'une fois que vous avez 10-15 fonctions de là, vous allez oublier le nom d'un couple. Si vous avez dans un module, vous pouvez exécuter la commande suivante pour obtenir une liste de tous les les fonctions de votre module:

Get-Command -module MyFunctions

c'est assez mignon, et le peu d'effort qu'il faut pour s'installer sur le devant en vaut la peine.

178
répondu JoeG 2015-01-10 01:51:11

. "$PSScriptRoot\MyFunctions.ps1" MyA1Func

disponible à partir de v3, avant cela voir Comment puis-je obtenir l'emplacement du système de fichiers D'un script PowerShell? . Il est TRÈS commun.

P.S. Je ne souscris pas à la règle "tout est un module". Mes scripts sont utilisés par d'autres développeurs hors GIT, donc je n'aime pas mettre des trucs dans un endroit spécifique ou modifier des variables d'environnement système avant que mon script ne tourne. C'est juste un script (ou deux, ou trois.)

15
répondu yzorg 2017-05-23 12:34:43

vous pouvez certainement définir des fonctions dans des fichiers de script (j'ai alors tendance à les charger à travers mon profil Powershell).

vous devez d'abord vérifier pour vous assurer que la fonction est chargée en exécutant:

ls function:\ | where { $_.Name -eq "A1"  }

Et vérifiez qu'il apparaît dans la liste (qui devrait être une liste de 1!), alors laissez-nous savoir quelle sortie vous obtenez!

6
répondu Jonny 2011-05-16 11:30:22

vous pouvez ajouter une fonction à:

c:\Users\David\Documents\WindowsPowerShell\profile.ps1

Un la fonction sera disponible.

3
répondu David Morrow 2018-06-16 06:39:11

Si votre fichier n'a qu'une fonction principale que vous voulez l'appeler/exposer, ensuite, vous pouvez aussi lancer le fichier:

Param($Param1)

vous pouvez alors l'appeler par exemple comme suit:

.\MyFunctions.ps1 -Param1 'value1'

cela le rend beaucoup plus pratique si vous voulez appeler facilement juste cette fonction sans avoir à importer la fonction.

2
répondu bergmeister 2017-10-01 22:10:30

en supposant que vous avez un fichier module appelé Dummy-Name.psm1 qui a une méthode appelée Function-Dumb ()

Import-Module "Dummy-Name.psm1";
Get-Command -Module "Function-Dumb";
#
#
Function-Dumb;
0
répondu Bytekoder 2018-10-02 00:17:59