Comment puis-je inclure une localement la fonction définie lors de l'utilisation de PowerShell de la Commande Invoke-command pour l'accès distant?
J'ai l'impression que je suis absent quelque chose qui devrait être évident, mais je ne peux pas comprendre comment le faire.
J'ai un script ps1 qui a une fonction définie en elle. Il appelle la fonction, puis essaie de l'utiliser à distance:
function foo
{
Param([string]$x)
Write-Output $x
}
foo "Hi!"
Invoke-Command -ScriptBlock { foo "Bye!" } -ComputerName someserver.example.com -Credential someuser@example.com
Ce court exemple de script affiche "Bonjour!" et puis se bloque en disant: "Le terme 'foo' n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou d'un programme exécutable."
Je comprends que la fonction n'est pas définie sur le serveur distant, car il n'est pas dans le ScriptBlock. J'ai pu redéfinir là, mais je préfère ne pas. J'aimerais définir la fonction une fois et l'utiliser localement ou à distance. Est-il une bonne façon de le faire?
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour passer à la fonction elle-même (pas un appel à la fonction dans le
ScriptBlock
).J'ai eu le même besoin, la semaine dernière, et a trouvé cette SORTE de discussion
Votre code deviendra donc:
Noter qu'en utilisant cette méthode, vous ne pouvez passer des paramètres en fonction de votre position; vous ne pouvez pas faire usage de paramètres nommés comme vous avez pu lors de l'exécution de la fonction localement.
-ScriptBlock {$function:foo|format-table -auto}
. Fondamentalement, touteScriptBlock
peut y avoir de "gros morceau" de valable code PowerShell, tant et aussi longtemps que vous le formater correctement (ou utiliser des points-virgules à la fin de chaque "ligne"), vous devriez être bon. Plus tôt aujourd'hui, j'ai été curage autour avec " mesure-commande {$x=[xml](get-content file.xml);$x.selectsinglenode("//chose");}, par exemple.Vous pouvez passer à la définition de la fonction en tant que paramètre, puis redéfinir la fonction sur le serveur distant par la création d'un scriptblock et puis dot-sourcing il:
Ceci élimine le besoin d'avoir une copie de votre fonction. Vous pouvez également passer plus d'une fonction de cette manière, si vous êtes si incliné:
$Using:Var
a fait le tour 🙂 Merci beaucoup!Vous pouvez aussi mettre les fonction(s) ainsi que le script dans un fichier (foo.ps1) et de l'Appeler-Commande à l'aide du Chemin d'accès du fichier de paramètre:
Le fichier sera copié sur les ordinateurs distants et exécuté.
Bien que c'est une vieille question que je voudrais ajouter ma solution.
Assez drôle, le param liste des scriptblock au sein de la fonction test, ne prenez pas un argument de type [scriptblock] et à cet effet, les besoins de conversion.
Une autre possibilité est de passer d'une table de hachage pour notre scriptblock contenant toutes les méthodes que vous souhaitez avoir à disposition dans la session à distance: