是否有更简单的方法来获取给定Powershell脚本中所有函数的列表,而不是将函数签名与正则表达式匹配(在Powershell中)?
答案 0 :(得分:4)
我想有很多方法。一个不解析文件,很容易:
@"
function mya { write-host mya }
function myb { write-host myb }
Invoke-Expression "function hiddena { write-host by invoke-expression }"
"@ | set-content c:\test1.ps1
$functions = & {
$before = gci function:\
. c:\test1.ps1
$after = gci function:\
Compare-Object $before $after -SyncWindow $before.Length | Select -expand InputObject
}
$functions | ? { $_.Name -match 'a' }
> CommandType Name Definition
> ----------- ---- ----------
> Function hiddena write-host 'by invoke-expression'
> Function mya write-host 'mya'
我创建了一个子范围,我在其中导入了函数,然后简单地比较了添加的内容。整个scriptblock返回您进一步处理的附加功能。
请注意,如果仅使用tokenizer,则无法找到函数hiddena
,因为它包含在普通字符串中。如果您使用例如,也是如此Set-Content function:\testa -value { write-host 'by set-item' }
。
答案 1 :(得分:3)
这是一个使用PowerShell的Tokenizer的版本。不确定它是否更容易。
Using PowerShell’s PsParser::Tokenize, Discover Functions in PowerShell Scripts
答案 2 :(得分:3)
如果您知道包含函数的脚本文件的完整路径,并且会话中已加载了函数:
PS> dir功能:|其中{$ _。scriptblock.file -eq'd:\ functions.ps1'}