我在 PowerShell 脚本模块中定义了大量函数。我想使用Export-ModuleMember -Function *
,但我只想排除一个功能。排除这一项功能比列出所有包含的功能更容易。有没有办法做到这一点?
4 回答
我关于排除函数的常用答案是对我要导出的函数使用动词名词命名,并对其他所有函数使用首字母大写。
然后,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
}
}
这是我在 v2 中用于创建ISE Function Explorer的技术。但是,我看不出为什么这不适用于 ISE 之外的纯文本。不过,您需要解决插入符号行的详细信息。这只是一个关于如何实现你想要的例子。
现在,过滤不需要的内容并将其传送到Export-ModuleMember
!
$functions | ?{ $_.FunctionName -ne "your-excluded-function" }
如果您使用的是 PowerShell v3,解析器会更容易。
所以我知道这对派对来说已经晚了,但简单的解决方案是将所有你不想导出的函数放在 Export-ModuleMember cmdlet 之后。在该语句之后定义的任何函数都不会被导出,并且将可用于您的模块(也称为私有函数)。
也许更优雅的方法是包含一个模块定义文件,并且根本不将该函数包含在要包含的函数列表中。
在模块中编写代码而不在模块中包含函数的想法似乎过于复杂,这不是一个新功能,自从 PowerShell 早期以来,我一直在 Export 之后放置函数。
正如 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 中引入的。