我创建了以下内容以了解变量数组如何传递给函数:
# Define array
[array]$Global:P_sourceHostName = @()
[array]$Global:P_destinationHostName = @()
# Add string values to source array
$global:P_sourceHostName = "ABC"
$global:P_sourceHostName += "DEF"
$global:P_sourceHostName += "GHI"
# add string values to destination array
$global:P_destinationHostName = "zzz"
$global:P_destinationHostName += "yyy"
function test {
Param(
[string]$paramA="",
[string]$paramB=""
)
Write-Host "test function > paramA: $paramA"
Write-Host "test function > paramB: $paramB"
}
$i = 0
# Pass the individual value to a function
test ($Global:P_sourceHostName[$i],$Global:P_destinationHostName[$i])
#Pass the individual value to a function with an additional text
test ("AAA $Global:P_sourceHostName[$i]", "BBB $Global:P_destinationHostName[$i]")
结果是:
test function > paramA: ABC zzz test function > paramB: test function > paramA: AAA ABC DEF GHI[0] BBB zzz yyy[0] test function > paramB:
问题:
test
函数,结果是空白的“paramB”?test
函数,它结合了文本但没有产生正确的数组值?答案 0 :(得分:1)
- 为什么第一次调用
醇>test
函数,结果是空白的“paramB”?
因为数组作为单个参数传递给paramA
。您需要使用splatting将数组元素传递给各个参数。
$params = $global:P_sourceHostName[$i], $global:P_destinationHostName[$i]
test @params
否则使用不同的参数(传递参数而不用逗号):
test $global:P_sourceHostName[$i] $global:P_destinationHostName[$i]
或命名参数:
test -paramA $global:P_sourceHostName[$i] -paramB $global:P_destinationHostName[$i]
- 为什么第二次调用
醇>test
函数,它结合了文本但没有产生正确的数组值?
因为您将变量放在字符串中,而PowerShell只在字符串内部进行简单的变量扩展。索引运算符或点访问等更复杂的内容将被忽略。像这样的表达
$a = 'a', 'b', 'c'
"$a[0]"
有效地成为
$a = 'a', 'b', 'c'
($a -join ' ') + '[0]'
因此输出
a b c[0]