Powershell 将范围作为数组传递?

Powershell pass a range as an array?

我正在尝试将范围作为数组传递,这样我就可以 return PowerShell 中的数组:

function iterHostsToArray($arr, $str) {
   $hostz = @()
   $arr | % { $hostz = "$($str)$($_)" }
   return $hostz
}

$skybarHosts = iterHostsToArray((1..2), 'BAR')
$skyboxHosts = iterHostsToArray((1..6), 'BOX')

我期待以下内容:

PS> $skybarHosts
BAR1
BAR2

PS> $skyboxHosts
BOX1
BOX2
BOX3
BOX4
BOX5
BOX6

我正在重构类似这样的东西,它有效:

$skybarHosts = @()
(1..2) | % { $skybarHosts += "HCPNSKYBAR$($_)" }

有两个问题。第一个是 Powershell 中的一个常见陷阱:function definitions 使用逗号分隔参数,但 function calls 使用空格。传递范围和字符串的语法是这样的,

iterHostsToArray (1..2) 'BAR'

另一个问题是 $hostz 数组被覆盖,而不是附加。使用 += 将新元素追加到数组中,

$hostz = @()
$arr | % { $hostz += "$($str)$($_)" }

如评论中所述,如果所有功能都只是创建一个数组,则可以简化一些。当 $arr 传递给 foreach 迭代器且未完成赋值时,输出沿管道传递,函数 returns 对象数组。像这样,

function iterHostsToArray($arr, $str) {
    $arr | % {  "$($str)$($_)" }         
}

当然,如果您想在函数中处理数组内容,则此方法不起作用。那样的话,

function iterHostsToArray($arr, $str) {
    $hostz = $arr | % {  "$($str)$($_)" }
    # Do sutff with $hostz
    # ...

    # finally, either
    return $hostz    
    # or simply
    $hostz 
}