我有一个小的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的上下文中没有加载正在使用的管理单元(在调用上述函数之前添加)。
实现这一目标的正确语法是什么?
答案 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
}