上下文:
我想運行一個測試,並在運行時收集CPU利用率。基本上,當我開始測試時,我也想開始收集CPU利用率的數據,在測試結束時,我也想停止收集CPU利用率的數據(以及之後的平均值)。
在Win7的在PowerShell中獲取測試執行的平均CPU利用率
方法使用PowerShell 3:
在測試開始時我還說,啓動一個後臺作業的功能。後臺作業執行腳本塊,該腳本運行'while($ true)'循環,收集平均CPU使用率並將其保存到文件中。在測試結束時,我讀取文件,對收集到的數據進行平均,並停止並刪除作業。
問題:
對於目前的做法,該腳本塊並不總是得到執行,並沒有新的數據被收集。如果我多次運行測試,scriptblock會被執行(在其中一個運行中) - 我無法想到任何與此相關或相關的行爲。如果我在測試中的任何地方使用斷點,scriptblock也會被執行。
想不到另一種方法。
想要的答案:
1.爲什麼不執行腳本塊?以及如何讓它執行?
2.在測試過程中是否有另一種方法來收集資源數據?
請注意,代碼已經通過各種嘗試和失敗運行,不再'漂亮'。
代碼:
function Start-ResourceMonitor
{
param()
[email protected]()
$timestamp = Get-Date -Format o | foreach {$_ -replace ":", "."}
$compName=$env:COMPUTERNAME
$myFilePath = Join-Path -path $env:TEMP -childpath .\temp_$timestamp.txt
$scriptBlock = {
$avgSB = $args[0]
$timestampSB = $args[1]
while ($true) {
$avgSB += Get-WmiObject win32_processor -computername $args[2] | Measure-Object -property LoadPercentage -Average | Foreach {$_.Average}
$avgSB | Out-File -FilePath $args[3] -Force
start-sleep -Milliseconds 500
}
}
$res = start-job -RunAs32 -Name 'MyJob' -ScriptBlock $scriptBlock -ArgumentList @($avg,$timestamp,$compName,$myFilePath)
while (($res.State -ne 'Running') -or (-not (Test-Path $myFilePath))){
start-sleep -Milliseconds 500
}
}
[other test functions]
function Stop-ResourceMonitor
{
param()
Stop-Job -Name MyJob
$testFN = Get-ChildItem -Path $env:TEMP -Filter "temp*.txt" | sort LastWriteTime -Descending | select -First 1
$global:CPU_Average = get-content -path $testFN.FullName
$global:CPU_Average | Measure-Object -Average | select -ExpandProperty Average | Write-Host
Remove-Job -Name MyJob
}
我擔心'Job'已被添加,但執行尚未開始(即'State'沒有變成'Running')。當你創建一個'Job'時,你放棄處理'Scriptblock'的調度。由於您正在等待'Job'開始執行,您是不是可以這樣做,因爲'Start-ResourceMonitor'中的最後一行是在一個循環中休眠,直到'Job'的'State'變爲'Running '? –
@ robert.westerlund我試過了你的建議,但得到了同樣的結果。爲了調試目的(僅限本地版本),我在停止它之前輸出作業狀態,在Stop-ResourceMonitor中 - 在我所有的運行狀態中,狀態一直在運行。 – Mircea
是的,但是'Job'可能在你停止之前開始運行,也就是在你完成實際測試之後。如果在執行實際測試之前輸出工作狀態,我猜測它不處於'運行'狀態。再一次,我只是在猜測,因爲我不確定你是如何確定「scriptblock並不總是被執行的」。 –