2015-08-21 14 views
6

Mam problem z uzyskaniem tablicy przekazanej do bloku skryptów w pracy początkowej. Czy możesz mi powiedzieć, co robię źle?Przekazywanie tablicy do zadania 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 
    } 
} 

Po prostu podzielam tablicę na porcje o wartości 50 (działa), a następnie próbuję uruchomić je jako zadania. Otrzymany błąd wygląda na to, że próbuje uruchomić Get-VM dla jednego serwera, nazywane wszystkimi 50 wartościami dodanymi razem.

+2

'-ArgumentList $ group.Group.ServerName, $ cred' powinno wystarczyć. Jakiej wersji PowerShell używasz? –

+0

Powershell 4. Jeśli próbuję to przekazać, praca wisi na zawsze (lub przynajmniej dłużej niż 20 minut). – Acerbity

+0

Jedna Uwaga dodatkowa, jeśli po prostu spróbuję uruchomić polecenie z regularną tablicą poza pętlą, zadanie wciąż się zawiesza. Start-Job -ScriptBlock $ bounceBlock -ArgumentList $ stuff, $ cred – Acerbity

Odpowiedz

0

Chcielibyśmy, aby wszyscy wiedzieli na wypadek, gdyby napotkali podobny problem, jest to problem z uruchomieniem Get-VM i istnieje niezależnie od tego, czy działa on w zleceniu, czy w przepływie pracy. Firma VMWare wie o tym problemie.

1

Z pewnością nie jestem ekspertem od PS, ale najpierw zajmuję się tym, jak przechodzisz na dołączonej liście serwerów; Robię coś podobnego z maszynami wirtualnymi Azure za pomocą narzędzia Get-AzureVM i przekazuję na liście nazw maszyn wirtualnych w funkcji System.Array do funkcji lub poleceń cmdlet, takich jak zmienna, np. $ TheVMs = "MyServer1", "MyServer2", "MyServer3" , a następnie wykonuję pętlę foreach ($ vm w $ theVMs), a następnie kolejno wykonuję akcje takie jak Get-VM. Robię to sekwencyjnie, ponieważ PS ma dużo niższe limity, 5 na moje doświadczenie, robiąc to przez równoległą pętlę for.

Typowym sposobem I interakcji z maszyną wirtualną zdalnie i stworzyć PS zadanie za każdym jest użycie $ uri = Get-AzureWinRMUri -ServiceName $ SVC -Name $ vmname

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

wymaga to Skrypt InstallWinRMCertAzureVM.ps1 omówiony i dostępny pod adresem http://blogs.technet.com. Używam tego regularnie dla 30 serwerów.

+0

To nie jest Azure, to PowerCLI. Nie sądzę, aby Twoje rozwiązanie miało zastosowanie. – Acerbity

Powiązane problemy