所以我很好奇如何从数组中调用函数? 功能示例:
function test($a, $b)
{
write-host $a
write-host $b
}
数组
$testArray = @{"test";"testA";"testB"}
我想要工作的是
$testArray[0] $testArray[1] $testArray[2]
基本上模仿这个
test "testA" "testB"
原因是我有一些像这样的数组和一个循环,它将通过对每个数组中的数据使用自定义函数调用来遍历每个数组。 基本上尝试不同的编程风格。
答案 0 :(得分:1)
好吧,听起来你说有一系列阵列是诚实的,所以我们会坚持下去。然后让我们引用this SO question,它非常类似于你的问题,并从中拿走整个[scriptblock]::create()
的东西,然后展开数组。从那以后我们可以拿出这个脚本:
function test($a, $b)
{
Write-Host "Function 'test'"
write-host $a
write-host $b
}
function test2($a, $b)
{
Write-Host "Function 'test2'"
write-host $b
write-host $a
}
$TestArray = @() #the correct way to create an array, instead of a broken HashTable
$testArray = @("test","testA","testB"),@("test2","testC","testD")
ForEach($Test in $TestArray){
$script = [scriptblock]::Create($test[0]+" @Args")
$script.Invoke($test[1..$test.count])
}
如果您只拥有一个数组,而不是数组数组,那么我想这很简单。你可以这样做:
$testArray = @("test","testA","testB")
$script = [scriptblock]::Create($testArray[0]+" @Args")
$script.Invoke($testArray[1..$testArray.count])
编辑(捕获):好的,要捕获函数的结果,您应该能够在$Variable =
前面加上它,并且好好去,例如:
$MyResults = $script.Invoke($testArray[1..$testArray.count])
这将捕获函数给出的任何输出。现在,由于我们一直使用的函数只执行Write-Host
,它们实际上根本不输出任何内容,它们只是将文本打印到屏幕上。为此,我会稍微修改一下这个函数,以获得可用的实际输出。在此示例中,该函数将2个参数作为输入,并创建一个新对象,并将这2个参数作为属性分配给它。该对象是输出。
function test($a, $b)
{
New-Object PSObject -Property @{Value1=$a;Value2=$b}
}
$testArray = @("test","testA","testB")
$script = [scriptblock]::Create($testArray[0]+" @Args")
$MyResults = $script.Invoke($testArray[1..$testArray.count])
现在,如果你运行它,你最终会得到一个变量$MyResults
是一个PSCustomObject,它有2个名为Value1
和Value2
的属性。 Value1将包含字符串“testA”,Value2将包含字符串“testB”。传递给该函数的任何一对字符串都将输出1个具有2个属性Value1和Value2的对象。因此,之后您可以致电$MyResults.Value1
并返回testA
。