我尝试通过向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输出:
问题是如何将-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地址...