У меня простая задача, которую я хотел бы выполнять одновременно. Я бы хотел, чтобы сервер выдал файл на несколько конечных точек, а затем отправил команду. Сервер только по совпадению является серверной ОС; Я работаю со встроенными устройствами, и сервер передает им информацию. Конечные точки не являются машинами 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-адрес устройства, которое я хочу, чтобы этот командлет второго лица правильно обрабатывал?

Имеет ли значение, что этот сторонний код использует пространства выполнения?

Обращаться к производителю за помощью, вероятно, не так хорошо. Это их любимый проект, время отклика у этой технологии медленное, и я привык работать там, так что у меня уже есть внутренний совок.

1 ответ1

0

Названный Workflow как Flow, затем в рабочем процессе был создан параллельный цикл foreach, который проверял состояние сетевого соединения на true, запускает вашу команду, в противном случае прервал переменную в рабочем процессе с помощью $ workflow:

создал [PSCustomObjects] из рабочего процесса, чтобы к ним можно было получить доступ из-за пределов рабочего процесса.

#Workflow
workflow Flow {

    param([string[]]$endpoints)

ForEach -parallel ( $endpoint in $endpoints) {

# Test-NetConnection
$workflow:Status = (Test-NetConnection $endpoint -InformationLevel quiet)

If ( $workflow:Status -eq "True") {

    Update-PUF -device $endpoint -path "C:\work\tsw-xx60_1.002.0016.001.puf"

    $workflow:StatusResult = "Success."}

Else {

    $workflow:StatusResult = "Fail."}

# Create PSObjects to access outside workflow
[PSCustomObject]$endpoint +"`t`t" + [PSCustomObject]$StatusResult

   }
}

#Import IPAddresses from CSV and add to endpoint array
$csv = Import-Csv "$PSScriptRoot\Addresses.csv"
$endpoints = New-Object System.Collections.ArrayList
ForEach ($ip in $csv){  
    $Endpoints += $($ip.IPAddress)}


Flow -endpoint $endpoints

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .