ForEach l oop не окончательный список - PullRequest
4 голосов
/ 18 марта 2020

Итак, у меня есть массив имен хостов, и я хочу запустить команду «Shutdown-VMGuest» на 45 хостах. Однако я хотел бы выключить 20 одновременно, когда я выполнил 40, но пропустил последние 5. Это код ниже, у кого-нибудь есть идея, что я делаю неправильно?

    [System.Collections.ArrayList]$currentStartList = @()

    $i=0
    foreach ($vmHost in $PowerOffList){
        $i++
        [void]$currentstartList.Add($vmHost)
        if ($i -gt "19"){
            $vmToPowerOff = Get-VM -Name $currentstartList
            $Confirmation= Read-Host "`n Do you want to hard powerdown the following VMs (y/n)? $currentstartList"
            if ($Confirmation -eq 'y'){
                Write-Output "`n Trying to power down VMs safely: $vmToPowerOff"
                try {
                    Shutdown-VMGuest $vmToPowerOff
                }
                catch {
                    Write-Output "`n $vmToPowerOff has failed to power off safely"
                    $FailedVMs.Add($vmToPowerOff)
                }

                #clear lists
                [System.Collections.ArrayList]$currentstartList = @()
                $i=0
                sleep 5
            }
        }
    } 

Ответы [ 2 ]

5 голосов
/ 18 марта 2020

Для такого рода вещей я бы предложил использовать for l oop вместо:

for($i = 0; $i -lt $PowerOffList.Count; $i += 20){
    # grab the next 20 (or fewer) hosts
    $currentStartList = $PowerOffList[$i..($i + 19)]

    # prompt user to start the hosts here
}

Когда вы передаете массив значений индекса в индексатор доступа [] в PowerShell, он просто игнорирует индексы, которые не существуют, поэтому в 3-й раз при выполнении l oop, $PowerOffList[$i..($i + 19)] просто приведет к последним 5 элементам

2 голосов
/ 18 марта 2020

Для последних 5 виртуальных машин ваша переменная $i застрянет на 5, и ваша программа никогда не выполнит это условие if ($i -gt "19")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...