2015-04-28 48 views
0

編寫腳本以將作爲參數輸入的DNS服務器放置到主網卡上。如何拆分參數

服務器輸入爲:1.1.1.1,2.2.2.2,3.3.3.3(有時沒有三臺服務器,但更多/更少)。

我想分割逗號「,」 - 我該怎麼做?

我試過,但PowerShell是抱怨:

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

當腳本運行第四參數是通過逗號分割的DNS服務器。

UPDATE

我會盡量馬特的建議...更多infoL

沒想到我會得到這麼多的迴應。道歉,由於在我的地方安全限制,我不能複製/粘貼服務器上的代碼(所以再次輸入它的背面疼痛)。所以,決定只複製我需要的位 - 我認爲這就夠了(顯然不是!)。

該腳本將被運行爲:

script.ps1 IP_ADDRESS SUBNET_MASK GATEWAY DNS_SERVER

即: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服務器的地方 - 但通常是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") 
+1

PowerShell抱怨... * * * * *如果你收到錯誤:它說什麼?此外,您的代碼片段太不完整。請[添加更多上下文](http://stackoverflow.com/help/mcve)。 –

+1

該命令是正確的。如果'$ a'的內容就是你說的那樣,它應該按預期工作。你有什麼? – aldux

+0

您向我們展示您傳遞的參數非常重要。這可能已經是一個數組。向我們展示一個示例函數調用。另外,不可能是怎麼編碼的[參數(位置= 4)]'不屬於它的孤獨。它的存在是我知道我只能看到一個函數調用的唯一方法 – Matt

回答

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,然後就沒有必要進行拆分。

+0

嗨 - 我已經提出了一個更新問題..有幫助嗎?我會嘗試你的建議.. – lara400

+0

@ lara400檢查我的更新。您可能還有其他問題,但從此開始。 – Matt

+0

@ lara400再次更新。 – Matt

1

你需要有一個數組變量,然後使用分割函數對輸入字符串到內容分割成陣列:

$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。

1

我認爲馬特給了一個堅實的答案,但在這裏稍微更簡潔:當您指定一個逗號分隔的參數列表,像這樣:

Get-Bagel Aaaaa,Bbbb,Cccc 

PowerShell的解釋爲三個獨立的項目,AAAA ,Bbbb和Cccc。沒有必要用逗號分隔,因爲PowerShell會自動爲你做這件事

+0

啊......這很有道理 - 好的,謝謝 – lara400