Acessando variáveis em Foreach -parrallel

0

Eu tenho uma tarefa simples que gostaria de fazer simultaneamente. Eu gostaria que um servidor enviasse um arquivo para um monte de endpoints e depois enviasse um comando. O servidor é apenas coincidentemente um sistema operacional do servidor; Estou trabalhando com dispositivos incorporados e o servidor envia informações para eles. Os terminais não são máquinas Windows.

O fabricante dos terminais tem uma série de módulos Power Shell para fazer o que eu quero. Ele pode até mesmo fazer a tarefa que eu quero simultaneamente, no entanto, é limitado a 32 de cada vez. Eu tenho mais de 100 endpoints. O arquivo que eu preciso enviar é ~ 400mb, então demora um pouco. Leva mais tempo para o endpoint processar o arquivo do que para enviá-lo.

Encontrei várias tecnologias diferentes no Power Shell para permitir a simultaneidade. Jobs, runspaces e worflows. Comecei com fluxos de trabalho porque eles têm Foreach -Parrallel , o que parece ser muito fácil de entender.

No entanto, parece que é difícil entrar em qualquer uma dessas metodologias concorrentes e também é difícil obter saída. Meu script não está funcionando no momento e você pode ver o erro abaixo. Eu estou pensando que há algum tipo de sintaxe ou erro de referência que eu preciso superar.

$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

A saída do script:

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> 

O fluxo de trabalho é atribuído incorretamente porque comecei com um exemplo chamado" pingparrallel "e tem tentado entender os worflows. O script original tentou usar uma classe de ping em particular e isso não funcionou.

Como posso passar o endereço IP do dispositivo para que o cmdlet de segunda pessoa processe corretamente?

Importa que esse código de segunda parte esteja usando runspaces?

Pedir ajuda ao fabricante provavelmente não funcionará tão bem. É um projeto de estimação deles, os tempos de resposta são lentos para essa tecnologia, e eu costumava trabalhar lá, então eu já sabia de tudo.

    
por YetAnotherRandomUser 05.10.2017 / 13:56

1 resposta

0

Nomeado Workflow como Flow, em seguida, no fluxo de trabalho criado no loop foreach paralelo que testou o status da conexão de rede em true, seu comando falhará. Prefixou as variáveis no fluxo de trabalho com $ workflow:

created [PSCustomObjects] from the workflow so they can be accessed from outside the workflow.

#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
    
por 09.10.2017 / 17:21