使用powershell运行空间并行创建多个VM

使用powershell运行空间并行创建多个VM,powershell,parallel-processing,vmware,runspace,vcenter,Powershell,Parallel Processing,Vmware,Runspace,Vcenter,我在单个VIServer中从模板创建多个VMWARE VM时遇到问题。 在下面的代码中,当在throttle脚本中放入任何大于1的值时,脚本只执行一个vm而不创建任何其他vm(并行),它似乎在保持会话方面存在问题,很可能只是在$global:DefaultVIServer中重置或修改它 以下代码基于此线程中的问题: 答案是一直保持相同的会话,但我无法让它工作 我还假设这篇文章与我的问题相同: 我想知道是否有人在使用powershell中的运行空间在vmware中创建多个VM方面有可行的解决方案

我在单个VIServer中从模板创建多个VMWARE VM时遇到问题。 在下面的代码中,当在throttle脚本中放入任何大于1的值时,脚本只执行一个vm而不创建任何其他vm(并行),它似乎在保持会话方面存在问题,很可能只是在$global:DefaultVIServer中重置或修改它

以下代码基于此线程中的问题: 答案是一直保持相同的会话,但我无法让它工作

我还假设这篇文章与我的问题相同:

我想知道是否有人在使用powershell中的运行空间在vmware中创建多个VM方面有可行的解决方案

cls
Add-PSSnapin VMware.VimAutomation.Core | Out-Null 
#import csv
$VMs = Import-CSV 'filename.csv' -UseCulture
#connections array
$server = @()
#threads
$throttle = 2
# Create session state
$sessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
# Create runspace pool consisting of runspaces
$RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, $throttle, $sessionState, $host)
$RunspacePool.Open()
#array for jobs
$Jobs = @()
#this contains all connected vSphere endpoints
$global:DefaultVIServer

$User = "domain\username"
$PWord = ConvertTo-SecureString -String "password" -AsPlainText -Force
$Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $User, $PWord   



# SctiptBlock to execute for each job
$ScriptBlock = {
    Param ($VM, $ses) 

    Add-PSSnapin VMware.VimAutomation.Core | Out-Null
    Write-Host $VM.Name "Father session:    "  $ses.SessionSecret    

    Connect-VIServer $VM.VIServer -Session $ses.SessionSecret -wa 0
    Write-Host $VM.Name "Child session:    "   $sessionf.SessionId

    New-VM -Name $VM.Name -ResourcePool "..." -Location "Windows Servers" -Datastore "..." -DiskStorageFormat "..." -Notes "..." -Template "..."
}


# Starting script
Write-Host ("Starting script: {0}" -f (Get-Date))
$startTime = Get-Date

$count = 0
ForEach($VM in $VMs)
{

    $count  = $count + 1

    Write-Host "Current connections:"
    $Global:DefaultVIServers.count

    $ses = Connect-VIServer $VM.VIServer -Credential $Credential -wa 0   

    $Job = [powershell]::create()
    $Job.RunspacePool = $RunspacePool
    $Job.AddScript($ScriptBlock).AddParameter("VM", $VM).AddParameter("ses", $ses)

    Write-Host "Adding job to jobs list"    
    $Jobs += New-Object PSObject -Property @{
        RunNum = $count
        Job = $Job
        Result = $Job.BeginInvoke() | Out-Null
        }    
}

Write-Host "Waiting.." -NoNewline
Do {
   Write-Host "." -NoNewline
   Start-Sleep -Seconds 1
} While ( $Jobs.Result.IsCompleted -contains $false)

$endTime = Get-Date
$totalSeconds = "{0:N4}" -f ($endTime-$startTime).TotalSeconds
Write-Host "All jobs finished in $totalSeconds seconds"

有什么理由不在新VM上使用native-AsJob开关吗?我认为此vmware cmdlet没有这样的开关对不起,这是Hyper-V语法,相同的vmware参数语法是-runasync。同样的问题…嗨,我通过在每个作业中创建到vcenter(重用会话)的连接,在powershell中使用作业成功地做到了这一点。问题是,我想使用运行空间并将性能与作业进行比较。它应该以完全相同的方式工作,但由于某些原因,尽管有第一个作业,会话仍会断开连接。您有什么理由不在新VM上使用本机-AsJob开关吗?我认为此vmware cmdlet没有这样的开关我很抱歉,这是Hyper-V语法,相同的vmware参数语法是-runasync。同样的问题…嗨,我通过在每个作业中创建到vcenter(重用会话)的连接,在powershell中使用作业成功地做到了这一点。问题是,我想使用运行空间并将性能与作业进行比较。它应该以完全相同的方式工作,但由于某种原因,尽管有第一个作业,会话还是断开了所有会话的连接。