如何获取 .ps1 文件中定义的所有函数?

Faj*_*iya 4 powershell

我在 .ps1 文件中定义了一些函数,可以通过点运算符 ( . .\script.ps1) 导入它们。之后,我可以在我的 powershell 终端中使用这些功能。如果它是一个模块,我可以使用该gcm -module ...命令从该模块获取所有命令。但这里是一个文件,而不是一个模块。有没有办法列出文件中定义的所有函数?喜欢gcm -file "script.ps1"

mkl*_*nt0 6

您可以通过查询函数对象的属性 ( .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)
    • 请注意,即使您通过仅限 PowerShell 的驱动器对脚本进行点源化,也.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)

也可以看看: