我怎么能保留逗号?

时间:2015-04-29 12:53:36

标签: powershell

尝试将作为参数输入的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

3 个答案:

答案 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}