2012-08-15 65 views
1

作爲我的last question的後續工作,我想編譯一個perfmon計數器列表,它以1秒的時間間隔(默認值)生成並連續採樣(默認值爲-Continuous),睡眠持續60秒,然後運行Receive-job以獲得過去60秒的統計數據(-Average, -Sum, -Minimum, -Maximum)。從數組中獲取計數器路徑的開始作業

現在我遇到的問題是,當我使用絕對計數器路徑時,作業開始並處於「正在運行」狀態。如果我嘗試循環訪問性能計數器字符串數組,則作業狀態將變爲「已完成」。

以下是兩個代碼示例,顯示非工作和工作結果。

不起作用。工作狀態即使設置了「連續」,也會完成。沒有錯誤發生。

[email protected]{} 
[email protected]("\Processor(*)\% Processor Time", 
     "\Network Interface(*)\Bytes Received/sec", 
     "\Network Interface(*)\Bytes Sent/sec") 
foreach ($counterPath in $counters) { 
    $job=Start-Job {get-counter -Counter "$counterPath" -Continuous | foreach {$_.CounterSamples} } 
    $jobs[$job.id]=$counterPath 
} 

正常工作,但不允許多個櫃檯,通過循環開始作業。

[email protected]{} 
$job=Start-Job {get-counter -Counter "\Processor(*)\% Processor Time" -Continuous | foreach {$_.CounterSamples} } 
$jobs[$job.id]=$counter 

結果輸出

PS C:\Users\msnow> [email protected]{} 
[string]$counter="\Processor(*)\% Processor Time" 
$job=Start-Job {get-counter -Counter "$counter" -Continuous | foreach {$_.CounterSamples} } 
$jobs[$job.id]=$counter 

__________________________________________________________________________________________________________________________ 
PS C:\Users\msnow> [email protected]{} 
$job=Start-Job {get-counter -Counter "\Processor(*)\% Processor Time" -Continuous | foreach {$_.CounterSamples} } 
$jobs[$job.id]=$counter 

__________________________________________________________________________________________________________________________ 
PS C:\Users\msnow> Get-Job 

Id    Name   State  HasMoreData  Location    Command     
--    ----   -----  -----------  --------    -------     
1    Job1   Completed True   localhost   get-counter -Counter "... 
3    Job3   Running True   localhost   get-counter -Counter "... 
__________________________________________________________________________________________________________________________ 
PS C:\Users\msnow> receive-job -id 3 | measure CookedValue -sum -Average 


Count : 11466 
Average : 5.20268509822716 
Sum  : 59653.9873362726 
Maximum : 
Minimum : 
Property : CookedValue 

回答

1

我相信這個問題是在變量$計數器的範圍。開始作業運行其他運行空間中的腳本塊,並且該變量不可見。你需要把它作爲-ArgumentList。嘗試:

Start-Job {get-counter -Counter "$($args[0])" -Continuous | foreach {$_.CounterSamples} } -ArgumentList $counter 

Start-Job {param($counter) ; get-counter -Counter "$($counter)" -Continuous | % {$_.CounterSamples} } -ArgumentList $counter 
+0

那麼這肯定不明顯。 :)它不會出現'「$()」'包裝的$ args [0]是必需的。我*應該在腳本塊中包含這個原因嗎? – mattsn0w 2012-08-15 19:24:24

+0

在這種情況下,不,這是我的習慣。但是,如果俞想了解這些差異,請參閱http://huddledmasses.org/parenthesis-in-powershell/ – 2012-08-15 21:12:46