2015-08-21 62 views
6

我無法在Start-Job中將數組傳遞給scriptblock。你能告訴我我可能做錯了什麼嗎?將數組傳遞給Get-Job

$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

'-ArgumentList $ group.Group.ServerName,$ cred'應該就足夠了。您使用的是什麼PowerShell版本? –

+0

Powershell 4.如果我試圖通過它,這項工作永遠掛起(或至少超過20分鐘)。 – Acerbity

+0

一個額外的說明,如果我只是嘗試運行循環外的常規數組的命令,作業仍然掛起。 Start-Job -ScriptBlock $ bounceBlock -ArgumentList $ stuff,$ cred – Acerbity

回答

0

只是想讓每個人都知道,以防萬一遇到類似問題,這是運行Get-VM時遇到的問題,無論是在作業還是在工作流中運行它都存在。 VMWare知道這個問題。

1

我當然不是PS的專家,但首先要解決你如何傳遞附加列表的服務器;我使用Get-AzureVM進行與Azure虛擬機相似的操作,並將System.Array中的VM名稱列表傳遞給函數或cmdlet,如$ theVMs =「MyServer1」,「MyServer2」,「MyServer3」 ,然後我執行foreach循環($ theVMs中的$ vm),然後按順序執行諸如Get-VM之類的操作。我按順序執行此操作,因爲PS有一些低得多的限制,根據我的經驗,通過並行for循環執行此操作。

我與虛擬機進行遠程交互,創造每每個 PS作業的典型方法是使用 $ URI = GET-AzureWinRMUri -ServiceName $ SVC雜牌$虛擬機名稱

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

這就要求InstallWinRMCertAzureVM.ps1腳本,討論並在http://blogs.technet.com處可用。我經常在30臺服務器之間使用它。

+0

這不是Azure,而是PowerCLI。我不認爲你的解決方案會適用。 – Acerbity