尝试将作为参数输入的DNS后缀设置到我的脚本中。发现有一个注册表项 - HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\SearchList
并且可以在那里设置它们,但是,因为参数传递为UK.COM,US.COM,AUS.COM,NL.COM
。
问题在于,当我查看注册表项时,它会删除域之间的每个逗号。
我在这里找到了一个解决方法:Powershell is removing comma from program argument
然而,答案指出将参数放在引号中 - 问题是参数是从外部系统读取的(我无法更改),以及从中获取此参数的行是:
<Param><ParamValue>UK.COM,US.COM,NL.COM</ParamValue></Param><Param>
那么,如何在传入逗号时保留逗号?
输入的输入是这样的(摆脱IP&#39; s只留下DNS搜索顺序):
.\ip_assign.ps1 ip subnet gateway dns_servers dns_domain UK.COM,US.COM,NL.COM pri_wins sec_wins
脚本(查看参数6)
param (
[Parameter(Mandatory=$true,
Position = 1)]
[string]$IP
,
[Parameter(Position = 2)]
[string]$SubnetMask = "none"
,
[Parameter(Position = 3)]
[string]$Gateway = "none"
,
[Parameter(Position = 4)]
[string[]]$DNSServers
,
[Parameter(Position = 5)]
[string[]]$DNSDomain
,
[Parameter(Position = 6)]
$DNSSuffixs
,
[Parameter(Position = 7)]
[string[]]$PrimaryWINS
,
[Parameter(Position = 8)]
[string[]]$SecondaryWINS
)
$TeamAdaptor = Get-WmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object { $_.Caption -ilike '*Virtual*'}
$TeamAdaptor.EnableStatic($IP,$SubnetMask) | Out-Null
$TeamAdaptor.SetGateways($Gateway) | Out-Null
$TeamAdaptor.SetDNSServerSearchOrder($DNSServers) | Out-Null
$TeamAdaptor.SetDNSDomain($DNSDomain) | Out-Null
$TeamAdaptor.SetWINSServer($PrimaryWINS,$SecondaryWINS) | Out-Null
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters" -Name "SearchList" -Value $DNSSuffixs
答案 0 :(得分:2)
在这些项目周围使用单引号,否则PowerShell会将逗号解释为分隔条目。我添加了一个Write-Host行来调试,这就是我所看到的
#Write-host "Received $($DNSSuffixs.Count) `$DNSSuffix, which are $DNSSuffixs"
.\ip_assign.ps1 ip subnet gateway dns_servers dns_domain 'UK.COM,US.COM,NL.COM' pri_wins sec_wins
Received 1, which are UK.COM,US.COM,NL.COM
由于外部工具无法修改参数
您已经提到过无法控制外部工具调用此脚本的方式。为了仍然允许你传递逗号,我们可以使用-Join运算符重新加入你传递的所有三个项目,并使它们成为一个项目,其中恰好有逗号。只需将此行添加到您的代码中:
$DnsSuffixs = $DNSSuffixs -join ','
Write-host "Received items:$($DNSSuffixs.Count) `t value: $DNSSuffixs"
>Received items:1 value: UK.COM,US.COM,NL.COM
这应该可以完全解决您的问题。
答案 1 :(得分:2)
除非必须,否则不要直接写入注册表。使用适当的接口:
platform :iOS, '8.0'
pod 'RestKit', '~> 0.20.0'
Server 2012甚至有一个shiny new cmdlet:
$DNSSuffixs = 'UK.COM', 'US.COM', 'AUS.COM', 'NL.COM'
Invoke-WmiMethod -Class Win32_NetworkAdapterConfiguration -Name setDNSSuffixSearchOrder `
-ArgumentList @($DNSSuffixs),$null
请注意,根据您是从PowerShell还是从其他位置(例如CMD)调用脚本,参数值将不同。如果你从PowerShell这样调用它:
Set-DnsClientGlobalSetting -SuffixSearchList @($DNSSuffixs)
你得到一个数组.\ip_assign.ps1 -DNSSuffixs UK.COM,US.COM,NL.COM
。如果你这样从CMD打电话:
@('UK.COM', 'US.COM', 'NL.COM')
你得到一个字符串powershell -File .\ip_assign.ps1 -DNSSuffixs UK.COM,US.COM,NL.COM
。
例如,如果它不是数组类型,则可以通过在逗号中拆分值来处理:
'UK.COM,US.COM,NL.COM'
答案 2 :(得分:1)
只需输入$ DNSsuffixs作为字符串数组: [string []] $ DNSSuffixs
function test{
param (
[Parameter(Mandatory=$true,
Position = 1)]
[string]$IP
,
[Parameter(Position = 2)]
[string]$SubnetMask = "none"
,
[Parameter(Position = 3)]
[string]$Gateway = "none"
,
[Parameter(Position = 4)]
[string[]]$DNSServers
,
[Parameter(Position = 5)]
[string[]]$DNSDomain
,
[Parameter(Position = 6)]
[string[]]$DNSSuffixs
)
$psboundparameters
}
test ip subnet gateway dns_servers dns_domain UK.COM,US.COM,NL.COM
输出:
Key Value
--- -----
IP ip
SubnetMask subnet
Gateway gateway
DNSServers {dns_servers}
DNSDomain {dns_domain}
DNSSuffixs {UK.COM, US.COM, NL.COM}