2017-08-03 5 views
1

Au début, j'ai créé une instance Powershell unique dans laquelle je peux démarrer mes fonctions. Le script pour cela:Créer et gérer des instances Powershell dans plusieurs boucles

$list = [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources() 
$row = $list.Rows[1] 

$code = { 
    param($var) 
    $var[0] +"\"+ $var[1] 
    #Stuff that has to be done 
} 

$newPS = [PowerShell]::Create().AddScript($code).AddArgument($row) 
$job = $newPS.BeginInvoke() 

while (-not $job.IsCompleted) {} 

$result = $newPS.EndInvoke($job) 
$newPS.Dispose() 

$result 

Jusqu'ici tout va bien. Mais maintenant j'essaie d'arriver au niveau suivant et de créer cette Powershell-Instances pour chaque élément de mon Datatable. Il devrait chercher quelque chose comme ceci:

$list = [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources() 

$code = { 
    param($var) 
    $var[0] +"\"+ $var[1] 
    #Stuff that has to be done 
    #Start-Sleep -s 1 
    } 


$PSCount= 1 

#start der Funktion 
foreach($row in $list) 
    { 
    $newPS[$PSCount] = [PowerShell]::Create().AddScript($code).AddArgument($row) 
    $job[$PSCount] = $newPS[$PSCount].BeginInvoke() 
    $PSCount++ 
    } 



#warten bis alle Jobs kompletiert sind 
#Ergebnisse verarbeiten und PS-Instanzen beenden 
for($i=1; $i -eq $PSCount; $i++) 
    { 
    while (-not $job[$i].IsCompleted) {} 

    $result = $newPS[$i].EndInvoke($job[$i]) 
    $newPS[$i].Dispose() 
    $result[0] 
    } 

Mais je ne peux pas indexer un Powershell. J'ai essayé aussi concaténer la powershell variable au lieu de faire un tableau:

New-Variable -name "newPS$PSCount" -value '[PowerShell]::Create().AddScript($code).AddArgument($row)' 

Mais alors je ne sais pas comment appeler la méthode « BeginInvoke() » ou variable elle-même.

+0

Avez-vous initialisé '$ newPs' et' $ job' en tant que tableaux avec 2 éléments ou plus? Je vous suggère de commencer avec '$ PSCount = 0', et d'ajouter aux deux tableaux avec' $ newPS + = ... ' – arco444

+0

Quel est l'objectif final ici? Invoquer N instances powershell de manière asynchrone dans le même espace d'exécution va nécessiter plus de mémoire et de processeur que de simplement faire le travail dans une boucle de N itérations –

+0

@ arco444: étonnamment, cela a résolu le problème. Merci beaucoup. –

Répondre

0

Tout comme arco444 a déclaré, l'initialisation $newPS un $job et ajouter ces tableaux comme $newPS += ... a résolu le problème.