2015-11-18 1 views
2

Я пытаюсь проверить, если два компьютера соединены с помощью следующего сценарияPowershell Получить-Job дает «не может индексировать в нулевую ошибку массива»

$array ='PC1','PC2' 


for ($i=0; $i -lt $array.length; $i++) { 

    Start-Job –Name TestConnection$i –Scriptblock { 

      if(test-connection $array[$i] -count 1 -quiet){ 
       write-host Success 
      } 

      else { write-host No connection 
      } 

    } 

} 

Когда я пытаюсь сделать Receive-Job или для одного I get "Невозможно индексировать нулевой массив". Что я делаю неправильно?

+1

Я бы сказал, что в контексте скриптового блока не существует ни '$ array', ни' $ i', где возникает ошибка нулевого массива. Часть 'receive-job' выглядит так, как будто она работает правильно – arco444

+0

Я думал, так как' $ array' находится за пределами блока, он будет доступен? –

+0

Вы можете эхо-значения внутри скриптового блока? – arco444

ответ

3

Вам нужно передать имя компьютера в качестве аргумента, так как массив не существует в контексте блока сценария, например:

$array ='PC1','PC2' 

for ($i=0; $i -lt $array.Length; $i++) { 

    Start-Job –Name TestConnection –Scriptblock { 
     param($pcName) 

     if(Test-Connection $pcName -Count 1 -Quiet) { 
      Write-Host Success 
     } else { 
      Write-Host No connection 
     }   
    } -ArgumentList $array[$i] 
} 
+0

Вам также необходимо убедиться, что задание выполнено до того, как вы получите задание (по крайней мере, чтобы увидеть весь вывод). Вы можете использовать Wait-Job или проверить JobStateInfo.state задания (которое вы вернетесь из старта) –

+0

OK Я попробую это и дам вам знать. Также спасибо. –

+0

ОК, это сработало для меня, спасибо. Поэтому я понимаю, что 'param ($ pcName)' принимает значения в '-ArgumentList' ??? –

0

Вы должны пройти $ я (и любой другой переменные) через -ArgumentList с помощью Командлета Start-Job, поскольку ваш блок сценариев работает на совершенно другом узле powershell и не имеет доступа ни к чему внутри оболочки, которая начала работу.

Несмотря на то, что ваш блок сценариев существует внутри исходного кода, Powershell не расширяет никаких переменных в нем до тех пор, пока он не выполнит код на другом хосте. Вы можете определить param() в начале вашего блока сценария, чтобы использовать переменную, которую вы передаете через -ArgumentList

+0

Привет Майк. Как это отличается от ответа на автору? Это звучит так же, как и его ответ. – Matt

+0

steoleary's не был отправлен, когда я начал свой ответ –