Powershell 从阵列获取计数器路径的启动作业

Powershell 从阵列获取计数器路径的启动作业,powershell,performancecounter,Powershell,Performancecounter,作为我的后续工作,我想编译一个perfmon计数器列表,这些计数器以1秒的间隔(-Continuous)以开始作业,睡眠60秒,然后运行接收作业,以获得过去60秒的统计数据(-Average,-Sum,-Minimum,-Maximum) 我现在遇到的问题是,当我使用当时的绝对计数器路径时,作业开始并保持在“运行”状态。如果我尝试遍历性能计数器字符串数组,则作业状态变为“已完成” 下面是两个显示非工作和工作结果的代码示例 不起作用。即使设置了-Continuous,作业状态也已完成。没有出现错误

作为我的后续工作,我想编译一个perfmon计数器列表,这些计数器以1秒的间隔(
-Continuous
)以
开始作业
,睡眠60秒,然后运行
接收作业
,以获得过去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

我相信问题在可变$counter的范围内。Start job在其他运行空间中运行scriptblock,变量it不可见。您需要将其作为-argumentlist传递。请尝试:

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


当然,这并不明显似乎不需要包装$args[0]。有什么理由我应该把它包含在脚本块中吗?在这种情况下没有,这是我的一个习惯。但如果你想了解这些差异,请参见
Start-Job {param($counter) ; get-counter -Counter "$($counter)" -Continuous | % {$_.CounterSamples} } -ArgumentList $counter