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.