Добавьте функцию PowerShell в родительскую область - PullRequest
5 голосов
/ 26 апреля 2011

У меня есть несколько вспомогательных функций PowerShell в файле.Я хотел бы сделать их доступными для области действия другого файла, который я пишу, но не загрязняю глобальную область.

Helpers.ps1

function global:Helper1
{
    # this function pollutes the global scope
}
function Helper2
{
    # this function is not visible to the Utility.ps1 file.
}

Utilities.ps1

&{
    ./Helpers.ps1
    function global:Utility1
    {
        Helper1
    }
    function global:Utility2
    {
        Helper2
    }
}

Я нашел этот вопрос: Как динамически создавать функции, доступные в родительской области? , но ответы обсуждают добавление функций в глобальную область.То, что я действительно хочу сделать, это сделать функции Helper из одного файла PS1 доступными для вызывающего файла PS1, без , не загрязняющего глобальную область с помощью помощников.

Я хочу избежать определения функцийв качестве переменных, что возможно с помощью Set-Variable и параметра -Scope.Самое близкое, что я видел (из связанной ветки) - это использование Set-Item в функции: drive.

Любая помощь будет принята!

Редактировать: вот решениерасширен от ответа Майкасодержание в области действия служебной функции.Помещение Helpers.ps1 за пределы функции Utility приводит к тому, что он находится в области & {...}, но эта область заканчивается после определения функций.

Ответы [ 2 ]

6 голосов
/ 09 июня 2011

Вы можете использовать этот фрагмент в файле Utilities.ps1. Что мы делаем, так это получаем все текущие функции, затем ставим точки помощникам. Затем мы проводим различие между функциями до и после. Из diff мы воссоздаем функции в глобальной области видимости.

$beforeFunctions = ls function:
. .\helpers.ps1
$afterFunctions = ls function:
$functionDiff = @(Compare-Object $beforeFunctions $afterFunctions)
foreach($diffEntry in $functionDiff){
    $func = $diffEntry.InputObject
    invoke-expression "function global:$($func.Name) { $($func.definition) }"
}
5 голосов
/ 27 апреля 2011

Если вы укажете точечный источник файла .ps1 в функции, определения, содержащиеся в файле ps1, не будут глобальными, если только сама функция не была получена из точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...