Некоторые командлеты Azure PowerShell очень утомительны; такая тривиальная задача, как установка статического IP-адреса на виртуальной машине, может занять больше минуты (я предполагаю, что это потому, что командлет фактически отправляет команды в Azure и ожидает, пока Azure выполнит запрошенную задачу и отчитается); поэтому, особенно когда мне нужно их много использовать (и для независимых операций), я бы действительно хотелось бы запускать их как фоновые задания, чтобы иметь возможность отправлять несколько запросов в Azure и запускать их параллельно.
Возьмем, к примеру, этот код, который устанавливает статические IP-адреса на нескольких виртуальных машинах:
$vms = @{
"VM1"="192.168.0.11"
"VM2"="192.168.0.12"
"VM3"="192.168.0.13"
"VM4"="192.168.0.14"
"VM5"="192.168.0.15"
}
foreach ($vm in $vms.GetEnumerator())
{
get-azurevm $vm.Key | Set-AzureStaticVNetIP $vm.Value | Update-AzureVM
}
Это требует навсегда, поскольку каждая команда может занять больше минуты и должна быть завершена перед выполнением следующей.
Можно ли сказать командлетам Azure «просто возвращайся и продолжай делать то, что тебе нужно, а затем доложи»?
Я пробовал использовать Start-Job
, но это не работает, потому что фоновые задания не наследуют среду родительского сеанса, и, помимо очевидных отсутствующих переменных, это означает, что они не вошли в Azure и, следовательно, не могут выполнять никакую команду.
Фоновые пространства выполнения должны работать на вас.
Использование фоновых пространств выполнения вместо PSJobs для повышения производительности
Многопоточные сценарии Powershell
http://thesurlyadmin.com/2013/02/11/multithreading-powershell-scripts/
ServerFault
Как мне запустить мои сценарии PowerShell параллельно без использования заданий?