2014/02/07

Windows + PowerShellで特定の引数を持ったプロセスを見つけて、メモリ使用量を取るコマンド

書くほどではないがメモとして。

PowerShellではGet-Processコマンドレットでプロセス一覧が取得出来る。
ただ、それだとコマンドライン引数が分からないため、「hoge.jarを動かしているjava.exe」みたいなプロセスを特定することが出来ない。

そのためGet-WmiObject経由で Win32_Process オブジェクトを使ってコマンドライン引数を含めた情報を取得してみた。

Get-WmiObjectを利用した場合

PS C:\> Get-WmiObject Win32_Process | ? { $_.Name -eq 'notepad.exe' -and $_.CommandLine -ilike '*test.txt*' }


__GENUS                    : 2
__CLASS                    : Win32_Process
__SUPERCLASS               : CIM_Process
__DYNASTY                  : CIM_ManagedSystemElement
__RELPATH                  : Win32_Process.Handle="5124"
__PROPERTY_COUNT           : 45
__DERIVATION               : {CIM_Process, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER                   : SL20807-W8
__NAMESPACE                : root\cimv2
__PATH                     : \\SL20807-W8\root\cimv2:Win32_Process.Handle="5124"
Caption                    : notepad.exe
CommandLine                : "C:\WINDOWS\system32\notepad.exe" c:\test.txt
CreationClassName          : Win32_Process
CreationDate               : 20140207164215.299105+540
CSCreationClassName        : Win32_ComputerSystem
CSName                     : SL20807-W8
Description                : notepad.exe
ExecutablePath             : C:\WINDOWS\system32\notepad.exe
ExecutionState             :
Handle                     : 5124
HandleCount                : 122
InstallDate                :
KernelModeTime             : 1093750
MaximumWorkingSetSize      : 1380
MinimumWorkingSetSize      : 200
Name                       : notepad.exe
OSCreationClassName        : Win32_OperatingSystem
OSName                     : Microsoft Windows 8.1 Pro|C:\WINDOWS|\Device\Harddisk0\Partition2
OtherOperationCount        : 343
OtherTransferCount         : 866
PageFaults                 : 8697
PageFileUsage              : 4368
ParentProcessId            : 7260
PeakPageFileUsage          : 4572
PeakVirtualSize            : 173985792
PeakWorkingSetSize         : 13676
Priority                   : 8
PrivatePageCount           : 4472832
ProcessId                  : 5124
QuotaNonPagedPoolUsage     : 12
QuotaPagedPoolUsage        : 311
QuotaPeakNonPagedPoolUsage : 14
QuotaPeakPagedPoolUsage    : 330
ReadOperationCount         : 31
ReadTransferCount          : 23364
SessionId                  : 6
Status                     :
TerminationDate            :
ThreadCount                : 1
UserModeTime               : 312500
VirtualSize                : 167088128
WindowsVersion             : 6.3.9600
WorkingSetSize             : 13975552
WriteOperationCount        : 0
WriteTransferCount         : 0
PSComputerName             : SL20807-W8
ProcessName                : notepad.exe
Handles                    : 122
VM                         : 167088128
WS                         : 13975552
Path                       : C:\WINDOWS\system32\notepad.exe

別解:WMICコマンドを使った場合

C:\> wmic.exe process where "(Name='notepad.exe') and (CommandLine like '%test.txt%') list /format:list

CommandLine="C:\WINDOWS\system32\notepad.exe" c:\test.txt
CSName=SL20807-W8
Description=notepad.exe
ExecutablePath=C:\WINDOWS\system32\notepad.exe
ExecutionState=
Handle=5124
HandleCount=122
InstallDate=
KernelModeTime=1093750
MaximumWorkingSetSize=1380
MinimumWorkingSetSize=200
Name=notepad.exe
OSName=Microsoft Windows 8.1 Pro|C:\WINDOWS|\Device\Harddisk0\Partition2
OtherOperationCount=343
OtherTransferCount=866
PageFaults=8697
PageFileUsage=4368
ParentProcessId=7260
PeakPageFileUsage=4572
PeakVirtualSize=173985792
PeakWorkingSetSize=13676
Priority=8
PrivatePageCount=4472832
ProcessId=5124
QuotaNonPagedPoolUsage=12
QuotaPagedPoolUsage=311
QuotaPeakNonPagedPoolUsage=14
QuotaPeakPagedPoolUsage=330
ReadOperationCount=31
ReadTransferCount=23364
SessionId=6
Status=
TerminationDate=
ThreadCount=1
UserModeTime=312500
VirtualSize=167088128
WindowsVersion=6.3.9600
WorkingSetSize=13975552
WriteOperationCount=0
WriteTransferCount=0

遠回りだけど何とかパフォーマンスカウンタでやりたい場合

ちなみに、typeperfコマンドやパフォーマンスカウンタを使いたい場合、対象となるインスタンスを特定するために一工夫が必要になる。

エレガントにやる手順は Find a Performance Counter Instance by a Process ID に詳しいのでそちらを参照してみてください。
キモはPowerShellだと ImportCSV コマンドレットでCSVデータを名前付きオブジェクトで扱えるから、それでプロセスIDを元にインスタンス名を特定できるところ。