在Powershell中,我能否创建一个函数数组?

4
我希望有一个包含一组函数的数组,我可以迭代并调用这些函数。问题是,所有函数都通过将它们添加到数组(即$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个回答

4

函数只能通过名称进行调用,而不能引用,但是你可以通过 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

你也可以使用 get-command Hello 代替 $function:Hello - Mike Shepard
@MikeShepard 这两个命令执行的操作完全不同。你可能在想 Get-Item -Path Function:\Hello - Maximilian Burszley
2
虽然它们是不同的东西,但它们都可以通过 & 运算符执行(并且可以放置在数组中)。这就是问题的焦点。此外,Get-Command 可以获取函数以外的其他内容(例如内置 cmdlet),因此具有优势。 - Mike Shepard

0

Joey的回答包含了很好的信息,但如果你只需要通过名称引用函数,将你的数组定义为包含函数名称的字符串,并通过这些字符串调用函数使用&,调用运算符

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不同,您不能将“字符串”数组元素定义为“裸字”(没有包含单引号或双引号的标记)。例如,在PowerShell中,以下是“语法错误”。
# !! Does NOT work - strings must be quoted.
$funcs = Hello, HowAreYou, GoodBye # ditto with @(...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接