Voici un exemple:
function ChildF() { #Creating new function dynamically $DynFEx = @" function DynF() { "Hello DynF" } "@ Invoke-Expression $DynFEx #Calling in ChildF scope Works DynF } ChildF #Calling in parent scope doesn't. It doesn't exist here DynF
5 Réponses :
Vous pouvez mettre en place la fonction avec le mot-clé global code>:
Dans le code donné ci-dessus, fonction globale: dynf {...} code> a probablement plus de sens. ;-).
Une autre option serait d'utiliser la fonction Utilisation de Set-item -Path: Global: Childfunction -Value {...} code> p>
SET-Item code>, vous pouvez transmettre une chaîne ou un bloc de script à la valeur de la définition de la fonction. P>
Passer un block de script i> à -Value code> fonctionne bien, mais en passant une chaîne i> fait pas i> fonctionne comme prévu: tandis que < Code> Set-item code> l'accepte, appelant la fonction, puis simplement écho i> la chaîne de définition avec les accessoires bouclés dépouillé. Vous pouvez contourner cela avec
& code>, mais c'est gênant et je ne sais pas si elle a des effets secondaires (par exemple,
Fonction d'élément de jeu: FOO "& {'Arg 0:' + code> $ args [0]}
@args "; foo 'hi' code> - mieux utiliser
Invoke-expression code> Si vous devez créer le corps de la fonction dans une chaîne .
Les autres solutions sont de meilleures réponses à la question spécifique. Cela dit, il est bon d'apprendre le moyen le plus général de créer des variables globales: lire "Aide environ_scopes" pour des tonnes Plus d'informations. P> P>
Un moyen plus correct et fonctionnel de le faire serait de renvoyer le corps de fonction sous forme de bloc de script, puis de le recomposer.
function ChildF() { function DynF() { "Hello DynF" } return ${function:DynF} } $DynFEx = ChildF Invoke-Expression -Command "function DynF { $DynFEx }" DynF
Merci à la poste de Richard. Gardé avoir des problèmes de faire cette chose simple. J'ai révisé pour avoir transmis une fonction de local à distance.
#Method 1 Load the function from disk $getCert = gc 'C:\MyScripts\getCert.ps1' Invoke-Command $RemoteSrv -ScriptBlock {Set-Variable -name DefFN -value ($Args -join "`n") -scope global ; Invoke-Expression $DefFn } -ArgumentList $getCert #Method 2 Load the function from local definition of function Invoke-Command $RemoteSrv -ScriptBlock {Set-Variable -name DefFN -value ($Args -join "`n") -scope global ; Invoke-Expression $DefFn } -ArgumentList ('Function GetCert {'+(Get-Command GetCert).Definition+'}') #Remote server now has function Invoke-Command $RemoteSrv -ScriptBlock {getcert stackoverflow.com} URL : stackoverflow.com Expires : 12/14/2021 8:07:08 AM SAN : DNS Name=*.askubuntu.com, DNS Name=..... Thumbprint : ec0055be478411bafe98d11d63a5c9279ff0e173 IP : 151.101.193.69 Handle : 2866249748176 Issuer : CN=R3, O=Let's Encrypt, C=US Subject : CN=*.stackexchange.com