亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PowerShell > 正文

PowerShell中Job相關命令及并行執行任務詳解

2020-03-26 18:52:08
字體:
來源:轉載
供稿:網友

前言

在 PowerShell 中可以輕松的執行后臺任務并且讓多個后臺任務并行執行。本文介紹 PowerShell 中 Job 相關的一些命令,并通過 demo 演示如何在后臺同時執行多個任務。下面話不多說了,來一起看看詳細的介紹吧。

PowerShell 中執行后臺任務的模式

下圖描述了在 PowerShell 中執行后臺任務的進程模型(此圖來自互聯網):

powershell,并行,job,命令

首先我們需要一個 PowerShell 進程執行與用戶交互的命令,比如執行 Start-Job 命令運行一個后臺任務。每一個這樣的后臺任務都會在一個新啟動的 PowerShell 進程中執行。所以,如果我們同時啟動三個后臺任務,那么一共有四個 PowerShell 進程在同時運行。

Job 相關的命令

Start-Job 命令會啟動一個運行在后臺的任務。注意,每通過 Start-Job 命令運行一個任務都會創建一個單獨的 PowerShell 進程。

Stop-Job 命令用來停止一個正在運行的后臺任務(由 Start-Job 啟動的任務)。

Get-Job 命令用來獲得當前 session 中的后臺任務對象。

Wait-Job 命令阻塞當前的執行流程,等待指定的后臺任務執行結束。

Receive-Job 命令用來獲得后臺執行任務的執行結果。比如在一個后臺任務結束時,可以通過 Receive-Job 來得到結果,并輸出任務執行時的 output。

Remove-Job 命令刪除當前 session 中的已經完成的任務。當一個任務運行結束后,它并不會被自動刪除,除非你調用 Remove-Job 命令進行刪除,或者是關閉這個 session。如果使用 Remove-Job 刪除一個正在運行的任務,命令會運行失敗。此時需要先使用 Stop-Job 命令先停止任務,然后再用 Remove-Job 進行刪除。

在后臺執行任務

如果只是啟動一個后臺執行的任務,不需要知道任務執行的結果,也不關心任務何時執行結束,那么僅僅使用 Start-Job 命令啟動任務的執行就可以了:

> Start-Job -ScriptBlock { sleep 5 }

啟動單個任務并等待任務結束

多數情況下我們是需要知道任務的結束時間的,此時可以通過 Wait-Job 命令阻塞執行流程,直到等待的任務結束:

> Start-Job -ScriptBlock { sleep 5; Write-Host "Hello world."; } | Wait-Job

powershell,并行,job,命令

注意:上面的內容是由 Wait-Job 命令輸出的,當時任務的狀態為 "Completed"。

更進一步,我們還想要獲得任務執行過程中的輸出。這時我們就需要用到 Receive-Job 命令。你可以在任務啟動后的任何時刻執行 Receive-Job 命令,但是如果想要得到完整的輸出,就需要在任務結束后調用,此時需要配合 Wait-Job 命令一起使用:

$job = Start-Job -ScriptBlock { sleep 5; Write-Host "Hello world."; }Wait-Job $jobReceive-Job -Job $job

把上面的代碼保存到文件 mytask.ps1 中執行:

powershell,并行,job,命令

Receive-Job 命令輸出了我們在后臺執行的任務的 output。

在后臺執行多個任務并等待結束

因為 Start-Job 命令是非阻塞的,所以理論上我們可以執行任意多次從而啟動很多的后臺任務。和等待單個任務相同,仍然可以使用 Wait-Job 命令來等待所有的任務結束,不過此時需要配合 Get-Job 命令一起使用:

> Get-Job | Wait-Job

更常用的方式是我們在 while 循環中不斷的檢查任務的狀態,當所有任務的狀態都是 "Completed" 時表示全部任務執行結束:

Remove-Job *#測試計時開始$start_time = (Get-Date)Start-Job -ScriptBlock { sleep 9; Write-Host "Hello myJob1."; } -Name "myJob1"Start-Job -ScriptBlock { sleep 5; Write-Host "Hello myJob2."; } -Name "myJob2"$taskCount = 2while($taskCount -gt 0){ foreach($job in Get-Job) {  $state = [string]$job.State  if($state -eq "Completed")  {    Write-Host($job.Name + " 已經完成")   Receive-Job $job   $taskCount--   Remove-Job $job  } } sleep 1}"所有任務已完成" #得出任務運行的時間(New-TimeSpan $start_time).totalseconds

把上面的代碼保存到 mytask.ps1 文件中并執行:

powershell,并行,job,命令

代碼中我們給每個任務起了名字,并在 while 循環中不斷的使用 Get-Job 命令檢查任務當前的狀態,如果發現任務的狀態為 "Completed",就通過 Remove-Job 命令刪除它,并在刪除前打印任務的名稱和 output。

封裝一個執行后臺任務的函數

下面我們用封裝一個簡單的函數來并行執行多個任務:

function Run-Tasks{ Param (  $taskArr,  $parallelcount=1 ) #測試計時開始 $startTime = (Get-Date)  #移除本次會話中已有的所有后臺任務 Remove-Job * # 使用變量 $taskCount 保存還沒有執行完成的任務數 $taskCount = $taskArr.Length  #判斷設定的并行任務數是否超過當前任務隊列中的任務數 if($parallelCount -gt $taskArr.Length) {  $parallelCount = $taskArr.Length } #啟動初始任務 foreach($i in 1..$parallelCount) {  Start-Job $taskArr[$i - 1] -Name "task$i" } #初始任務完成后開始的任務 $nextIndex = $parallelCount #當任務隊列中還有任務時不斷輪詢已建立的任務,當一個后臺任務結束時刪除這個任務, #然后從任務隊列中取出下一個任務進行執行,然后等待所有任務執行完成。 while(($nextIndex -lt $taskArr.Length) -or ($taskCount -gt 0)) {  foreach($job in Get-Job)  {   $state = [string]$job.State   if($state -eq "Completed")   {     Write-Host($job.Name + " 已經完成,結果如下:")    Receive-Job $job    Remove-Job $job    $taskCount--    if($nextIndex -lt $taskArr.Length)    {      $taskNumber = $nextIndex + 1     Start-Job $taskArr[$nextIndex] -Name "task$taskNumber"     $nextIndex++    }   }  }  sleep 1 } "所有任務已完成" #得出任務運行的時間 (New-TimeSpan $startTime).totalseconds}

上面的函數會在后臺執行用戶的任務,然后等待所有的任務執行結束。并且用戶可以指定同時執行的任務的個數,在任務執行完成后,輸出任務的 output。接下來讓我們嘗試使用這個函數執行一些任務:

#定義 6 個任務$task1 = {sleep 12; Write-Host "Hello myJob1."; }$task2 = {sleep 5; Write-Host "Hello myJob2."; }$task3 = {sleep 8; Write-Host "Hello myJob3."; }$task4 = {sleep 3; Write-Host "Hello myJob4."; }$task5 = {sleep 20; Write-Host "Hello myJob5."; }$task6 = {sleep 15; Write-Host "Hello myJob6."; } #將 6 個任務寫入到一個數組中作為任務隊列$taskArr = $task1, $task2, $task3, $task4, $task5, $task6#運行數組中的任務,允許同時運行 4 個任務Run-Tasks -taskArr $taskArr -parallelcount 4

下面是運行的結果:

powershell,并行,job,命令

總結

能夠隨心所欲的在后臺執行任務是一件感覺非常棒的事情!當然,對于工作來說你能夠把事情做得又快又好(又好可不敢說)。本文只是提供了一個簡單的運行并行任務的 demo,省略了異常處理等重要內容,但這已經足夠您開始 PowerShell 并行任務之旅了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国模精品一区二区三区色天香| 国产精品第七十二页| 亚洲国产精品一区二区久| 亚洲成人在线视频播放| 亚洲三级 欧美三级| 岛国视频午夜一区免费在线观看| 国产精品电影观看| 成人亚洲欧美一区二区三区| 成人深夜直播免费观看| 欧美一区二区大胆人体摄影专业网站| 久久精品99无色码中文字幕| 91成人在线观看国产| 55夜色66夜色国产精品视频| 啪一啪鲁一鲁2019在线视频| 欧美一性一乱一交一视频| 亚洲有声小说3d| 亚洲一区二区三区成人在线视频精品| 精品久久久国产| 日韩视频在线免费| 欧美另类交人妖| 国产视频在线观看一区二区| 国产精品99久久久久久白浆小说| 国产精品xxx视频| 日本精品视频在线观看| 中文字幕自拍vr一区二区三区| 精品成人av一区| 国产精品免费电影| 欧美日韩国产一中文字不卡| 爽爽爽爽爽爽爽成人免费观看| 亚洲成成品网站| 91av在线精品| 中文字幕在线观看亚洲| 久久久亚洲网站| 国产精品高潮粉嫩av| 欧美专区国产专区| 亚洲第一区中文字幕| 精品国产91久久久| 久久久久久久亚洲精品| 欧美另类69精品久久久久9999| 久久精品精品电影网| 国产精品免费视频xxxx| 中文字幕亚洲图片| 国产亚洲激情视频在线| 亚洲伦理中文字幕| 国产精品久久中文| 精品中文字幕在线观看| 午夜精品久久久久久99热软件| 久久免费视频在线| 国产精品成av人在线视午夜片| 欧美孕妇毛茸茸xxxx| 亚洲精品wwww| 欧美猛男性生活免费| 91精品视频在线看| 国产亚洲人成a一在线v站| 狠狠操狠狠色综合网| 91精品国产色综合| 亚洲国产精品久久久久秋霞蜜臀| 欧美老少做受xxxx高潮| 亚洲综合大片69999| 国产热re99久久6国产精品| 亚洲经典中文字幕| 亚洲国产精品视频在线观看| 情事1991在线| 国模私拍视频一区| 午夜欧美大片免费观看| 日韩三级影视基地| 麻豆乱码国产一区二区三区| 性日韩欧美在线视频| 国产亚洲激情在线| 国产美女直播视频一区| 日韩精品久久久久久久玫瑰园| 国产精品久久久久久久久久ktv| 国产精品欧美日韩| 中文字幕精品网| 欧美成在线视频| 国产在线不卡精品| 国产性猛交xxxx免费看久久| 欧美亚洲在线观看| 日韩精品在线观看视频| 日韩av片免费在线观看| 亚洲女人天堂色在线7777| 欧美猛交ⅹxxx乱大交视频| 亚洲美腿欧美激情另类| 2018中文字幕一区二区三区| 国产精品亚洲第一区| 国产91av在线| www.欧美精品| 国产精品久久久久秋霞鲁丝| 亚洲欧美国内爽妇网| 国产成人精品国内自产拍免费看| 亚洲欧美中文另类| 亚洲专区在线视频| 亚洲自拍在线观看| 欧美黑人视频一区| 久久五月天色综合| 亚洲aⅴ男人的天堂在线观看| 97色在线观看| 136fldh精品导航福利| 亚洲香蕉伊综合在人在线视看| 91精品国产91久久久久久不卡| 欧美精品免费看| 一区二区亚洲精品国产| 亚洲成人xxx| 亚洲人午夜色婷婷| 国产日韩欧美在线看| 久久久亚洲网站| 日韩www在线| 久久久999国产| 影音先锋欧美精品| 欧美视频在线观看免费网址| 精品国产精品三级精品av网址| 日韩高清电影好看的电视剧电影| 精品久久久久久久久中文字幕| 欧美激情综合亚洲一二区| 精品国产成人av| 欧美黑人xxx| 亚洲大胆人体av| 国产精品一区=区| 欧美视频13p| 成人久久久久久| 91av免费观看91av精品在线| 国产精品视频久久久久| 国产99久久久欧美黑人| 在线观看日韩欧美| 欧美日本中文字幕| 亚洲欧美成人一区二区在线电影| 成人网址在线观看| 超碰日本道色综合久久综合| 国产精品久久久久久久久影视| 操日韩av在线电影| 日韩av网址在线观看| 91在线网站视频| 亚洲国产中文字幕在线观看| 亚洲欧洲日产国码av系列天堂| 欧美xxxwww| 中日韩美女免费视频网站在线观看| 欧美激情视频网址| 国产福利视频一区| 亚洲白拍色综合图区| 国产精品久久久久久久久男| 亚洲国产成人爱av在线播放| 欧美第一黄网免费网站| 中文字幕av一区二区三区谷原希美| 91高清视频免费观看| 亚洲高清免费观看高清完整版| 亚洲国产日韩欧美在线动漫| 久久久人成影片一区二区三区| 91在线观看免费观看| 91精品中文在线| 精品国产乱码久久久久久天美| 在线成人激情黄色| 国精产品一区一区三区有限在线| 国产一区二区三区视频在线观看| 国产精品久久91| 欧美亚洲国产视频| 亚洲国产天堂网精品网站| 九九精品视频在线| 中文字幕在线看视频国产欧美| 精品国产鲁一鲁一区二区张丽| 亚洲精品一区二区三区不| 亚洲影院色无极综合| 久久久久久久97| 日韩视频免费大全中文字幕| 国产精品久久久久久久久久东京|