作为我最后一个问题的后续,我想编译一个 perfmon 计数器列表,这些计数器以 1 秒间隔(默认)生成并连续采样( -Continuous
) 与 Start-Job
,睡眠 60 秒然后运行Receive-job
以获取过去 60 秒的统计数据(-Average, -Sum, -Minimum, -Maximum
)。
我现在遇到的问题是,当我使用绝对计数器路径时,作业启动并保持"正在运行"状态。如果我尝试循环访问性能计数器字符串数组,则作业状态将变为"已完成"。
下面是两个显示非工作和工作结果的代码示例。
不行。作业状态 即使设置了"连续",作业状态也会完成。不会引发任何错误。
$jobs=@{}
$counters=@("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
}
按预期工作,但不允许多个计数器通过循环启动作业。
$jobs=@{}
$job=Start-Job {get-counter -Counter "Processor(*)% Processor Time" -Continuous | foreach {$_.CounterSamples} }
$jobs[$job.id]=$counter
生成的输出
PS C:Usersmsnow> $jobs=@{}
[string]$counter="Processor(*)% Processor Time"
$job=Start-Job {get-counter -Counter "$counter" -Continuous | foreach {$_.CounterSamples} }
$jobs[$job.id]=$counter
__________________________________________________________________________________________________________________________
PS C:Usersmsnow> $jobs=@{}
$job=Start-Job {get-counter -Counter "Processor(*)% Processor Time" -Continuous | foreach {$_.CounterSamples} }
$jobs[$job.id]=$counter
__________________________________________________________________________________________________________________________
PS C:Usersmsnow> 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:Usersmsnow> receive-job -id 3 | measure CookedValue -sum -Average
Count : 11466
Average : 5.20268509822716
Sum : 59653.9873362726
Maximum :
Minimum :
Property : CookedValue
问题出在变量$counter的范围内。启动作业在其他运行空间中运行脚本块,并且变量不可见。您需要将其作为 -argumentlist .try 传递:
Start-Job {get-counter -Counter "$($args[0])" -Continuous | foreach {$_.CounterSamples} } -ArgumentList $counter
或
Start-Job {param($counter) ; get-counter -Counter "$($counter)" -Continuous | % {$_.CounterSamples} } -ArgumentList $counter