Похоже, что ваш 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
для включения синхронной операции.