在远程端点上使用Set-DnsClientServerAddress的字符串数组地址设置不正确

问题描述 投票:0回答:1

我尝试通过向Invoke-Command传递DNS服务器IP地址的字符串数组作为参数来远程设置DNS服务器地址。

此代码仅设置第一个地址(10.1.1.2)

$dnsIPCollection = @("10.1.1.2", "10.1.1.2")
Invoke-Command -ComputerName $serverNameHere -ScriptBlock { param($dnsIPCollection) Get-DnsClientServerAddress -InterfaceIndex 12 -AddressFamily IPv4 | Set-DnsClientServerAddress -ServerAddresses $dnsIPCollection } -Credential $creds -ArgumentList $dnsIPCollection

现在,如果我尝试以下代码,它将设置两个IP地址

Invoke-Command -ComputerName $serverNameHere -ScriptBlock { Get-DnsClientServerAddress -InterfaceIndex 12 -AddressFamily IPv4 | Set-DnsClientServerAddress -ServerAddresses ("10.1.1.2", "10.1.1.2") } -Credential $creds

如果我从远程服务器执行以下代码,它还会设置两个IP地址

$dnsIPCollection = @("10.1.1.2", "10.1.1.2")
Set-DnsClientServerAddress -ServerAddresses $dnsIPCollection

我不确定这是否是错误或做错了什么。根据ServerAddresses参数documentation,数据类型为String[]

任何人都能分享我的见解吗?

我的$ PSVersionTable输出:

enter image description here

powershell windows-server-2012-r2
1个回答
1
投票

问题是如何将-ArgumentList $dnsIPCollection传递给Invoke-Command-您期望它将整个数组作为单个参数传递,但是PowerShell会将其分解为参数列表。

基本上是这样做的:

PS> $myArgs = @("10.1.1.x", "10.1.1.y")
PS> Invoke-Command -ScriptBlock { param( $p1, $p2 )
    write-host "p1 = '$p1'"
    write-host "p2 = '$p2'"
} -ArgumentList $myArgs

给出输出

p1 = '10.1.1.x'
p2 = '10.1.1.y'

除了您的脚本块仅声明一个参数,因此它仅接收参数数组中的第一个值-您实际上仅将$p1传递到Set-DnsClientServerAddress

如果您希望将数组作为单个参数传递到脚本块中,则需要将其包装在另一个数组中,以便在PowerShell爆炸$p1时,您的数组变为-ArgumentList:>

$myArgs = @("10.1.1.x", "10.1.1.y")
Invoke-Command -ScriptBlock { param( $p1 )
    write-host "p1 = '$p1'"
} -ArgumentList @(, $myArgs )

现在输出:

p1 = '10.1.1.x 10.1.1.y'

希望这会有所帮助-我将把它重新应用到您的原始问题中,作为练习给读者,但如果您被困在其中,请发表评论:-)。

更新

为了说明这一点,原因

PowerShell爆炸了一个有意义的变量名示例,参数可能更明显:
PS> Invoke-Command -ScriptBlock { param( $username, $password )
    write-host "username = '$username'"
    write-host "password = '$password'"
} -ArgumentList @( "myUsername", "myPassword" )

您的仅设置一个IP地址的示例与此几乎相同:

PS> Invoke-Command -ScriptBlock { param( $username )
    write-host "username = '$username'"
} -ArgumentList @( "myUsername", "myPassword" )

然后应该很容易看出为什么未设置第二个IP地址...

© www.soinside.com 2019 - 2024. All rights reserved.