2016-12-16 5 views
0

J'ai écrit le script pour diviser un fichier (Contenant des noms d'hôtes) en dix fichiers, exécuter une commande Ping (c'est-à-dire commande powershell test-connection) aux noms d'hôte dans chaque fichier. Pour accélérer le processus, j'ai utilisé la commande start-job pour traiter chaque nom d'hôte de fichier. Si je supprime la commande start-job, les scripts fonctionnent très bien, comme vous le souhaitez. Mais quand j'utilise la commande start-job, le tableau utilisé à l'intérieur du "scriptblock" ne retourne pas la sortie désirée. Au lieu de cela, il reste vide. Voici le script partiel (pour un seul traitement de fichier). S'il vous plaît guide, qu'est-ce que je manque ici?Powershell, Start-Job ne fonctionne pas. Sans le script Start-job est Ok

Start-Job -Name "Ping-Part-1" -ScriptBlock { 
    foreach ($Comp1 in $file_part1_content) { 
     If (test-Connection -ComputerName $Comp1 -Count 1 -Quiet) { 
       $project1 = Create-New-Object 
       $project1.AliveStatus = "Alive" 
       $project1.Hostname = $Comp1 
       $resultsarray_file1 += $project1 
      } 
      Else { 
       $project1 = Create-New-Object 
       $project1.AliveStatus = "Not Alive" 
       $project1.Hostname = $Comp1 
       $resultsarray_file1 += $project1 
      } 
     } 
    } 
+0

'Créer un nouvel objet'? – 4c74356b41

+0

'Start-Job' fonctionne en créant un nouveau processus avec' Runspace' séparé avec des variables séparées ('$ resultsarray_file1' en particulier). – PetSerAl

+0

il est une fonction fonction –

Répondre

0

Deux choses ne vont pas avec cela. Par défaut, les variables que vous utilisez dans le travail ne sont pas disponibles dans votre session PowerShell (et vice versa btw). Donc vous avez plusieurs problèmes. Vous ne mettez aucune variable dans le travail et vous n'en récupérez aucun.

Vous avez également placé le travail de démarrage au mauvais endroit. Vous commencez maintenant 1 travail avec l'ensemble de la boucle foreach là-bas. Je suppose que vous voulez traiter chaque ordinateur séparément. Vous devriez donc commencer le travail dans la boucle foreach.

J'ai écrit un blog sur ce sujet il y a quelque temps qui correspond à votre scénario. Vous pouvez le trouver here.

+0

Start-Job -Name « Ping-Part- 1" -ScriptBlock {$ resultsarray_file1 = @() foreach ($ Comp1 en file_part1_content de $) { Si (test de connexion -ComputerName $ Comp1 -Count 1 -QUIET) {$ project1 = Create-New-Object $ project1 .AliveStatus = "Vivant" $ project1.Hostname = $ Comp1 $ resultsarray_file1 + = $ projet1} Else {$ project1 = Créer-Nouveau-Objet $ proje ct1.AliveStatus = "Not Alive" $ project1.Hostname = $ Comp1 $ resultsarray_file1 + = $ project1}} retour resultsarray_file1 de $} –

+0

Je l'ai fait ce que vous avez dit, toujours le "Start-Job" est rien de retour –

+0

Uhmm non, pas vraiment. Vous ne saisissez toujours aucune variable dans le travail de démarrage. Vous pouvez le faire en utilisant -argumentlist. Consultez le lien que je vous ai envoyé dans mon post ci-dessus. http://sonnypuijk.nl/wp/powershell-jobs-for-multithreading/ –