2015-08-21 19 views
6

Sto avendo difficoltà a raggiungere una matrice passata a una scriptblock in Start-Job. Puoi dirmi cosa potrei fare di sbagliato?Passaggio di un array a 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 
    } 
} 

Io fondamentalmente diviso un array in blocchi di 50 (di lavoro) quindi provare a eseguirli come lavori. L'errore che appare sembra provochi l'esecuzione di Get-VM per un singolo server, con il nome di tutti e 50 i valori aggiunti insieme.

+2

'-ArgumentList $ group.Group.ServerName, $ cred' dovrebbe essere sufficiente. Quale versione di PowerShell stai usando? –

+0

PowerShell 4. Se provo a passarlo in questo modo, il lavoro si blocca per sempre (o almeno per più di 20 minuti). – Acerbity

+0

Una nota aggiuntiva, se cerco semplicemente di eseguire il comando con un array normale al di fuori del ciclo, il processo si blocca ancora. Start-Job -ScriptBlock $ bounceBlock -ArgumentList $ stuff, $ cred – Acerbity

risposta

0

Volevo solo far sapere a tutti nel caso in cui si imbattono in un problema simile, questo è un problema con l'esecuzione di Get-VM, ed esiste sia in esecuzione in un lavoro o flusso di lavoro. VMware è a conoscenza di questo problema.

1

Io sono certamente un esperto con PS, ma in primo luogo per affrontare come si sta passando nella lista allegata dei server; Faccio qualcosa di simile con Azure VM utilizzando Get-AzureVM e passo nella mia lista di nomi VM in uno System.Array a funzioni o cmdlet ad esempio una variabile come $ theVMs = "Server1", "myserver2", "MyServer3" e poi eseguo un ciclo foreach sopra ($ vm a $ theVMs) e quindi eseguire le azioni come Get-VM in modo sequenziale. Lo faccio in modo sequenziale visto che PS ha dei limiti molto più bassi, 5 per mia esperienza, facendo questo tramite un ciclo parallelo.

Un tipico modo interagisco con le macchine virtuali da remoto e creare un PS di lavoro per ogni è quello di utilizzare $ uri = Get-AzureWinRMUri -ServiceName $ SVC -Name $ vmname

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

Questo richiede la InstallWinRMCertAzureVM.ps1 script che è discusso e disponibile a http://blogs.technet.com. Lo uso da 30 server regolarmente.

+0

Questo non è Azure, è PowerCLI. Non penso che la tua soluzione si applicherebbe. – Acerbity

Problemi correlati