Powershell выключить виртуальную машину - PullRequest
3 голосов
/ 09 сентября 2011

У меня есть небольшой скрипт Powershell, который используется для выключения моих виртуальных машин в случае длительного перебоя в питании. Он принимает определенный объект VM и принудительно завершает работу.

Function DirtyShutdown
{ param([VMware.VimAutomation.ViCore.Impl.V1.Inventory.VirtualMachineImpl]$VM )
$VM | Stop-VM -Confirm:$false
}

Я бы хотел ускорить этот процесс, используя команду start-job для параллельного выполнения всех этих задач. Я попытался использовать несколько вариантов, включая следующие, которые я считаю правильными.

Start-Job -InputObject $VM -ScriptBlock{ $input | Shutdown-VMGuest -Confirm:$false }

Судя по выводу Receive-Job, проблема заключается в том, что используемая оснастка (добавленная до вызова вышеуказанной функции) не загружена в контексте Start-Job.

Каков правильный синтаксис, чтобы это произошло?

Ответы [ 2 ]

6 голосов
/ 09 сентября 2011

Хотя я и ценю желание использовать подсистему заданий PowerShell v2 для этой задачи, учтите, что в vCenter есть встроенная система заданий, которой вы можете воспользоваться здесь. Большинство командлетов PowerCLI, которые выполняют изменения в вашей среде, имеют параметр RunAsync. Чтобы узнать, какие из них, запустите этот фрагмент кода PowerShell:

get-help * -parameter runasync

Параметр RunAsync примет ваши команды и поставит их в очередь в vCenter. Командлет вернет объект задачи, а затем немедленно вернет управление обратно в ваш скрипт.

Чтобы превратить это в ответ в вашем случае, просто добавьте «-runasync» в конец команды Stop-VM, например:

$VM | Stop-VM -Confirm:$false -RunAsync
0 голосов
/ 09 сентября 2011

Каждый раз, когда вы запускаете задание, PowerShell создает новое пространство выполнения.Это означает новую среду, которую вам может потребоваться инициализировать и которая включает в себя загрузку оснасток и подключение к вашему VI серверу.Start-Job имеет параметр, который вы можете использовать здесь, называемый InitializationScript.Попробуйте что-то вроде этого:

Start-Job -InitializationScript { Add-PSSnapin VMware.VimAutomation.Core } {
    Connect-ViServer myserver
    Get-VM foo | Stop-VM
}
...