从数组中获取计数器路径的开始工作

Posted

技术标签:

【中文标题】从数组中获取计数器路径的开始工作【英文标题】:Start-Job of Get-Counter paths from array 【发布时间】:2012-08-15 00:23:59 【问题描述】:

作为我last question 的后续行动,我想编译一个 perfmon 计数器列表,这些计数器以 1 秒间隔(默认)与Start-Job 一起生成并连续采样(-Continuous),然后休眠 60 秒运行 Receive-job 以获取过去 60 秒的统计信息 (-Average, -Sum, -Minimum, -Maximum)。

我现在遇到的问题是,当我使用绝对计数器路径时,作业开始并保持在“运行”状态。如果我尝试遍历性能计数器字符串数组,则作业状态将变为“已完成”。

这里有两个代码示例,显示了非工作和工作结果。

不起作用。即使设置了 -Continuous,作业状态也会完成。不会引发任何错误。

$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:\Users\msnow> $jobs=@
[string]$counter="\Processor(*)\% Processor Time"
$job=Start-Job get-counter -Counter "$counter" -Continuous | foreach $_.CounterSamples 
$jobs[$job.id]=$counter

__________________________________________________________________________________________________________________________
PS C:\Users\msnow> $jobs=@
$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】:

我认为问题出在变量 $counter 的范围内。 Start-job 在其他运行空间中运行脚本块并且它不可见的变量。您需要将其作为 -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

【讨论】:

这当然不是很明显。 :) 它似乎不需要 $args[0] 的 "$()" 包装。我是否有理由应该将它包含在脚本块中? 在这种情况下不,这更像是我的习惯。但如果你想了解这些差异,请参阅huddledmasses.org/parenthesis-in-powershell

以上是关于从数组中获取计数器路径的开始工作的主要内容,如果未能解决你的问题,请参考以下文章

vue for循环中的saldo计数器给出无限循环错误

在 Swift 中通过计数从多维数组中找到最大的数组

分组表视图中单元格的索引路径

如何从 Windows 服务总线订阅中获取未处理的消息计数?

2022-04-09:给你两个长度分别 n 和 m 的整数数组 nums 和 multipliers ,其中 n >= m , 数组下标 从 1 开始 计数。 初始时,你的分数为 0 。 你需要执行恰

从其他特定集合中获取文档计数颤振火力基地