将数组值传递给函数

时间:2017-10-24 01:00:00

标签: arrays function powershell parameter-passing

我创建了以下内容以了解变量数组如何传递给函数:

# 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:

问题:

  1. 为什么第一次调用test函数,结果是空白的“paramB”?
  2. 为什么第二次调用test函数,它结合了文本但没有产生正确的数组值?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 为什么第一次调用test函数,结果是空白的“paramB”?
  2.   

因为数组作为单个参数传递给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]
  
      
  1. 为什么第二次调用test函数,它结合了文本但没有产生正确的数组值?
  2.   

因为您将变量放在字符串中,而PowerShell只在字符串内部进行简单的变量扩展。索引运算符或点访问等更复杂的内容将被忽略。像这样的表达

$a = 'a', 'b', 'c'
"$a[0]"

有效地成为

$a = 'a', 'b', 'c'
($a -join ' ') + '[0]'

因此输出

a b c[0]