[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
可以尝试下多线程,线程数越多越快,取决你的cpu
数据处理函数可以自行优化
  1. #&cls&cd /d "%~dp0" & @powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" & pause&exit
  2. cls
  3. $t1 = Get-Date
  4. $src_dir = '新建文件夹'
  5. $dst_dir = 'out'
  6. [void][System.IO.Directory]::CreateDirectory($dst_dir)
  7. #线程函数 处理数据
  8. $HandleGroupJob = {
  9.     #线程参数
  10.     param($dst_dir,$groupInfo)
  11.     Write-Host $groupInfo.Name
  12.     #汇总去重并筛选
  13. $set = New-Object 'System.Collections.Generic.HashSet[string]'
  14.     & { $groupInfo.Group | foreach { [IO.File]::ReadAllLines($_.FullName)} } | foreach {
  15. if($_ -match '\S+\s+\d+\s+-?\d{2,}'){
  16. [void]$set.Add(($_ -replace 'SH','1|' -replace 'SZ','0|' -replace '\s+','|'))
  17. }
  18. }
  19.     #输出
  20.     Out-File -InputObject $set -FilePath ('{0}\{1}' -f $dst_dir,$groupInfo.Name)
  21. $set = $null
  22.     return ($groupInfo.Name + ' 已完成')
  23. }
  24. #多线程设置
  25. $pool = [runspacefactory]::CreateRunspacePool(1,10) #最多10个线程并发
  26. $pool.Open()
  27. $threads = New-Object 'System.Collections.ArrayList'
  28. $results = New-Object 'System.Collections.ArrayList'
  29. '开始创建线程...'
  30. Get-ChildItem -Recurse -Path $src_dir -Filter '*.txt' | Group-Object {$_.Name} | foreach {
  31.     $_.Name
  32.     $thread = [powershell]::Create()
  33.     $thread.RunspacePool = $pool
  34.     [void]$thread.AddScript($HandleGroupJob)
  35.     [void]$thread.AddArgument($dst_dir)
  36.     [void]$thread.AddArgument($_)
  37.     [void]$threads.Add($thread)
  38.     [void]$results.Add($thread.BeginInvoke())
  39. }
  40. '-------------------------------'
  41. '等待线程结束'
  42. while($true){
  43.     $all_done = $true
  44.     for($i = 0; $i -lt $results.Count; $i++){
  45.         if($results[$i] -ne $null){
  46.             if($results[$i].IsCompleted){
  47.                 $threads[$i].EndInvoke($results[$i])
  48. $threads[$i].Dispose()
  49. $threads[$i] = $null
  50.                 $results[$i] = $null
  51. [System.GC]::Collect()
  52.             } else {
  53.                 $all_done = $false
  54.             }
  55.         }
  56.     }
  57.     if($all_done){ break }
  58.     Start-Sleep -Milliseconds 500
  59. }
  60. #关闭线程池
  61. $pool.Close()
  62. '-------------------'
  63. '{0}  -> {1}' -f $t1,(Get-Date)
复制代码

TOP

回复 45# went


    线程不要设置过多,不然cpu容易爆满

TOP

回复 47# idwma


     估计是[void]直接强转成了$null才不会输出

TOP

返回列表