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