使用过滤器与作业并行编写脚本

时间:2013-10-16 19:38:14

标签: c# powershell parallel-processing

我编写了一个脚本,在Hyper-V中构建了数百个虚拟机,但此时它根据每行有虚拟机的CSV文件为每个主机创建一台计算机。

CSV input looks kinda like this:
HOSTNAME,VMName,CPU,MEM,VHDPATH
Host1,test1,2,4,D:\server2008.vhd
Host1,test2,2,4,D:\server2k3.vhd
Host2,test3,2,4,D:\server2k3.vhd
Host2,test4,2,4,D:\server2k3.vhd
Host3,test5,2,4,D:\server2k3.vhd
Host3,test6,2,4,D:\server2k3.vhd

我想要做的是,如果同一主机上有多个虚拟机(如上所述),我想一次只在那里构建一个虚拟机,但并行,我想在其他主机上构建虚拟机。这个想法是每个主机将创建1个VM,并且将在不同主机上并行发生多个创建。当VM完成时,它会向下移动该主机的列表并构建下一个。理论上,应该同时创建3个VM,每个主机1个。

我已经尝试过设置工作,但无法做到正确,请指教!提前谢谢

更新

如何获取输入文件,根据主机创建一个分离到阵列的机器列表。那么每个主机,每个阵列做这个工作吗?

1 个答案:

答案 0 :(得分:0)

如果您使用的是PowerShell V3,请使用Workflow。

workflow Provision-VM {
    param([psobject[]]$HostInfo)

    foreach -parallel ($host in $HostInfo) {
        foreach ($vmInfo in $host.VM) {
            Invoke-Command -cn $host.Name -File path-to-script.ps1 -Arg $vmInfo
        }
    }
}

我会将每个主机的VM信息合并到每个主机的单个自定义对象中,并将其传递到工作流程中。总的来说,我不会在工作流程中做精细的脚本,特别是在调用工作流程之前可以解决它。

HostInfo对象如下所示:

$hostInfo += [pscustomobject]@{Name='Host1';VM=@([pscustomobject]@{Name='test1';CPU=2;MEM=4;VHDPATH='c:\...'},[pscustomobject]@{... next VM ...})}