本帖最后由 went 于 2020-6-25 10:58 编辑
了解下powershell的多线程
存为bat,ANSI编码
测试了下线程太多容易卡死,建议只开5个线程- @powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" &pause&exit
- #参数
- $unicodeFile="C:\Users\lenovo\Desktop\a.txt"; #unicode文件路径
- $saveFile="C:\Users\lenovo\Desktop\data.csv"; #保存的csv文件路径
- $maxThreadCount=5; #最大线程
- if((Test-Path $saveFile)){Remove-Item -Path $saveFile}
- #任务脚本
- $queryJob={
- param($unicode="")
- if($unicode -eq ""){return;}
- $word="";$kMandarin=""
- $ie=New-Object -ComObject "InternetExplorer.Application";
- $ie.Visible=$false;
- $ie.Navigate("https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint="+$unicode);
- while($ie.Busy){Start-Sleep -Seconds 1}
- $text=$ie.Document.querySelector("body").innerText;
- if($text -match "Your Browser\s*(\S*?)\s"){$word=$Matches[1]}
- if($text -match "kMandarin\s*(\S*?)\s"){$kMandarin=$Matches[1]}
- $ie.Quit();
- return $unicode+","+$word+","+$kMandarin;
- }
- #设置线程池
- $pool=[runspacefactory]::CreateRunspacePool(1,$maxThreadCount);
- $pool.Open(); #打开线程池
- $threads=New-Object "System.Collections.ArrayList"; #线程集
- $results=New-Object "System.Collections.ArrayList"; #结果集
- #开始创建线程
- Get-Content $unicodeFile | Select-Object -Unique | foreach {
- Write-Host ("添加任务:{0}" -f $_);
- $thread=[powershell]::Create(); #新建线程
- $thread.RunspacePool=$pool; #设置线程池
- [void]$thread.AddScript($queryJob); #任务脚本
- [void]$thread.AddArgument($_.Trim()); #任务参数
- [void]$threads.Add($thread); #保存线程
- [void]$results.Add($thread.BeginInvoke()); #保存结果
- }
- Write-Host "任务全部创建完成!`n"
- #监视线程状态,1秒更新一次
- $datas=New-Object "System.Collections.ArrayList";
- $count=0;
- while($true){
- $allDone=$true;
- for($i=0;$i -lt $results.Count;$i++){
- if($results[$i] -ne $null){
- if($results[$i].IsCompleted){
- $data=$threads[$i].EndInvoke($results[$i])[0];
- Write-Host ("{0} 任务完成" -f $data);
- [void]$datas.Add($data);
- $threads[$i].Dispose();
- $threads[$i]=$null;
- $results[$i]=$null;
- $count++;
- [System.Console]::Title="进度:{0}/{1} " -f $count,$threads.Count;
- } else {
- $allDone=$false;
- }
- }
- }
- if($allDone){break};
- Start-Sleep -Seconds 1
- }
- Write-Host "任务全部完成!`n"
- #写入文件
- $datas | Out-String | Out-File $saveFile -Encoding unicode
- Write-Host ("已写入文件: {0}" -f $saveFile);
- #关闭线程池
- $pool.Close();
复制代码
|