Как динамически создавать функции, доступные в родительской области? - PullRequest
6 голосов
/ 14 июля 2009

Вот пример:

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

Мне было интересно, могли бы вы определить DynF таким образом, чтобы он был "видим" вне ChildF.

Ответы [ 4 ]

13 голосов
/ 14 июля 2009

Другой вариант будет использовать Set-Item -Path function:global:ChildFunction -Value {...}

Используя Set-Item, вы можете передать либо строку, либо блок скрипта в значение для определения функции.

8 голосов
/ 14 июля 2009

Вы можете использовать функцию с ключевым словом global:

function global:DynF {...}
6 голосов
/ 15 июля 2009

Другие решения - лучшие ответы на конкретный вопрос. Тем не менее, полезно изучить наиболее общий способ создания глобальных переменных:

# inner scope
Set-Variable -name DynFEx -value 'function DynF() {"Hello DynF"}' -scope global

# somewhere other scope
Invoke-Expression $dynfex
DynF

Прочтите 'help about_Scopes' для получения дополнительной информации.

0 голосов
/ 14 мая 2018

Более правильный и функциональный способ сделать это - вернуть тело функции в виде блока скрипта и затем перекомпоновать его.

function ChildF() {
    function DynF() {
        "Hello DynF"
    }
    return ${function:DynF}
}
$DynFEx = ChildF
Invoke-Expression -Command "function DynF { $DynFEx }"
DynF
...