阿牛 发表于 2018-9-1 12:08:17

PowerShell 多线程测试IP端口

  $queue = ::Synchronized( (New-Object System.Collections.Queue) )
  $lines=gc C:\temp\thebigproxylist-17-12-20.txt
  foreach($line in $lines){
  $queue.enqueue($line)
  }
  write-host $queue.count
  $Throttle = 5 #threads
  #脚本块,对指定的IP测试端口,结果保存在一个对象里面
  $ScriptBlock = {
  Param (
  $value
  )
  $ip=$value.Split(":")
  $port=$value.Split(":")
  $a=test-netconnection -ComputerName $ip -Port $port
  $RunResult = New-Object PSObject -Property @{
  ComputerName=$ip
  Port=$port
  TCP=$a.TCPTestSucceeded
  }
  Return $RunResult
  }
  #创建一个资源池,指定多少个runspace可以同时执行
  $RunspacePool = ::CreateRunspacePool(1, $Throttle)
  $RunspacePool.Open()
  $Jobs = @()
  for($i=1;$i -lt 20;$i++){
  $currentvalue=$queue.Dequeue()
  Write-Host $currentvalue
  $Job = ::Create().AddScript($ScriptBlock).addargument($currentvalue)
  $Job.RunspacePool = $RunspacePool
  $Jobs += New-Object PSObject -Property @{
  Server = $currentvalue
  Pipe = $Job
  Result = $Job.BeginInvoke()
  }
  }
  #循环输出等待的信息.... 直到所有的job都完成
  Write-Host "Waiting.." -NoNewline
  Do {
  Write-Host "." -NoNewline
  Start-Sleep -Seconds 1
  } While ( $Jobs.Result.IsCompleted -contains $false)
  Write-Host "All jobs completed!"
  #输出结果
  $Results = @()
  ForEach ($Job in $Jobs)
  {   $Results += $Job.Pipe.EndInvoke($Job.Result)
  }
  $Results

页: [1]
查看完整版本: PowerShell 多线程测试IP端口