システムのパフォーマンスを分析したいときに、パフォーマンスカウンタを仕掛けるのはよくあることだと思います。
で、Processの情報を取得するときに、同じ名前のプロセスが複数上がっていて、どれが目的のものか判別できなくて困ることありますよね。
調べてみたら、PowershellのCimInstanceを使うことで、タスクマネージャのコマンドライン列相当のデータをつけて、類似のデータを採取できるみたいです。起動時の引数などで目的のプロセスが判別できるなら、これで解決するかも。
以下のように「コマンドライン」付のログをPowershellで取る感じです
簡単に採取スクリプトを組んでみたので、サンプルとして残しておきます。
冒頭の「取得対象のプロセスの名前」~「サンプリング対象」あたりを、目的に応じて書き換えて使用する想定です。
ProcessInfoLogger.ps1
# 取得対象のプロセスの名前
$targetProcessName = "cmd.exe"
# 出力ファイル
$outFileName = "D:\work\out.csv"
# サンプル間隔(秒)
$samplingTime = 15
# サンプリング対象 (取得するものをコメントアウト)
$samplingProperties = @(
"ProcessName"
# ,"Handles"
# ,"VM"
# ,"WS"
# ,"Path"
# ,"Caption"
# ,"Description"
# ,"InstallDate"
# ,"Name"
# ,"Status"
# ,"CreationClassName"
,"CreationDate"
# ,"CSCreationClassName""
# ,"CSName"
# ,"ExecutionState"
# ,"Handle"
,"KernelModeTime"
# ,"OSCreationClassName"
# ,"OSName"
# ,"Priority"
# ,"TerminationDate"
,"UserModeTime"
,"WorkingSetSize"
,"CommandLine"
# ,"HandleCount"
# ,"MaximumWorkingSetSize"
# ,"MinimumWorkingSetSize"
# ,"OtherOperationCount"
# ,"OtherTransferCount"
# ,"PageFaults"
# ,"PageFileUsage"
# ,"ParentProcessId"
# ,"PeakPageFileUsage"
# ,"PeakVirtualSize"
# ,"PeakWorkingSetSiz"
# ,"PrivatePageCount"
,"ProcessId"
# ,"QuotaNonPagedPoolUsage"
# ,"QuotaPagedPoolUsage"
# ,"QuotaPeakNonPagedPoolUsage"
# ,"QuotaPeakPagedPoolUsage"
# ,"ReadOperationCoun"
# ,"ReadTransferCount"
# ,"SessionId"
# ,"ThreadCount"
,"VirtualSize"
# ,"WindowsVersion"
# ,"WriteOperationCount"
# ,"WriteTransferCount"
# ,"PSComputerName"
)
# メッセージ
Write-Host "プロセス情報採取中。。。"
# 主処理
while ($true) {
# サンプル時刻とプロセス情報を取得
$sampledTime = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
$cimInstanceProcess = Get-CimInstance -ClassName win32_process -Filter "name = '$targetProcessName'"
# 全部出力するとファイル容量が大きくなるので、必要なものだけに絞って出力データ($outData)に入れる
$outData = @()
foreach ($process in $cimInstanceProcess ) {
# サンプル時刻を入力しつつ$outDataRecordを初期化
$outDataRecord = [PSCustomObject]@{
SampledTime = $sampledTime
}
#プロセスの情報を$outDataRecordに追加
foreach ($property in $samplingProperties){
$outDataRecord | Add-Member -MemberType NoteProperty -Name $property -Value $process.($property)
}
# $outDataRecordを$outDataに追加
$outData += $outDataRecord
}
# 出力
$outData | Export-Csv -Path $outFileName -NoTypeInformation -Encoding Default -Append
# 待ち合わせ
Start-Sleep $samplingTime
}