将数组传递给Get-Job

时间:2015-08-21 14:29:40

标签: arrays powershell powercli

我无法在Start-Job中将数组传递给scriptblock。你能告诉我我的错误吗?

$bounceBlock = {
param(
[string[]]$list,
[System.Management.Automation.PSCredential]$cred
)
Add-PSSnapin VMware.VimAutomation.Core | Out-Null
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -Scope User -InvalidCertificateAction Ignore -Confirm:$false | Out-Null
Connect-VIServer -Server servername -Credential $cred -AllLinked
Get-VM -Name $list
}


if ($targets) {
$activeTargets = $targets | Get-Random -Count $prodTargets.Count
$counter = [pscustomobject] @{Value = 0}
$groupSize = 50
$groups = $activeTargets | Group-Object -Property {[math]::Floor($counter.Value++ / $groupSize)}
$connection = Connect-VIServer -Server servername -Credential $cred -AllLinked
if ($connection -match "servername") {
    foreach ($group in $groups) {
        while ((Get-Job -State Running).Count -ge 5) {
            Start-Sleep -Seconds 5
            }
        Start-Job -ScriptBlock $bounceBlock -ArgumentList (,$group.Group.ServerName),$cred
        }
    Disconnect-VIServer * -Force -Confirm:$false
    }
}

我基本上将一个数组分成50个(工作)的块,然后尝试将它们作为作业运行。我得到的错误似乎是试图为单个服务器运行Get-VM,将所有50个值命名为附加在一起。

2 个答案:

答案 0 :(得分:1)

我当然不是PS的专家,但首先要解决你如何在附加的服务器列表中传递;我使用Get-AzureVM对Azure VM执行类似操作,并将System.Array中的VM名称列表传递给函数或cmdlet,例如$ theVMs =" MyServer1",&#34等变量; MyServer2"" MyServer3" 然后我执行foreach循环($ vm in $ theVMs),然后按顺序执行Get-VM等操作。我按顺序执行此操作,因为PS有一些更低的限制,根据我的经验,通过并行for循环执行此操作。

我远程与虚拟机进行远程交互并为每个创建PS作业的典型方式是使用      $ uri = Get-AzureWinRMUri -ServiceName $ svc -Name $ vmname

 Invoke-Command -ConnectionUri $uri -Credential $creds **-JobName 
 $jobname**    
 -ArgumentList $vmname -ScriptBlock {
 param([string]$thevm) ...
 }

这需要在http://blogs.technet.com讨论并提供的InstallWinRMCertAzureVM.ps1脚本。我经常在30台服务器之间使用它。

答案 1 :(得分:0)

只是希望每个人都知道,如果他们遇到类似的问题,这是运行Get-VM的问题,无论是在作业还是工作流中运行它都存在。 VMWare意识到了这个问题。