script - powershell passer un tableau en parametre




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

J'ai un fichier .ps1 dans lequel je veux 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 théoriquement enregistrer la fonction A1, je navigue vers le dossier dans lequel réside le fichier .ps1 et exécute le fichier:

.\MyFunctions.ps1

Cela produit:

Installing functions
Done

Pourtant, quand j'essaye d'appeler A1, j'obtiens simplement l'erreur indiquant qu'il n'y a aucune commande / fonction par 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. Est-ce que je ne peux 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


Ce dont vous parlez s'appelle dot sourcing . Et c'est diabolique. Mais pas de soucis, il existe un moyen meilleur et plus simple de faire ce que vous voulez avec les modules (cela semble bien plus effrayant que ça ne l'est). Le principal avantage de l'utilisation des modules est que vous pouvez les décharger du shell si nécessaire, et cela empêche les variables dans les fonctions de se glisser dans le shell (une fois que vous dotez un fichier de fonction, essayez d'appeler une des variables d'un fonctionner dans la coquille, et vous verrez ce que je veux dire).

Donc d'abord, renommez le fichier .ps1 qui contient toutes vos fonctions dans 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 que Import-Module voit 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 d'accès par défaut au 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 du module doit se trouver dans un dossier portant exactement le même nom que le fichier PSM1).

Une fois cela fait, ouvrez PowerShell et exécutez 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 configuré, vous n'avez qu'à le faire une fois).

Pour utiliser le module, tapez ce qui suit dans le shell (ou placez cette ligne dans votre profil $, ou placez-le en première ligne dans un script):

Import-Module MyFunctions

Vous pouvez maintenant exécuter vos fonctions. Ce qui est cool, c'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:

Get-Command -module MyFunctions

C'est assez gentil, et le petit effort qu'il faut pour mettre en place sur le devant est ça vaut le coup.


Essayez ceci sur la ligne de commande PowerShell:

. .\MyFunctions.ps1
A1

L'opérateur de point est utilisé pour l'inclusion de script.


Vous pouvez ajouter une fonction à c: \ Users \ David \ Documents \ WindowsPowerShell \ profile.ps1 La fonction sera disponible.


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

Vous devez d'abord vérifier 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 (devrait être une liste de 1!), Alors laissez-nous savoir quelle sortie vous obtenez!





powershell