Могу ли я исключить одну функцию из Export-ModuleMember?

У меня есть большой набор функций, определенных в модуле сценария PowerShell. Я хочу использовать Export-ModuleMember -Function *, но хочу исключить только одну функцию. Мне будет проще исключить эту одну функцию, чем перечислять все включенные функции. Есть ли способ добиться этого?


person Anthony Mastrean    schedule 26.06.2012    source источник


Ответы (4)


Итак, я знаю, что это слишком поздно для вечеринки, но простое решение состоит в том, чтобы поместить все функции, которые вы не хотите экспортировать, ПОСЛЕ командлета Export-ModuleMember. Любые функции, определенные ПОСЛЕ этого оператора, не будут экспортированы и будут доступны для вашего модуля (так называемые частные функции).

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

Идея написания кода внутри модуля, чтобы не включать функции в модуль, кажется чрезмерно сложной, это не новая функция, я размещал функции после экспорта с самых первых дней PowerShell.

person Jeff Patton    schedule 15.09.2020
comment
это работает, если вы используете Export-ModuleMember -function *. Если вы явно называете функции в Export-ModuleMember, вы получаете именно то, что указываете. - person Mike Shepard; 21.09.2020
comment
Я понимаю, что вы говорите, что имеет смысл, если вы перечислите только те, которые хотите экспортировать, все в порядке. Я буду честен, поскольку я вернулся к разработке модулей, я вообще не использую этот метод, если есть функция, которую я не хочу экспортировать, она не попадает в список в файле определения; -) Но спасибо за разъяснение! - person Jeff Patton; 22.09.2020

Мой стандартный ответ об исключении функций состоит в том, чтобы использовать имена глагол-существительное для функций, которые я хочу экспортировать, и использовать начальные заглавные буквы для всего остального.

Затем об этом позаботится Export-ModuleMember -function *-*.

person Mike Shepard    schedule 26.06.2012
comment
Простота и условность этого ответа действительно говорят мне! - person Anthony Mastrean; 26.06.2012

Найдите все функции в скрипте, а затем отфильтруйте на основе того, что вы хотите исключить (при условии PowerShell v2):

$errors = $null 
$functions = [system.management.automation.psparser]::Tokenize($psISE.CurrentFile.Editor.Text, [ref]$errors) `
    | ?{(($_.Content -Eq "Function") -or ($_.Content -eq "Filter")) -and $_.Type -eq "Keyword" } `
    | Select-Object @{"Name"="FunctionName"; "Expression"={
        $psISE.CurrentFile.Editor.Select($_.StartLine,$_.EndColumn+1,$_.StartLine,$psISE.CurrentFile.Editor.GetLineLength($_.StartLine))
        $psISE.CurrentFile.Editor.SelectedText
    }
}

Это метод, который я использовал для версии 2 для создания обозревателя функций ISE. Однако я не вижу причин, по которым это не будет работать с обычным текстом за пределами ISE. Однако вам нужно обойти детали линии каретки. Это просто пример того, как добиться желаемого.

Теперь отфильтруйте то, что не требуется, и направьте это на Export-ModuleMember!

$functions | ?{ $_.FunctionName -ne "your-excluded-function" }

Если вы используете PowerShell v3, парсер значительно упрощает работу.

person ravikanth    schedule 26.06.2012

Мое решение, использующее PowerShell V3, как намекнул ravikanth (который использовал V2 в своем решении), состоит в том, чтобы определить модуль PSParser:

Add-Type -Path "${env:ProgramFiles(x86)}\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll"

Function Get-PSFunctionNames([string]$Path) {
    $ast = [System.Management.Automation.Language.Parser]::ParseFile($Path, [ref]$null, [ref]$null)
    $functionDefAsts = $ast.FindAll({ $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] }, $true)
    $functionDefAsts | ForEach-Object { $_.Name }
}

Export-ModuleMember -Function '*'

И в модуле, если я хочу исключить данную функцию, последняя строка будет выглядеть так:

Export-ModuleMember -Function ( (Get-PSFunctionNames $PSCommandPath) | Where { $_ -ne 'MyPrivateFunction' } )

Обратите внимание, что это будет работать только в PowerShell V3 или более поздних версиях, поскольку синтаксический анализатор AST и $PSCommandPath были представлены в версии 3.

person Tahir Hassan    schedule 06.03.2015