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 cmdlet 都有一个 RunAsync 参数。要知道哪些,请运行这段 PowerShell 代码:

get-help * -parameter runasync

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

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

$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 回答