使用PowerShell关闭虚拟机

3

我有一个小的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 }

根据 Receive-Job 输出,问题似乎是在调用上述函数之前添加的 snap in 没有在 Start-Job 的上下文中加载。正确的语法是什么可以解决这个问题?

这个问题有两个答案,我会把它们都发布出来,看看大家喜欢哪一个。 - halr9000
2个回答

6

尽管我欣赏使用PowerShell v2的任务子系统来完成这个任务的愿望,但请注意vCenter具有内置的作业系统,您可以在此处利用它。大多数执行对环境进行更改的PowerCLI cmdlet都具有RunAsync参数。要了解哪些命令,请运行此PowerShell代码:

get-help * -parameter runasync

RunAsync参数会将您的命令排队在vCenter中。该cmdlet将返回一个任务对象,然后立即将控制权返回到您的脚本。
要将其转换为您的情况下的答案,只需在Stop-VM命令的末尾添加“-runasync”,如下所示:
$VM | Stop-VM -Confirm:$false -RunAsync

这正是我所期望的 - 我在查阅的所有文档中都没有看到RunAsync选项,而我已经花了几个小时在这上面。像这样的日子真的让我想念Bash。 - Tim Brigham

0
每次启动作业时,PowerShell都会创建一个新的运行空间。这意味着您可能需要初始化一个新的环境,包括加载 snap-in 并连接到您的 VI 服务器。Start-Job 有一个名为 InitializationScript 的参数,您可以在此处使用它。尝试像这样做:
Start-Job -InitializationScript { Add-PSSnapin VMware.VimAutomation.Core } {
    Connect-ViServer myserver
    Get-VM foo | Stop-VM
}

我实际上无法让它工作;该作业无限期运行。语法是正确的,但您应该看看它是否适用于您。我已经与VMware工程师开了一个线程,以查看这是否是一个错误还是只有我遇到了问题。 - halr9000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接