Powershell Retrieve-Job дает "не может индексировать ошибку нулевого массива",

60
4

Я пытаюсь проверить, подключены ли два компьютера, используя следующий скрипт

$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 для одного из них, я получаю "Нельзя индексировать нулевой массив". Что я делаю не так?

спросил(а) 2015-11-18T19:11:00+03:00 4 года, 3 месяца назад
1
Решение
68

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

$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]
}

ответил(а) 2015-11-18T20:12:00+03:00 4 года, 3 месяца назад
35

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

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

ответил(а) 2015-11-18T20:18:00+03:00 4 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема