1

前回の質問のフォローアップとして、生成され、1秒-Continuous間隔 (デフォルト) で継続的にサンプリングされるStart-Jobperfmonカウンターのリストをコンパイルしたいと思います。Receive-job( -Average, -Sum, -Minimum, -Maximum)。

私が今抱えている問題は、絶対カウンターパスを使用すると、ジョブが開始され、「実行中」の状態のままになることです。パフォーマンス カウンター文字列の配列を反復処理しようとすると、ジョブの状態が "完了" になります。

動作しない結果と動作する結果を示す 2 つのコード サンプルを次に示します。

うまくいきません。ジョブの状態 -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
4

1 に答える 1

2

問題は変数 $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
于 2012-08-15T00:50:41.387 に答える