我希望有一个数组,其中包含一组可以迭代并调用的函数。问题在于所有功能都通过将它们添加到数组的行(即$ scripts)运行。
示例:
function Hello
{
$BadFunction = "Hello"
Write-Host "Hello!"
}
function HowAreYou
{
$BadFunction = "HowAreYou"
Write-Host "How are you?"
#$false = $true
}
function Goodbye
{
$BadFunction = "Goodbye"
Write-Host "Goodbye!"
}
$scripts = @((Hello), (HowAreYou), (Goodbye))
foreach ($script in $scripts)
{
$script
}
答案 0 :(得分:3)
只能使用函数名称来调用函数,而不能引用它们,但是可以通过Function:
驱动器获取脚本块:
$scripts = $Function:Hello, $Function:HowAreYou, $Function:GoodBye
# call them with the & operator
$scripts | ForEach-Object { & $_ }
# You can also call them by calling Invoke on the scriptblock
$scripts | ForEach-Object Invoke
答案 1 :(得分:0)
Joey's answer包含了不错的信息,但是如果您只需要通过 name 引用函数,将数组定义为包含函数名称为 strings ,然后使用&
, the call operator 通过这些字符串调用函数:
function Hello { "Hello!" }
function HowAreYou { "How are you?" }
function Goodbye { "Goodbye!" }
# The array of function names *as strings*.
# Note that you don't need @(...) to create an array.
$funcs = 'Hello', 'HowAreYou', 'Goodbye'
foreach ($func in $funcs)
{
# Use & to call the function by the name stored in a variable.
& $func
}
问题在于所有函数都通过将它们添加到数组的行(即$ scripts)运行。
那是因为您的数组元素是表达式(由于包含(...)
,所以它们会调用函数(例如(Hello)
调用 Hello
,并将其输出作为数组元素),前提是被引用的没有单引号或双引号。>
与bash
不同,您不能将 string 数组元素定义为 barewords (令牌而不包含单引号或双引号);例如,以下是PowerShell中的语法错误:
# !! Does NOT work - strings must be quoted.
$funcs = Hello, HowAreYou, GoodBye # ditto with @(...)