本文共 2077 字,大约阅读时间需要 6 分钟。
最近在学Python的爬虫,昨天试着用多线程去使用不同的代理IP,基本原理是把所有的IP地址都放入一个队列,然后使用多线程地去读取队列里面的值。
今天突然想到,类似的方式在PowerShell里面能不能实现呢?PowerShell自己没有直接可以使用的队列模块,不过可以调用.Net里面的类来实现。
下面是一个简单的例子
$queue = [System.Collections.Queue]::Synchronized( (New-Object System.Collections.Queue) )$lines=gc C:\temp\thebigproxylist-17-12-20.txtforeach($line in $lines){ $queue.enqueue($line)}write-host $queue.count$Throttle = 5 #threads#脚本块,对指定的IP测试端口,结果保存在一个对象里面$ScriptBlock = { Param ( [string]$value ) $ip=$value.Split(":")[0] $port=$value.Split(":")[1] $a=test-netconnection -ComputerName $ip -Port $port $RunResult = New-Object PSObject -Property @{ ComputerName=$ip Port=$port TCP=$a.TCPTestSucceeded } Return $RunResult}#创建一个资源池,指定多少个runspace可以同时执行$RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, $Throttle)$RunspacePool.Open()$Jobs = @()for($i=1;$i -lt 20;$i++){ $currentvalue=$queue.Dequeue() Write-Host $currentvalue $Job = [powershell]::Create().AddScript($ScriptBlock).addargument($currentvalue) $Job.RunspacePool = $RunspacePool $Jobs += New-Object PSObject -Property @{ Server = $currentvalue Pipe = $Job Result = $Job.BeginInvoke() }} #循环输出等待的信息.... 直到所有的job都完成 Write-Host "Waiting.." -NoNewlineDo { 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
结果如下
Waiting................................................................................All jobs completed!
Port ComputerName TCP
80 137.74.168.174 True
8080 103.28.161.68 True53281 91.151.106.127 False3128 177.136.252.7 True80 47.89.22.200 True8888 118.69.61.57 True8080 192.241.190.167 True80 185.124.112.130 True3128 83.65.246.181 True3128 79.137.42.124 True8080 95.0.217.32 False8080 104.131.94.221 True65301 177.234.7.66 True8080 37.57.179.2 False8080 197.211.27.234 True8080 139.59.117.11 True8080 168.0.158.53 False8080 154.48.196.1 True8080 139.59.125.53 True成功!
转载地址:http://zzwjx.baihongyu.com/