首页 > 解决方案 > 在字符串数组地址设置不正确的远程端点上使用 Set-DnsClientServerAddress

问题描述

我通过向 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 参数文档,数据类型是String[].

有人可以就我的观察分享一些见解吗?

我的 $PSVersionTable 输出:

在此处输入图像描述

标签: powershellwindows-server-2012-r2

解决方案


问题是你如何传递你-ArgumentList $dnsIPCollectionInvoke-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'

除了你的脚本块只声明一个参数,所以它只接收参数数组中的第一个值 - 你实际上只传递$p1Set-DnsClientServerAddress.

如果您希望您的数组作为单个参数传递到您的脚本块中,那么您需要将其包装在另一个数组中,以便您的$p1数组在 PowerShell 爆炸时变为-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 地址 - 您的 IP 地址数组被视为参数列表而不是单个数组参数......


推荐阅读