2013-07-09 3 views
3

Я пытаюсь удалить элемент из массива строк. Это массив из 5 имен серверов, и я запускаю функцию перезагрузки для каждого сервера в массиве. Я могу перезагружать только 5 серверов за один раз, поэтому массив никогда не станет больше, чем это, но в то же время я хочу продолжать добавлять серверы в массив, чтобы я мог перемещаться по всем серверам в моей среде. Когда сервер завершил перезагрузку, мне нужно удалить этот сервер из массива, чтобы я мог добавить другое в массив и запустить функцию перезагрузки. Я пробовал метод $array.remove, но я получаю сообщение об ошибке, что он не работает в строковом массиве. Я попытался переопределением исходного массива без перезагрузки сервераУдаление элементов из динамического массива строк в Powershell

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

Пожалуйста, покажите пример кода того, что вы пытаетесь сделать, что-то вроде '$ balanceout = $ balanceout -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? В моем сценарии я объявил массив следующим образом (на основе интернет-статей) «$ balanceout = @()». Можете ли вы объяснить мне, что такое различие и почему не было. –

+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

Я вкратце рассмотрел это в начале, но весь процесс немного более сложный, видя, как это Citrix-серверы, и я должен отучить пользователей от каждого. Таким образом, в группе из 5 один сервер может занять 20 минут, чтобы отключить пользователей, а другой сервер может занять 24 часа, чтобы отключить пользователей. Вместо того, чтобы дождаться окончания последнего сервера в группе из 5, даже если остальные 4 были готовы к возможно нескольким часам, я подумал, что создам массив, из которого я мог бы переместить готовые серверы, а затем переместить новые. Я мог бы поддерживать постоянный поток серверов в и из массива –

Смежные вопросы