Comment puis-je créer un PowerShell “principal” de la fonction?
J'ai utilisé de nombreux langages de scripts dans le passé, et je suis en train d'apprendre PowerShell. Dans ces autres langues en général, je définir mon principal logique avant de définir mes fonctions, de sorte que quelqu'un qui lit le code va se concentrer sur le principal de la logique de la première. Souvent, cela prend la forme de la création d'une "main" de classe ou de fonction en haut du fichier, et en invoquant le bas.
Dans PowerShell, ce motif pourrait ressembler à ceci:
$main = {
...
do-something
...
}
function do-something() {
<function definition here>
}
& $main
Cela fonctionne bien, mais je veux maintenant de tirer parti de PowerShell est la capacité d'exécuter du code à distance. Depuis $main
est une PowerShell ScriptBlock
objet, j' [pense que j'] peut exécuter du code sur une machine distante comme ceci:
Invoke-Command -ScriptBlock $main -ComputerName whatever;
Cependant, la machine distante ne sait rien sur ma fonction, puisqu'il est défini en dehors de la portée de $main
. Je peux, bien sûr, déplacer la définition de la fonction dans $, mais puis-je le mettre au-dessus de la logique et je suis de retour à mon premier problème.
Est-il un modèle commun pour l'écriture de scripts PowerShell où la logique principale est dans une fonction ou un bloc de script en haut du fichier, comme dans beaucoup de langues traditionnelles? Comment écrire des scripts complexes -- ont-ils toujours juste écrire de haut en bas, en répandant dans les fonctions nécessaires au top?
Quelqu'un a marqué ce en tant que double de la question Pourquoi ai-je besoin d'avoir mes fonctions écrites en premier dans mon script Powershell?. Ce n'est pas un doublon. Je sais pourquoi fonctions doivent être définies d'abord, j'ai été de programmation comme C était la fraîcheur de la nouvelle langue.
Ce que je demande, c'est le motif pour le faire dans poweshell, en particulier dans le contexte de vouloir être en mesure d'exécuter le code principal à distance.
Est-il un modèle commun pour mettre un main
bloc en haut d'un script powershell? Powershell syntaxe et les expressions idiomatiques sont assez différents de plus de langues traditionnelles, et même de nombreux populaire moderne, les langages de script, que le motif de déplacement de la logique principale vers le haut n'est pas évident (ou c'est peut-être, mais je n'en ai pas trouvé les bons exemples ou de la documentation)
Je ne crois pas que c'est un doublon, je sais pourquoi fonctions doivent être déclarées en premier. Au lieu de cela, je me demande pour le commun des idiomes de le faire en powershell, où "principal" est apparemment un concept étranger, et tout en préservant la possibilité d'invoquer le code sur une machine distante. Aucune des réponses à cette question sont adaptés réponses à cette question. J'ai édité ma réponse nous l'espérons, pour clarifier, si cette question a été répondu il y a quelques années.
OriginalL'auteur Bryan Oakley | 2014-01-08
Vous devez vous connecter pour publier un commentaire.
Scripts sont lues à partir du haut vers le bas, de sorte que vous ne pouvez pas utiliser toutes les références avant qu'ils ne soient lancés. Vous pouvez toutefois créer un script/scriptblock qui simule la façon dont les langages de programmation le travail.
Dans des langages de programmation comme le c#, le
main
partie est une fonction. Lorsque l'application est terminée chargement les pièces nécessaires(comme les fonctions de base, etc.), et de gestionnaire d'événement appelle la fonction main pour faire la fête. Avec l'approche ci-dessous, vous permettrait de simuler le même comportement.Invoke-Command avec un bloc de script
Pour l'utiliser avec
invoke-command
, enroulez simplement l'exemple ci-dessus, à l'intérieur d'un nouveau scriptblock et l'utiliser.Invoke-Command avec un fichier
Ou l'enregistrer dans un fichier, et de l'appeler de cette façon.
Script.ps1
Utilisation:
Tout simplement parce que la plupart des gens ne se soucient pas de l'ordre, je suppose. C'est le plus logique est de lire le code comme powershell lire: de haut en bas. De déclarer des fonctions plus tôt que prévu et les appeler à la fin comme je l'ai fait avec le point d'entrée. Il est plus facile de comprendre ce qui a déjà été déclarée, et ce qui ne l'est pas. Surtout quand il s'agit de débogage 🙂 Aussi, de nombreux scripts sont simples et n'ont pas besoin de beaucoup de structure. Le moment où vous avez besoin pour créer un tas de fonctions, vous devez envisager de créer un module à la place et créer un petit script qui utilise votre module-fonctions/-les applets de commande.
La même idée a été suggérée dans Pourquoi ai-je besoin d'avoir mes fonctions écrites en premier dans mon script Powershell?
OriginalL'auteur Frode F.
Si vous souhaitez émuler le "traditionnel" de la structure en PowerShell, une façon de le faire est d'utiliser la
Commencer
,Processus
etFin
mots-clés.Celles-ci peuvent apparaître dans n'importe quel ordre dans le script, mais le
Begin
bloc sera toujours exécuté en premier, de sorte que vous pouvez placer en bas de votre script, et de mettre vos définitions de fonction il y, et vous avez votre logique principale en haut du script dans unProcess
ouEnd
bloc.OriginalL'auteur mjolinor
Personnellement, je préfère le passage d'un
ScriptBlock
à un ordinateur distant à l'aide deInvoke-Command
. Cela étant dit, il est parfaitement valable pour écrire un "départ-arrivée" fichier de script, qui effectue des missions locales et de la déployer au niveau local (et/ou à distance), les ordinateurs à l'aide de la-File
paramètre pourInvoke-Command
.Cet exemple de code va générer dynamiquement un fichier de script PowerShell, et de la déployer sur les systèmes cible. De cette façon, vous n'avez pas à gérer manuellement plusieurs fichiers de script:
...
Si vous êtes comme moi et que vous préférez utiliser un
ScriptBlock
, puis le tout le contenu de votre script doit être contenue à l'intérieur de laScriptBlock
, avant de le déployer avecInvoke-Command
.Voici un exemple:
Sortie
La sortie de la commande ci-dessus ressemblerait à ceci:
OriginalL'auteur Trevor Sullivan
Autant que je sache, il n'y a pas moyen de définir des sous-routines après le code principal dans un fichier de script (
.ps1
), parce que le code est traité de manière séquentielle, et si vous appelez une fonction avant qu'il est défini, vous obtiendrez une erreur.Subfunctions
Si vous souhaitez l'organiser de sorte que c'est plus clair qui sont les parties les code principal et dont les pièces sont des sous-routines, vous peut de déclarer des fonctions à l'intérieur d'une fonction (qui sont aussi étendues à la fonction), mais ils ont besoin de venir au début, de sorte qu'ils sont définis avant qu'ils ne soient appelés par le code principal:
Modules
Le seul moyen que je connaisse pour avoir les sous-programmes apparaissent après la fonction principale est d'utiliser un Module PowerShell. Lorsque vous importez le module, toutes les fonctions définies par celle-ci sont importés, avant que tout le code est exécuté.
Ainsi, lorsque vous exécutez la fonction principale de tous les sous-programmes sont déjà définis.
Modules De Fond
Dans le cas où vous n'êtes pas familier avec les modules, c'est assez simple. Il suffit de mettre tout le code dans un
.psm1
fichier (il ne doit pas contenir uniquement des définitions de fonction, mais de tout autre code est exécuté lorsque le module est importé). Puis l'importer dans la session avec(Notez que vous devez ajouter le
-Force
commutateur afin de les réimporter dans la même session.)Modules en cours d'exécution à distance
Si vous voulez l'exécuter à distance, cela devrait fonctionner:
OriginalL'auteur Adi Inbar