上下文:
我想运行一个测试,并在它运行时收集CPU利用率。基本上,当我开始测试时,我也想开始收集CPU利用率的数据,在测试结束时,我还想停止收集CPU利用度的数据(然后平均(
在Win7 上使用PowerShell 3
方法:
在测试开始时,我添加了一个启动后台作业的函数。后台作业执行一个脚本块,该脚本块运行"while($true("循环,该循环收集平均CPU利用率并将其保存到文件中。在测试结束时,我读取了文件,对收集到的数据求平均值,然后停止并删除作业。
问题:
对于当前的方法,脚本块并不总是被执行,也不会收集到新的数据。如果我运行测试几次,脚本块就会被执行(在其中一次运行中(——我想不出任何相关的东西或这种行为。此外,如果我在测试中的任何地方使用断点,脚本块总是会被执行
想不出其他方法了。
所需答案:
1.为什么脚本块没有被执行?以及如何让它执行
2.是否有其他方法可以在测试期间收集资源数据?
请注意,该代码已经经历了各种尝试和失败运行,不再"漂亮">
代码:
function Start-ResourceMonitor
{
param()
$avg=@()
$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
}
潜在的问题是测试运行的时间在2到60秒之间,在某些运行中,Get-WmiObject的运行时间比测试运行时间长,因此没有为这些运行执行使用收集的度量创建文件的代码
在启动作业后(while和sleep(添加等待循环,以使作业真正开始运行并创建文件,从而解决了问题
问题中的代码也已随解决方案更新。