У меня есть большой набор функций, определенных в модуле сценария PowerShell. Я хочу использовать Export-ModuleMember -Function *
, но хочу исключить только одну функцию. Мне будет проще исключить эту одну функцию, чем перечислять все включенные функции. Есть ли способ добиться этого?
Могу ли я исключить одну функцию из Export-ModuleMember?
Ответы (4)
Итак, я знаю, что это слишком поздно для вечеринки, но простое решение состоит в том, чтобы поместить все функции, которые вы не хотите экспортировать, ПОСЛЕ командлета Export-ModuleMember. Любые функции, определенные ПОСЛЕ этого оператора, не будут экспортированы и будут доступны для вашего модуля (так называемые частные функции).
Возможно, более элегантный метод заключается в том, чтобы включить файл определения модуля и просто не включать эту функцию в список включаемых функций.
Идея написания кода внутри модуля, чтобы не включать функции в модуль, кажется чрезмерно сложной, это не новая функция, я размещал функции после экспорта с самых первых дней PowerShell.
Export-ModuleMember -function *
. Если вы явно называете функции в Export-ModuleMember, вы получаете именно то, что указываете.
- person Mike Shepard; 21.09.2020
Мой стандартный ответ об исключении функций состоит в том, чтобы использовать имена глагол-существительное для функций, которые я хочу экспортировать, и использовать начальные заглавные буквы для всего остального.
Затем об этом позаботится Export-ModuleMember -function *-*
.
Найдите все функции в скрипте, а затем отфильтруйте на основе того, что вы хотите исключить (при условии 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, парсер значительно упрощает работу.
Мое решение, использующее 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.