2011-09-09 97 views
3

我有一个小的Powershell脚本,用于在发生长时间停电时关闭我的虚拟机。它需要一个特定的VM对象并强制关闭。Powershell关闭虚拟机

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 } 

基于它出现的问题,接收-作业输出是在使用中(加入上述函数被调用之前)在启动工作的上下文中未装载单元。

发生这种情况的正确语法是什么?

+0

有两个答案,我会发布他们两个,看看大家喜欢什么。 – halr9000

回答

6

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

get-help * -parameter runasync 

的RunAsync参数将你的命令(S)与vCenter中排队起来。该cmdlet将返回一个任务对象,然后立即将控制权返回给您的脚本。

把它变成你的情况回答,只是追加“-runasync”你停止-VM命令的末尾,就像这样:

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

这正是我所希望的 - 我没有看到我审查过的任何文档中的RunAsync选项,并且我在这几个小时。像这样的日子真的让我想念Bash。 –

+1

新别名男人获取帮助:) – halr9000

0

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

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

我实际上无法得到这个工作;工作无限期地运行。但是,语法是合理的,你应该看看它是否适用于你。我已经用VMware工程打开了一个主题,以查看这是一个错误还是仅仅是我。 – halr9000