3

停電が長引いた場合に仮想マシンをシャットダウンするために使用する小さな 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 のコンテキストで読み込まれていないことが問題のようです。

これを実現するための正しい構文は何ですか?

4

2 に答える 2

6

このタスクに PowerShell v2 のジョブ サブシステムを使用したいという要望には感謝していますが、vCenter には、ここで利用できるジョブ システムが組み込まれていることに注意してください。環境に変更を加えるほとんどの PowerCLI コマンドレットには、RunAsync パラメーターがあります。どれを知るには、次の PowerShell コードを実行します。

get-help * -parameter runasync

RunAsync パラメーターはコマンドを受け取り、それらを vCenter のキューに入れます。コマンドレットはタスク オブジェクトを返し、すぐに制御をスクリプトに戻します。

これをあなたの場合の答えに変えるには、次のように、Stop-VM コマンドの最後に「-runasync」を追加するだけです。

$VM | Stop-VM -Confirm:$false -RunAsync
于 2011-09-09T17:32:11.990 に答える
0

ジョブを開始するたびに、PowerShell は新しい実行空間を作成します。これは、初期化が必要になる可能性のある新しい環境を意味し、スナップインのロードと VI サーバーへの接続が含まれます。Start-Job には、ここで使用できる InitializationScript というパラメーターがあります。次のようなことを試してください:

Start-Job -InitializationScript { Add-PSSnapin VMware.VimAutomation.Core } {
    Connect-ViServer myserver
    Get-VM foo | Stop-VM
}
于 2011-09-09T18:04:02.843 に答える