在PowerShell数组元素中使用变量

时间:2017-08-22 22:58:33

标签: arrays powershell

如何在数组的字符串元素中添加变量数据?如果我$s.Length,则输出为1而不是2。

$IPAddress = '192.168.1.1'
[string[]]$s = (
    'https://google.com/' + $IPAddress + '/hostname',
    'https://google.com/' + $IPAddress + '/DNS'
)
foreach ($element in $s) {
    Write-Host $element
}

3 个答案:

答案 0 :(得分:2)

由于您定义数组的方式,

$s包含单个字符串。连接运算符(+)比数组构造运算符(,)弱precedence。因为那个声明

'foo' + $v + 'bar', 'foo' + $v + 'baz'

实际上是这样的:

'foo' + $v + @('bar', 'foo') + $v + 'baz'

由于字符串连接操作,数组被分成一个以空格分隔的字符串(分隔符在automatic variable $OFS中定义),结果如下:

'foo' + $v + 'bar foo' + $v + 'baz'

要避免此行为,您需要将连接操作放在分组表达式中:

$s = ('https://google.com/' + $IPAddress + '/hostname'),
     ('https://google.com/' + $IPAddress + '/DNS')

或内联变量(需要双引号字符串):

$s = "https://google.com/${IPAddress}/hostname",
     "https://google.com/${IPAddress}/DNS"

您也可以使用format operator,但这也需要对表达式进行分组:

$s = ('https://google.com/{0}/hostname' -f $IPAddress),
     ('https://google.com/{0}/DNS' -f $IPAddress)

旁注:将变量投射到[string[]]是可选的。即使没有显式强制转换,使用逗号运算符也会为您提供数组。

答案 1 :(得分:1)

完成您尝试的最简单的方法(字符串扩展)是:

$s = "https://google.com/$IPAddress/hostname",
        "https://google.com/$IPAddress/DNS"

通过使用双引号,它将自动展开字符串中的$IPAddress。当变量是字符串时,这最有效,因为更复杂的对象可能无法按预期执行。如果需要以这种方式引用对象的属性,则需要将其包含在$()中,例如"Hello $($User.Name)!"以展开Name对象的$User属性

答案 2 :(得分:1)

TheMadTechnician几秒钟就把它打败了,但如果你更喜欢明确地构造字符串表达式,请将它们包装在parens中:

$IPAddress = '192.168.1.1'
[string[]]$s = (
        ('https://google.com/'+$IPAddress+'/hostname'),
        ('https://google.com/'+$IPAddress+'/DNS'))
foreach ($element in $s) 
{
Write-Host $element
}

parens强制首先评估内部表达式。