Powershell关闭VM

时间:2011-09-09 15:54:18

标签: powershell vmware powershell-v2.0 powercli

我有一个小的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 个答案:

答案 0 :(得分:6)

虽然我很欣赏使用PowerShell v2的作业子系统来完成此任务,但请注意,vCenter有一个内置的作业系统,您可以在此处利用它。执行环境更改的大多数PowerCLI cmdlet都具有RunAsync参数。要知道哪些,运行这段PowerShell代码:

get-help * -parameter runasync

RunAsync参数将接受您的命令并在vCenter中将它们排队。 cmdlet将返回一个任务对象,然后立即将控制权返回给您的脚本。

要在您的情况下将其转换为答案,只需将“-runasync”附加到Stop-VM命令的末尾,如下所示:

$VM | Stop-VM -Confirm:$false -RunAsync

答案 1 :(得分:0)

每次启动作业时,PowerShell都会创建一个新的运行空间。这意味着您可能需要初始化的新环境,包括加载管理单元和连接到VI Server。 Start-Job有一个参数,你可以在这里使用名为InitializationScript的参数。尝试这样的事情:

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