VMをシャットダウンするPowerShell
-
28-10-2019 - |
質問
停電が延長された場合に仮想マシンをシャットダウンするために使用される小さな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 }
受信ジョブ出力に基づいて、問題は使用中のスナップ(上記の関数が呼び出される前に追加される)であると思われます。
これを実現するための正しい構文は何ですか?
解決
このタスクにPowerShell V2のジョブサブシステムを使用したいという願望に感謝していますが、vCenterにはここで利用できる組み込みのジョブシステムがあることに注意してください。環境に変更を実行するほとんどのPowerCli cmdletsには、runasyncパラメーターがあります。どちらを知るには、このPowerShellコードを実行します。
get-help * -parameter runasync
RunaSyncパラメーターは、コマンドを取得し、vCenterでキューに掲載します。 cmdletはタスクオブジェクトを返し、すぐにコントロールをスクリプトに戻します。
これをあなたの場合の答えに変えるには、「-runasync」をSTOP-VMコマンドの最後に追加するだけです。
$VM | Stop-VM -Confirm:$false -RunAsync
他のヒント
仕事を始めるたびに、PowerShellは新しいRunspaceを作成します。これは、初期化する必要があるかもしれない新しい環境を意味し、スナップインのロードとVIサーバーへの接続が含まれます。 Start-Jobには、ここで使用できるパラメーターがあります。初期化と呼ばれます。このようなことを試してみてください:
Start-Job -InitializationScript { Add-PSSnapin VMware.VimAutomation.Core } {
Connect-ViServer myserver
Get-VM foo | Stop-VM
}