最近在学Python的爬虫,昨天试着用多线程去使用不同的代理IP,基本原理是把所有的IP地址都放入一个队列,然后使用多线程地去读取队列里面的值。
今天突然想到,类似的方式在PowerShell里面能不能实现呢?PowerShell自己没有直接可以使用的队列模块,不过可以调用.Net里面的类来实现。
下面是一个简单的例子
$queue = [System.Collections.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 (
[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.." -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
结果如下
Waiting................................................................................All jobs completed!
Port ComputerName TCP
80 137.74.168.174 True
8080 103.28.161.68 True
53281 91.151.106.127 False
3128 177.136.252.7 True
80 47.89.22.200 True
8888 118.69.61.57 True
8080 192.241.190.167 True
80 185.124.112.130 True
3128 83.65.246.181 True
3128 79.137.42.124 True
8080 95.0.217.32 False
8080 104.131.94.221 True
65301 177.234.7.66 True
8080 37.57.179.2 False
8080 197.211.27.234 True
8080 139.59.117.11 True
8080 168.0.158.53 False
8080 154.48.196.1 True
8080 139.59.125.53 True
成功!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。