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

Using Set-DnsClientServerAddress on remote endpoint with string array addresses not setting correctly

我尝试远程设置 DNS 服务器地址,方法是将 DNS 服务器 IP 地址的字符串数组作为参数传递给 Invoke-Command。

此代码只设置首地址(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 输出:

问题在于您如何将 -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.

如果您希望将数组作为单个参数传递到脚本块中,则需要将其包装在另一个数组中,以便 您的 数组变为 $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'

希望这对您有所帮助 - 我将把它应用到您原来的问题中作为 reader 的练习,但如果您遇到困难,请发表评论 :-)。

更新

为了说明这一点,原因 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 地址数组被视为参数列表而不是单个数组参数...