我可以在Powershell中创建功能数组吗?

时间:2018-11-07 15:57:03

标签: arrays function powershell

我希望有一个数组,其中包含一组可以迭代并调用的函数。问题在于所有功能都通过将它们添加到数组的行(即$ 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
}

2 个答案:

答案 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 @(...)