Скрипт Powershell запускает только первую виртуальную машину в списке - PullRequest
3 голосов
/ 01 апреля 2019

У меня есть скрипт PowerShell Azure для запуска списка виртуальных машин.Когда он запускается, он успешно запускает первую виртуальную машину в списке, а затем ничего.Об ошибках не сообщается, кажется, что он никогда не возвращается из команды пуска

Код выглядит следующим образом:

$vmList = "VM1", "VM2", "VM3"

Write-Output "Starting VMs in '$($AzureResourceGroup)' resource group"; 

Foreach ($vm in $vmList) 
{ 
    Write-Output "Starting VM...$vm" 
    $result = Start-AzureRmVM -Name $vm -ResourceGroupName AzureResourceGroup
    Write-Output "Result of Start VM...$result"
}

При этом запуске он выдает «ЗапускВМ .... ВМ1 ", она запускает ВМ, а затем ничего ...

1 Ответ

1 голос
/ 01 апреля 2019

Похоже, что ваш Start-AzureVM вызов просто , ожидая, пока виртуальная машина завершит запуск .

То есть Start-AzureVm по умолчанию является блокировкой, синхронная операция - несмотря на свое имя [1]

Чтобы сделать его асинхронным , используйте переключатель -AsJob , который использует фоновое задание для запуска ВМ; вызов завершается после создания этого задания и возвращает объект задания , который можно использовать для отслеживания хода запуска позднее, с помощью обычных *-Job командлетов, таких как Receive-Job.


[1] Относительно названия Start-AzureVM:

Ошибочно в том, что номенклатура PowerShell требует, чтобы глагол Start демонстрировал асинхронное поведение:

С https://docs.microsoft.com/en-us/powershell/developer/cmdlet/approved-verbs-for-windows-powershell-commands (выделение добавлено):

Вызов против старта Глагол Invoke используется для выполнения операции, которая обычно является синхронной, такой как выполнение команды. Глагол Start используется для начала операции, которая обычно является асинхронной операцией , такой как запуск процесса.

Обратите внимание, что базовый Start-Sleep командлет назван так же.

При синхронном поведении по умолчанию не существует хорошего решения для именования, поскольку имя Invoke-AzureVm может сбить с толку.

Лучшим подходом - который, очевидно, был бы серьезным изменением - было бы сделать командлет асинхронным по умолчанию и предложить переключатель -Wait для включения синхронной операции.

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