5

我在 PowerShell 脚本模块中定义了大量函数。我想使用Export-ModuleMember -Function *,但我只想排除一个功能。排除这一项功能比列出所有包含的功能更容易。有没有办法做到这一点?

4

4 回答 4

19

我关于排除函数的常用答案是对我要导出的函数使用动词名词命名,并对其他所有函数使用首字母大写。

然后,Export-ModuleMember -function *-*照顾它。

于 2012-06-26T03:52:47.453 回答
5

查找脚本中的所有函数,然后根据要排除的内容进行过滤(假设 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
    }
}

这是我在 v2 中用于创建ISE Function Explorer的技术。但是,我看不出为什么这不适用于 ISE 之外的纯文本。不过,您需要解决插入符号行的详细信息。这只是一个关于如何实现你想要的例子。

现在,过滤不需要的内容并将其传送到Export-ModuleMember

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

如果您使用的是 PowerShell v3,解析器会更容易

于 2012-06-26T03:28:20.337 回答
1

所以我知道这对派对来说已经晚了,但简单的解决方案是将所有你不想导出的函数放在 Export-ModuleMember cmdlet 之后。在该语句之后定义的任何函数都不会被导出,并且将可用于您的模块(也称为私有函数)。

也许更优雅的方法是包含一个模块定义文件,并且根本不将该函数包含在要包含的函数列表中。

在模块中编写代码而不在模块中包含函数的想法似乎过于复杂,这不是一个新功能,自从 PowerShell 早期以来,我一直在 Export 之后放置函数。

于 2020-09-15T22:15:20.220 回答
0

正如 ravikanth(他在他的解决方案中使用 V2)所暗示的,我使用 PowerShell V3 的解决方案是定义一个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 中引入的。

于 2015-03-06T17:04:11.180 回答