2015-08-21 25 views
6

Başlangıç ​​İşi'nde bir komut dizisine bir dizi geçirme konusunda sorun yaşıyorum. Bana ne yapıyorum diyebilir misin?Diziyi Get-Job'a geçirme

$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 
    } 
} 

Temel olarak bir diziyi 50 (çalışma) parçalarına bölerim, sonra bunları iş olarak çalıştırmayı deneyin. Aldığım hata, birleştirilmiş bir sunucu için Get-VM'yi çalıştırmaya çalışıyormuş gibi görünüyor.

+2

'-ArgumentList $ group.Group.ServerName, $ cred' yeterli olmalıdır. Hangi PowerShell sürümünü kullanıyorsunuz? –

+0

Powershell 4. Bunu böyle aktarmaya çalışırsam, iş sonsuza kadar askıda kalıyor (veya en az 20 dakikadan uzun sürüyor). – Acerbity

+0

One Ek not, komutu döngü dışında düzenli bir diziyle çalıştırmaya çalışırsam, iş hala askıda kalıyor. Start-Job -ScriptBlock $ bounceBlock -ArgumentList $ şeyler, $ cred – Acerbity

cevap

0

Sadece benzer bir soruna girdiklerinde herkesin bilmesini istedik, bu Get-VM'yi çalıştırmayla ilgili bir sorundur ve bir işte veya iş akışında çalıştırılıp çalıştırılmadığının varlığıyla ortaya çıkmaktadır. VMWare bu sorunun farkında.

1

Kesinlikle PS ile ilgili bir uzman değilim, ancak önce eklenmiş sunucu listesinde nasıl geçtiğinizi ele almak için; Azure VM'leri ile Get-AzureVM kullanarak benzer bir şey yapıyorum ve bir System.Array öğesindeki VM isimleri listemde $ theVMs = "MyServer1", "MyServer2", "MyServer3" gibi bir değişken gibi cmdlet'lere geçiyorum ve sonra bir foreach döngüsünü ($ vv $ inVMs) yürütme ve sonra Get-VM gibi sıralı olarak gerçekleştirin. Bunu sıralı olarak yapıyorum çünkü PS'in bazı alt limitleri var, deneyimlerime göre 5, bunu bir paralel döngü üzerinden yapıyor.

Ben uzaktan VM'lerin ile etkileşim ve her başına PS İşi oluşturduğunuz tipik bir yol $ = -ServiceName $ svc -Name $ VMName

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

Bu gerektirir-AzureWinRMUri al uri kullanmaktır http://blogs.technet.com'da açıklanan ve mevcut olan InstallWinRMCertAzureVM.ps1 betiği. Bunu 30 sunucu arasında düzenli olarak kullanıyorum.

+0

Bu Azure değil, PowerCLI. Çözümünüzün geçerli olacağını düşünmüyorum. – Acerbity