玩轉PowerShell第一節——【后台任務處理】-技術&分享


概述

   相信大家對后台任務處理不陌生,比如.Net的后台線程處理,Java的線程處理等等。

而當我們用PowerShell這個強大的工具時怎么樣開啟后台任務呢,以及怎樣處理這些任務呢,本篇將會告訴你PowerShell后台任務處理。

1.什么時候會用到后台任務                                         

當本地機器需要執行一個動作,此動作需要耗費很長時間,而機器在這段時間內只能等待,而我們希望在機器等待的這段時間內,我們還可以做其他事情。

這樣我們就可以用后台任務來解決上面遇到的問題。

2.后台任務主要用在哪些場景                                      

(1)將文件拷貝到多台遠程機器,可以開啟多個任務進行並行拷貝

(2)多台遠程機器同時安裝文件,可以開啟多個任務進行並行安裝

等等

3.PowerShell里面怎么開啟后台任務                      

(1)Start-Job

1 $StartJob = Start-Job -ScriptBlock {Get-Process}
2 $StartJob 

Id     Name     PSJobTypeName       State          HasMoreData     Location         Command       
--     ----             -------------           -----             -----------         --------             -------       
7      Job7         BackgroundJob      Running          True            localhost         Get-Process 

我們能夠從上面看到
$StartJob名字叫做Job7,Job的類型為后台Job,狀態為Running,Command表示執行的命令式Get-Process 

 

(2)Invoke-Command -AsJob

1 $InvokeCommandJob  = Invoke-Command -ComputerName LocalHost -ScriptBlock {Get-Process} -AsJob
2 $InvokeCommandJob

Id     Name      PSJobTypeName   State         HasMoreData   Location        Command                  
--     ----            -------------     -----         -----------       --------             -------                  
15     Job15       RemoteJob        Running       True              LocalHost       Get-Process 

我們能夠從上面看到
$InvokeCommandJob的類型為后台RemoteJob,表示遠程執行的Job,這里我用到的遠程機器為LocalHost本地機器作為測試機器,
大家可以用遠程機器名替換這個地方的LocalHost

 

開啟了一個任務后,我們總不能不管它吧,現在來說下怎么處理這些Job

4.處理Job                                                           

(1)Wait-Job

1 #創建一個等待1s的后台任務
2 $WaitJob1  = Start-Job -ScriptBlock {Sleep -Seconds 10}
3 #創建一個等待5s的后台任務
4 $WaitJob2  = Start-Job -ScriptBlock {Sleep -Seconds 15}
5 #等待兩個Job完成
6 Wait-Job -Job $WaitJob1,$WaitJob2 -Timeout 2
Id     Name       PSJobTypeName   State         HasMoreData     Location    Command                  
--     ----            -------------       -----         -----------     --------             -------                  
31     Job31      BackgroundJob   Completed     False           localhost       Sleep -Seconds 1         
33     Job33     BackgroundJob     Running       True            localhost       Sleep -Seconds 5 
從上面的執行結果可以看到$WaitJob2的狀態為Running,因為等待的時間不夠長,如果將等待的超時時間改長一點就可以了,代碼如下:
1 Wait-Job -Job $WaitJob1,$WaitJob2 -Timeout 10

 還有一些等待Job完成的命令

1 Wait-Job -Id $WaitJob1.Id,$WaitJob2.Id -Timeout 10
2 Wait-Job -Name $WaitJob1.Name,$WaitJob2.Name -Timeout 10
3 Wait-Job -InstanceId $WaitJob1.InstanceId,$WaitJob2.InstanceId -Timeout 10
4 Wait-Job -State Running -Timeout 10
通過上面的例子我們可以通過設定Timeout的時間來監控Job的狀態

(2)Remove-Job

1 Remove-Job -Id $WaitJob1.Id,$WaitJob2.Id
2 Remove-Job -Name $WaitJob1.Name,$WaitJob2.Name
3 Remove-Job -InstanceId $WaitJob1.InstanceId,$WaitJob2.InstanceId
4 Remove-Job -State Completed
Remove Job的時候一定要注意,如果該Job得狀態不是完成的或者是停止的,就會拋出異常:
Remove-Job : The command cannot remove the job with the job ID 67 because the job is not finished. To remove the job, first
 stop the job, or use the Force parameter.
Parameter name: Job

如果要強制Remove Job,可以在后面添加一個參數-Force
1 Remove-Job -Job $WaitJob1,$WaitJob2 -Force

 下面我來講一個非常有趣的問題

5.Start-Job傳參                                                

比如我們現在要開啟一個Job,計算$c=$a+$b,然后將計算結果寫入到D:\a.txt文本文件中

 

1 $a = 1  
2 $b = 2  
3 $c = 0  
4 $Job = Start-Job -ScriptBlock {  
5         $c = $a + $b  
6         $c > "D:\a.txt"  
7     }

 

OK,代碼寫好了,運行之后,我們期望得到的結果是D:\a.txt文本文件中的內容為3

 

但是事實上文本文件中的內容為空,這是為什么呢?因為我們忽略了一個問題:

 

ScriptBlock里面的參數都是需要參數傳遞進去的。

 

修改上面的代碼:

 

1 $a = 1
2 $b = 2
3 $c = 0
4 $Job = Start-Job -ArgumentList $a,$b -ScriptBlock {
5         param($a,$b)
6         $c = $a + $b
7         $c > "d:\a.txt"
8     }

 運行上面的代碼,可以看到文本文件中的內容為3。

6.引用&擴展閱讀                                                

以下鏈接為微軟提供的技術資料:

http://technet.microsoft.com/library/2bc04935-0deb-4ec0-b856-d7290cca6442(v=wps.630).aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM