2013-07-09 132 views
3

我想從字符串數組中刪除項目。它是一個由5個服務器名稱組成的數組,我針對陣列中的每個服務器運行重新啓動功能。我一次只能重新啓動5臺服務器,因此陣列永遠不會比這更大,但同時我想繼續向陣列添加服務器,這樣我就可以循環訪問環境中的所有服務器。當服務器完成重新啓動時,我需要從陣列中刪除該服務器,以便我可以向陣列添加另一個服務器,並針對它運行重新啓動功能。我已嘗試$array.remove方法,但出現錯誤,指出它不適用於字符串數組。我已嘗試重新定義原始陣列而不重啓服務器從Powershell中的字符串動態數組中刪除項目

"$balancedout = $balancedout -notlike $server". 
+1

請顯示您正在嘗試執行的代碼示例,類似'$ balancedout = $ balancedout -notlike $ server'應該可以工作。 – zdan

回答

4

請注意,PowerShell使用.Net代碼。

所以聲明數組如下:

$a = New-Object System.Collections.ArrayList 

現在,您可以將項目添加到該數組:

$a.Add("Server1") 
$a.Add("Server2") 
$a.Add("Server3") 

如果打印數組你:

PS C:\Users\Work> $a 
Server2 
Server1 
Server3 

現在$ a確實有刪除方法:

$a.Remove("Server2") 

現在如果打印數組你:

PS C:\Users\Work> $a 
Server1 
Server3 
+0

感謝您的快速響應。那麼通過以這種方式聲明允許.remove方法?在我的腳本中,我聲明如下的數組(基於Internet文章)「$ balancedout = @()」。你能向我解釋什麼是差異,爲什麼.remove不起作用? –

+0

我完成了這條路線。萬分感謝。 –

3

要麼使用一個數組列表爲Joe Tatavaran建議(這可能是最優雅的解決方案),或數組這樣的重新分配:

$a = $a | ? { $_ -ne $server } 
-1

你可以加載整個服務器列表到ArrayList?你可以將它分成五個數組,然後在每組服務器上工作。

$servers = Get-Content serverlist.txt 
$setIdx = -1 
$sets = @() 
for($i = 0; $i -lt $servers.Count) 
{ 
    if($i % 5 -eq 0) 
    { 
     $setIdx++ 
     $sets[$setIdx] = @() 
    } 
    $sets[$setIdx] += $servers[$idx] 
} 

foreach($set in $sets) 
{ 
    Restart-Computer $set[0] 
    Restart-Computer $set[1] 
    Restart-Computer $set[2] 
    Restart-Computer $set[3] 
    Restart-Computer $set[4] 
} 
+0

我在開始時曾經簡單地考慮過這個問題,但整個過程比較精細,看看這些服務器是如何運作的,而且我必須讓每一個用戶都看不到。因此,在一組5臺服務器中,一臺服務器可能需要20分鐘才能關閉用戶,另一臺服務器可能需要24小時才能關閉用戶。與其等待最後一臺服務器完成5組,即使其他4臺服務器已準備好幾個小時,我還是會設置一個數組,以便將服務器移出服務器,然後移入新服務器。我可以保持服務器不斷進出數組 –