powershell - 在字符串数组地址设置不正确的远程端点上使用 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 输出:
解决方案
问题是你如何传递你-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'
希望这会有所帮助 - 我将把它应用到您原来的问题中,作为读者的练习,但如果您遇到困难,请发表评论:-)。
更新
只是为了强调这一点,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 地址数组被视为参数列表而不是单个数组参数......
推荐阅读
- ms-access - 如何使用键盘在 MS Access 中展开相关表?
- angular - ngx-bootstrap typeahead with optionslisttemplate不尊重typeaheadOptionsInScrollableView值
- android - 如何在颤动中扩展卡片?
- ios - Swift 请求用户访问照片库的权限
- javascript - XML 字符串到文件 .xml
- java - 图片文件上传 415 不支持的媒体类型 Java Httpclient 4.4
- chronicle - Chronicle Bytes 中是否有超快速的比较 byte[] 方法?
- c - 如何在 C 中正确使用 execvpe()?
- c++ - Windows 上带有 lapack/blas 的独立 Qt 应用程序(以及其他缺失的 dll)
- php - 手动执行时 Json 到 MySQL 查询错误有效