茅屋为秋风 发表于 2018-9-2 11:45:52

30. PowerShell -- 后台作业、异步操作实例

  如果需要加快执行一个脚本,你可能需要用到后台作业。后台作业能同时运行脚本中多个事件
  Powershell是单线程程序且一次只能做一件事情。后台作业能额外增加Powershell进程在后台处理作业。当需要程序同时运行且数据量不是很大时它能很好的解决问题。但从Powershell后台回传数据是一个非常麻烦的工作,它将浪费很多时间。将会导致脚本更慢。
  1. 这里有3个并发执行任务:
  代码如下:
  $start = Get-Date
  # get all hotfixes
  $task1 = { Get-Hotfix }
  # get all scripts in your profile
  $task2 = { Get-Service | Where-Object Status -eq Running }
  # parse log file
  $task3 = { Get-Content -Path $env:windir\windowsupdate.log | Where-Object { $_ -like '*successfully installed*' } }
  # run 2 tasks in the background, and 1 in the foreground task
  $job1 =Start-Job -ScriptBlock $task1
  $job2 =Start-Job -ScriptBlock $task2
  $result3 = Invoke-Command -ScriptBlock $task3
  # wait for the remaining tasks to complete (if not done yet)
  $null = Wait-Job -Job $job1, $job2
  # now they are done, get the results
  $result1 = Receive-Job -Job $job1
  $result2 = Receive-Job -Job $job2
  # discard the jobs
  Remove-Job -Job $job1, $job2
  $end = Get-Date
  Write-Host -ForegroundColor Red ($end - $start).TotalSeconds
  上面执行全部的任务消耗了5.9秒。三个任务的结果将分别存入$result1, $result2, 和 $result3.
  2. 让我们再继续查看相继在前台执行完命令需要多长时间:
  代码如下:
  $start = Get-Date
  # get all hotfixes
  $task1 = { Get-Hotfix }
  # get all scripts in your profile
  $task2 = { Get-Service | Where-Object Status -eq Running }
  # parse log file
  $task3 = { Get-Content -Path $env:windir\windowsupdate.log | Where-Object { $_ -like '*successfully installed*' } }
  # run them all in the foreground:
  $result1 = Invoke-Command -ScriptBlock $task1
  $result2 = Invoke-Command -ScriptBlock $task2
  $result3 = Invoke-Command -ScriptBlock $task3
  $end = Get-Date
  Write-Host -ForegroundColor Red ($end - $start).TotalSeconds
  结果,这次只花费了5.05秒。与后台作业几乎同时完成,所以后台作业更适合解决长时间执行的任务。从三个任务返回的数据观察,好处是这种按顺数在前台获得数据能减少了执行过程的开销。
  参考:
  http://www.iyunv.net/article/49074.htm

页: [1]
查看完整版本: 30. PowerShell -- 后台作业、异步操作实例