如果我有一个.ps1文件,其中包含以下函数
function SomeFunction {}
function AnotherFunction {}
我怎样才能得到所有这些函数的列表并调用它们呢?
我想这样做:
$functionsFromFile = Get-ListOfFunctions -Path 'C:\someScript.ps1'
foreach($function in $functionsFromFile)
{
$function.Run() #SomeFunction and AnotherFunction execute
}
5条答案
按热度按时间i7uaboj41#
您可以使用
Get-ChildItem
检索所有函数并将其存储到变量中。然后将脚本加载到运行空间并再次检索所有函数,并使用Where-Object
cmdlet通过排除所有以前检索的函数来筛选所有新函数。最后,迭代所有新函数并调用它们:xjreopfe2#
如果需要使用其他脚本文件中的函数,可以使用**Import-Module**cmdlet导入该函数
·溶液2。*
此脚本包含3个函数。
1.* * Get-ScriptFunctionNames**.返回一个String数组,每个元素为函数名。
2.* * Get-ScriptFunctionDefinitions**.返回一个String数组,每个元素都是完整的函数。
3.* * Get-AmalgamatedScriptFunctionDefinitions**。它只返回一个字符串,即联接函数Get-ScriptFunctionDefinitions返回的所有元素的结果。所有3个字符串都需要相同的参数,即Powershell脚本文件的路径。
我们将在此文件上测试3个函数。
此脚本不使用Import-Module cmdlet。
检查:点源操作员。
Dot Source
ScriptBlock类
将以下内容添加到Main.ps1,我们可以测试3个功能。
控制台输出**
如果您需要在远程计算机上运行powershell命令,请在远程计算机上安装Powershell Core。
内容与解决方案1的脚本相同。
ckocjqey3#
我需要从一个多功能脚本中得到函数的名称。这是我想到的。基于此,也许有人可以提供一个更短的版本。
我想出了一个较短的版本来查找和列出脚本列表中的函数。它并不完美,会有一个问题,因为模式只是单词“Function”,如果这个方法将假设它在任何找到关键字的地方都找到了函数。
为了迭代文件并获得列表,我使用了“Get-ChildItem”函数,并使用递归选项传递了路径和文件过滤器规范。
它通过管道传递到“Select-String”中,并查找“Function”关键字。它不区分大小写,将接受“Function”或“function”。如果需要,可以通过添加“-CaseSensitive”来提供区分大小写的选项。
然后迭代输出以获得实际的函数名。“Line”成员是一个字符串类型,我使用了从位置9开始的“Substring”选项,这是刚刚传递给“function”标识符的长度。
ivqmmu1c4#
事实上,Powershell已经有了方法,为什么还要重新发明轮子呢?我们可以简单地把它做成一个模块:
然后导入模块
现在,获取所有函数
5ssjco0h5#
这是一个一行程序的解决方案,如果有人还在寻找它
说明:
Get-Content "C:\Path\To\File.ps1"
读取指定文件的内容,并将内容作为字符串数组输出。Select-String -Pattern "function\s+([^\s{]+)"
在输入文本中搜索与指定正则表达式模式的匹配项。此模式与关键字function
匹配,关键字function
后跟一个或多个空白字符,关键字function
后跟一个或多个非空白字符,直到左大括号符号,并捕获组中匹配的非空白字符。Foreach-Object { $_.Matches.Groups[1].Value }
循环遍历Select-String
找到的每个匹配项,并使用$_
变量提取第一个捕获组的值(函数名),该变量表示管道中的当前对象。然后将提取的函数名输出到控制台。