2016-06-02 2 views
1

Привет, У меня есть проблема в powershell, где условие Do Until is true, но цикл не останавливается. Если я изменил -eq на 0. Он остановится ... В основном, что нужно сделать, это получить количество компьютеров в текстовом файле. Сохраните это число в $ count. Затем перезапустите службу для каждого компьютера в списке, пока он не достигнет последнего.Do Do not Loop Condition Met - but Loop continue - Powershell

$computers = gc C:\temp\computers.txt 
$count = $computers.count 
Do { 
    foreach($computer in $computers){ 
     $readCount = $computer.ReadCount 
     gwmi win32_service -ComputerName $computer | where {$_.name -like "*was*"} | Restart-Service 
    } 
} 
Until (($count - $readCount) -eq 1) 
+0

Вы перебрать все компьютеры внутри 'foreach' петли и' Until' условие проверяется только один раз итерации сделано. Так как свойство 'ReadCount' one-based,' $ readCount' будет равно '$ count', поэтому ваше условие' Until' не выполняется. – PetSerAl

ответ

0

Вам не нужен Do-Until цикла здесь, так как вы можете просто перебирать компьютеры. Для того, чтобы пропустить последний компьютер, используйте Select-Object командлет с параметром -SkipLast 1:

Get-Content 'C:\temp\computers.txt' | Select-Object -SkipLast 1 | Forach-Object { 
    gwmi win32_service -ComputerName $computer | 
     where {$_.name -like "*was*"} | 
     Restart-Service 
} 
+0

Ну, я не хочу, чтобы он перебирал весь список, я просто хочу, чтобы все компьютеры, но последний оставшийся. В основном я хочу оставить службу запущенной на одном компьютере. –

+0

О, я пропустил эту часть. Я отредактировал свой ответ –

+0

Ой, я не понял, что есть -skiplast .... Хорошо, что работает. Но можете ли вы объяснить, почему мое условие в Do Do not истинно, но цикл продолжается. На боковой ноте я переместил $ readcount за пределы цикла foreach и, по крайней мере, позволил остановить цикл ... Однако даже когда -eq 1, он по-прежнему попадает в foreach и перезапускает сервис на последнем компьютере. –