Инкапсуляция функций Powershell - PullRequest
0 голосов
/ 12 января 2020

Я не знаю, как выполнить следующую задачу. Как и в случае с членами класса в OOP, нам разрешено скрывать реализацию с помощью частного модификатора. Моя цель - создать базовую функцию powershell, которая содержит logi c, которая используется несколькими функциями для повторного использования кода, скрывая эту функцию от глобального доступа. Согласно следующей ссылке https://ss64.com/ps/syntax-scopes.html доступны следующие области действия: Глобальная, Сценарий и Личная. Моя маркировка функций не дает желаемого результата. Эккапсулированная функция должна работать, как показано ниже.

function Invoke-VMDoSomething {
    Invoke-PrivateMiniFunc
}

function Invoke-VMDoSomethingElse {
    Invoke-PrivateMiniFunc
}

function Invoke-PrivateMiniFunc {
    ###BaseReuseable code
}

Гипотетическая командная строка

PS > Invoke-VMDoSomething <<<Invoke-PrivateMiniFunc Executes successfully

PS > Invoke-VMDoSomethingElse <<<Invoke-PrivateMiniFunc Executes successfully 

PS > Invoke-PrivateMiniFunc <<<Fails Cannot find Such Commandlet -- Desired result.

Как я могу реализовать это соглашение и нужно ли сохранять функции в файле .psm1? файл ps1? Это вообще возможно?

1 Ответ

1 голос
/ 12 января 2020

Может быть, не совсем то, что вам нужно, но вы можете скрыть функции внутри модуля.

В вашем случае создайте новый файл и сохраните его как * .psm1 (для демонстрации я называю его InvokeModule.psm1 )

function Invoke-VMDoSomething {
    Invoke-PrivateMiniFunc
}

function Invoke-VMDoSomethingElse {
    Invoke-PrivateMiniFunc
}

function Invoke-PrivateMiniFunc {
    Write-Host "Called by: $((Get-PSCallStack)[1].FunctionName)" 
}

# export the functions you want to make available and leave out 
# the functions you want to keep hidden (but available to the functions in the module)

Export-ModuleMember -Function Invoke-VMDoSomething, Invoke-VMDoSomethingElse

Последняя команда Export-ModuleMember определяет, какие функции вы хотите использовать, а какие нет.

Далее, в другом файле импортируйте этот модуль.

Там, только экспортируемые функции являются видимыми / вызываемыми, но Invoke-PrivateMiniFunc не является:

Import-Module 'D:\InvokeModule.psm1'

Invoke-VMDoSomething      # works as expected

Invoke-VMDoSomethingElse  # works as expected

Invoke-PrivateMiniFunc    # errors out

Результат:

Called by: Invoke-VMDoSomething
Called by: Invoke-VMDoSomethingElse
Invoke-PrivateMiniFunc : The term 'Invoke-PrivateMiniFunc' is not recognized as the name of a cmdlet, 
function, script file, or operable program. Check the spelling of the name, or if a path was included, 
verify that the path is correct and try again.
At line:7 char:1
+ Invoke-PrivateMiniFunc
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Invoke-PrivateMiniFunc:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...