如何拆分参数

时间:2015-04-28 16:37:56

标签: powershell

编写脚本,将作为参数输入的DNS服务器放入主网卡。

服务器输入为:1.1.1.1,2.2.2.2,3.3.3.3(有时没有三台服务器,但更多/更少)。

我想分开逗号"," - 我怎么能这样做?

我试过了,但Powershell抱怨道:

[Parameter(Position = 4)]
$a = $DNSServers
$a.Split(',')

运行脚本时,第四个参数是通过逗号分割的DNS服务器。

更新

我会尝试马特的建议...更多信息

没想到我会得到这么多回应。道歉,由于我所在地的安全限制,我无法复制/粘贴服务器上的代码(因此再次输入所有内容时会感到痛苦)。所以,决定只复制我需要的那些 - 我认为这就足够了(显然不是!)。

该脚本将以:

运行

script.ps1 IP_ADDRESS SUBNET_MASK GATEWAY DNS_SERVER

ie:script.ps1 10.1.1.1 255.255.255.0 10.1.1.254 1.1.1.1,2.2.2.2,3.3.3.3

因此,将调用的第四个参数是DNS服务器(可以有多个DNS服务器)。该参数是从用户进入DNS服务器的外部Web客户端引入的 - 但通常是3个IP地址。

哦,错误就是这个 - 我不太确定错过了什么')'

PS C:\Temp> C:\Temp\ip_assign.ps1
At C:\Temp\ip_assign.ps1:14 char:17
+ $a = $DNSServers
+                 ~
Missing ')' in function parameter list.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInFunctionParameterList

管理以获取我正在做的主要部分 - 希望这已经足够了:

param (

[Parameter(Mandatory=$true,
            Position = 1)]
            [string]$IP
,
[Parameter(Position = 2)]
[string]$SubnetMask = "none"
,
[Parameter(Position = 3)]
[string]$Gateway = "none" 
,
[Parameter(Position = 4)]
$a = $DNSServers
$a.Split(',')


$TeamAdaptor = Get-WmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object { $_.Caption -ilike '*Virtual*'}
$TeamAdaptor.EnableStatic($IP,$SubnetMask)
$TeamAdaptor.SetGateways($Gateway)
$TeamAdaptor.SetDNSServerSearchOrder("$DNSServers")

3 个答案:

答案 0 :(得分:3)

我认为这里的问题是你没有像你想象的那样将字符串传递给参数。请考虑以下功能。

function Get-Bagel{
param(
    $DnsServers
)
    $DnsServers.GetType().FullName
    $DnsServers
}

然后是函数调用

Get-Bagel 1.1.1.1,2.2.2.2,3.3.3.3

这将净化以下输出。

System.Object[]
1.1.1.1
2.2.2.2
3.3.3.3

由于我们使用数组表示法输入变量而您没有在声明中设置强制转换$DnsServers实际上是一个字符串数组。这可能是您首先想要的,因此可能不需要使用.split()

你的搞笑错误

您缺少param()

的括号
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
)

转换为[string[]]$DNSServers,然后不需要分割。

答案 1 :(得分:1)

您需要有一个数组变量,然后使用输入字符串上的split函数将内容拆分为数组:

$a = "1.1.1.1,2.2.2.2,3.3.3.3" [array]$DnsServers = $a -split(",")

这将为您提供一个包含IP地址的数组$ DnsServers。在这种特殊情况下,$ DnsServers [0]为1.1.1.1,$ DnsServers [1]为2.2.2.2,$ DnsServers [2]为3.3.3.3。

答案 2 :(得分:1)

我认为Matt给出了一个可靠的答案,但在这里更简洁一点:当你指定逗号分隔的参数列表时,如下:

Get-Bagel Aaaaa,Bbbb,Cccc

PowerShell将此解释为三个单独的项目,Aaaa,Bbbb和Cccc。没有必要在逗号上分开,因为PowerShell会自动为您执行此操作