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

Powershell 在字符串数组地址设置不正确的远程终结点上使用Set-DnsClientServerAddress,powershell,windows-server-2012-r2,Powershell,Windows Server 2012 R2,我远程尝试通过将DNS服务器IP地址的字符串数组作为参数传递给Invoke命令来设置DNS服务器地址 此代码仅设置第一个地址(10.1.1.2) 现在,如果我尝试下面的代码,它会设置两个IP地址 Invoke-Command -ComputerName $serverNameHere -ScriptBlock { Get-DnsClientServerAddress -InterfaceIndex 12 -AddressFamily IPv4 | Set-DnsClientServerAddre

我远程尝试通过将DNS服务器IP地址的字符串数组作为参数传递给Invoke命令来设置DNS服务器地址

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

现在,如果我尝试下面的代码,它会设置两个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
$dnsIPCollection = @("10.1.1.2", "10.1.1.2")
Set-DnsClientServerAddress -ServerAddresses $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
$dnsIPCollection = @("10.1.1.2", "10.1.1.2")
Set-DnsClientServerAddress -ServerAddresses $dnsIPCollection
我不确定这是一个bug还是我做错了什么。根据ServerAddresses参数,数据类型为
String[]

有人能分享一些关于我的观察的见解吗

我的$PSVersionTable输出:


问题在于如何将
-ArgumentList$dnsIPCollection
传递给
Invoke命令
-您希望它作为单个参数传递整个数组,但PowerShell正在将其分解为一个参数列表

它基本上是这样做的:

PS>$myArgs=@(“10.1.1.x”、“10.1.1.y”)
PS>Invoke命令-ScriptBlock{param($p1,$p2)
写入主机“p1=“$p1”
写入主机“p2=“$p2”
}-ArgumentList$myArgs
它给出了输出

p1 = '10.1.1.x'
p2 = '10.1.1.y'
除了脚本块只声明一个参数,因此它只接收参数数组中的第一个值之外,实际上只将
$p1
传递到
Set DnsClientServerAddress

如果希望将数组作为单个参数传递到脚本块中,则需要将其包装到另一个数组中,以便在PowerShell分解
-ArgumentList
时,数组成为
$p1

$myArgs=@(“10.1.1.x”、“10.1.1.y”)
调用命令-ScriptBlock{param($p1)
写入主机“p1=“$p1”
}-ArgumentList@(,$myArgs)
这现在输出:

p1 = '10.1.1.x 10.1.1.y'
希望这能有所帮助——我将把这个应用到你的原始问题中,作为读者的练习,但如果你被困在这一问题上,请留下评论:-)

更新

为了进一步说明这一点,PowerShell分解参数列表的原因可能更明显,例如使用有意义的变量名:

PS>Invoke命令-ScriptBlock{param($username,$password)
写入主机“username=”$username“
写入主机“密码=“$password”
}-ArgumentList@(“我的用户名”、“我的密码”)
您的示例中只设置了一个IP地址,与下面的示例基本相同:

PS>Invoke命令-ScriptBlock{param($username)
写入主机“username=”$username“
}-ArgumentList@(“我的用户名”、“我的密码”)

然后应该很容易理解为什么没有设置第二个IP地址-IP地址数组被视为一个参数列表而不是一个数组参数…

如果我理解正确,在第一个示例中,Invoke命令基本上是将我的字符串数组作为一个数组来处理,就像我在挥舞一样?或者一组论据与一个论据这似乎有悖常理,但我理解你指出的行为。我刚测试过,你是对的。是我还是@(,$myArgs)看起来很丑?@HiTech-我添加了一个小的更新,也许可以让它更直观一点。是的,我觉得
@(,$myArgs)
也有点难看:-)