我在 .ps1 文件中定义了一些函数,可以通过点运算符 ( . .\script.ps1) 导入它们。之后,我可以在我的 powershell 终端中使用这些功能。如果它是一个模块,我可以使用该gcm -module ...命令从该模块获取所有命令。但这里是一个文件,而不是一个模块。有没有办法列出文件中定义的所有函数?喜欢gcm -file "script.ps1"。
您可以通过查询函数对象的属性 ( .File)来.ScriptBlockSystem.Management.Automation.FunctionInfo间接实现此目的:
仅按脚本文件名匹配:
Get-Command -Type Function |
Where-Object { $_.ScriptBlock.File -like '*[\/]script.ps1' } |
ForEach-Object Name
Run Code Online (Sandbox Code Playgroud)
为了避免歧义,您应该匹配完整的脚本路径,而不仅仅是文件名,例如:
Get-Command -Type Function |
Where-Object { $_.ScriptBlock.File -eq 'C:\path\to\script.ps1' } |
ForEach-Object Name
Run Code Online (Sandbox Code Playgroud)
.File始终将路径报告为文件系统本机路径。如有疑问,请Convert-Path在路径上使用,以便将其转换为文件系统本机路径。Santiago Squarzon指出了您的任务的一个有趣的变化:直接从脚本文件 ( .ps1)获取所有函数的列表,无论脚本是否是点源的(即,无论函数是否(已经)会话中定义):
# Returns the names of all functions defined in specified script
(Get-Command 'C:\path\to\script.ps1').ScriptBlock.Ast.FindAll(
{ $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] },
$false # parameter `searchNestedScriptBlocks`
).Name
Run Code Online (Sandbox Code Playgroud)
也可以看看:
System.Management.Automation.Language.Ast,在 中报告的脚本的AST(抽象语法树)的类.ScriptBlock.Ast是其实例。
圣地亚哥的这个答案展示了反映脚本函数(检查其参数)的更先进的技术。
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |