У меня простая задача, которую я хотел бы выполнять одновременно. Я бы хотел, чтобы сервер выдал файл на несколько конечных точек, а затем отправил команду. Сервер только по совпадению является серверной ОС; Я работаю со встроенными устройствами, и сервер передает им информацию. Конечные точки не являются машинами Windows.
Производитель конечных точек имеет ряд модулей Power Shell, чтобы делать то, что я хочу. Он может даже выполнять задачу, которую я хочу одновременно, но не более 32 одновременно. У меня более 100 конечных точек. Файл, который мне нужно отправить, составляет ~ 400 МБ, так что это занимает некоторое время. Конечная точка обрабатывает файл дольше, чем отправляет его.
Я сталкивался с несколькими различными технологиями в Power Shell для обеспечения параллелизма. Рабочие места, пробелы и рабочие потоки. Я начал с рабочих процессов, потому что у них есть Foreach -Parrallel
, который, кажется, действительно легко обернуть вокруг меня.
Однако, кажется, что трудно получить входные данные в любой из этих параллельных методологий, а также трудно получить выходной результат. Мой скрипт в настоящее время не работает, и вы можете увидеть ошибку ниже. Я думаю, что есть какой-то синтаксис или ошибка ссылки, которую мне нужно преодолеть.
$inputCSV = "$PSScriptRoot\Addresses.csv"
$ipaddressesCSV = import-csv $inputCSV | select-object "IPAddress"
Write-host "File imported"
Write-host $ipaddressesCSV
workflow pingparallel {
param([string[]]$ipaddresses)
ForEach -parallel($ip in $ipaddresses) {
$remotehost = $ip.IPAddress
if(Test-NetConnection $remotehost -InformationLevel quiet){
Update-PUF -device $remotehost -path "C:\work\tsw-xx60_1.002.0016.001.puf" #-ShowProgress $true
$workflow:workFlowArray += ($remotehost + " Success")
}
else {
$workflow:workFlowArray +=($remotehost + " is in use.`n")
}
}
$workFlowArray
#$usedarray
}
$workFlowArray=pingparallel $ipaddressesCSV
Write-host "workFlowArray"
Write-host $workFlowArray
Вывод скрипта:
PS <...>> C:\Work\workflowFWpufEDK.ps1
File imported
@{IPAddress=192.168.1.101} @{IPAddress=192.168.1.102} @{IPAddress=192.168.1.103}
Microsoft.PowerShell.Utility\Write-Error : Cannot bind argument to parameter 'Device' because it is null.
At pingparallel:14 char:14
+
+ CategoryInfo : NotSpecified: (:) [Write-Error], RemoteException
+ FullyQualifiedErrorId : System.Management.Automation.RemoteException,Microsoft.PowerShell.Commands.WriteErrorCommand
+ PSComputerName : [localhost]
Microsoft.PowerShell.Utility\Write-Error : Cannot bind argument to parameter 'Device' because it is null.
At pingparallel:14 char:14
+
+ CategoryInfo : NotSpecified: (:) [Write-Error], RemoteException
+ FullyQualifiedErrorId : System.Management.Automation.RemoteException,Microsoft.PowerShell.Commands.WriteErrorCommand
+ PSComputerName : [localhost]
Microsoft.PowerShell.Utility\Write-Error : Cannot bind argument to parameter 'Device' because it is null.
At pingparallel:14 char:14
+
+ CategoryInfo : NotSpecified: (:) [Write-Error], RemoteException
+ FullyQualifiedErrorId : System.Management.Automation.RemoteException,Microsoft.PowerShell.Commands.WriteErrorCommand
+ PSComputerName : [localhost]
workFlowArray
PS C:\Users\Tablet>
Рабочий процесс назван неправильно, потому что я начал с примера под названием "pingparrallel" и пытался понять worflow. Оригинальный скрипт пытался использовать определенный класс ping, но это не сработало.
Как я могу передать IP-адрес устройства, которое я хочу, чтобы этот командлет второго лица правильно обрабатывал?
Имеет ли значение, что этот сторонний код использует пространства выполнения?
Обращаться к производителю за помощью, вероятно, не так хорошо. Это их любимый проект, время отклика у этой технологии медленное, и я привык работать там, так что у меня уже есть внутренний совок.