在 Foreach -parallel 中访问变量

在 Foreach -parallel 中访问变量

我有一个简单的任务,我想同时执行。我希望服务器将文件推送到一堆端点,然后发送命令。服务器恰好是一个服务器操作系统;我正在使用嵌入式设备,服务器将信息推送给它们。端点不是 Windows 机器。

端点制造商有一系列 Power Shell 模块可以执行我想要的操作。它甚至可以同时执行我想要的任务,但是一次最多只能执行 32 个。我有 100 多个端点。我需要发送的文件约为 400mb,因此需要一段时间。端点处理文件的时间比发送文件的时间更长。

我遇到了 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”,并一直在尝试理解工作流。原始脚本尝试使用特定的 ping 类,但没有成功。

我如何传递我希望此第二方 cmdlet 正确处理的设备的 IP 地址?

第二方代码使用运行空间重要吗?

向制造商寻求帮助可能不会那么顺利。这是他们的一个宠物项目,这项技术的响应时间很慢,而且我曾经在那里工作过,所以我已经掌握了内幕消息。

答案1

将工作流命名为 Flow,然后在工作流中创建并行 foreach 循环,该循环测试网络连接状态,如果为 true,则运行命令,否则失败,在工作流中的变量前面加上前缀$工作流程:

从工作流创建 [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

相关内容