Windowsコマンドプロンプトで次のコマンドを実行しました
C:>tasklist /fi "Imagename eq BitTorrent.exe"
その出力は
Image Name PID Session Name Session # Mem Usage
================== ======== ================= =========== =========
BitTorrent.exe 6164 Console 3 24,144K
上記の出力から、PID、つまり番号6164の1つのフィールドのみを抽出する必要があります。
どうすればこれを達成できますか?より一般的には、Windowsコマンドラインでコマンドの出力からフィールドのサブセット(1/more)を抽出するにはどうすればよいですか?
以前の回答と同様ですが、tasklist
の特定のスイッチを使用してヘッダーをスキップし、画像名のスペースに関係なく正しく動作します。
for /f "tokens=2 delims=," %F in ('tasklist /nh /fi "imagename eq BitTorrent.exe" /fo csv') do @echo %~F
(コマンドラインから直接実行した場合、バッチから実行した場合は%F
を%%F
に置き換えます
最も簡単な方法は、WMICを使用することです。
c:\>wmic process where caption="BitTorrent.exe" get ProcessId
EDIT:WMICはWindowsのhomeエディションの一部ではないため、次のようになります。
for /f "tokens=1,2 delims= " %A in ('tasklist /fi ^"Imagename eq cmd.exe^" ^| find ^"cmd^"') do echo %B
ここでは、キャプションのCMDを使用しています。これは、findパラメータとtasklistパラメータで変更できます。これをバッチファイルで使用する場合は、%%B
および%%A
Wmicコマンドを使用して、出力をフィルタリングしないようにすることができます。
wmic process where name="BitTorrent.exe" get processid | MORE +1
更新:別の方法:
@Echo OFF
FOR /F "tokens=2" %%# in ('tasklist /fi "Imagename eq winamp.exe" ^| MORE +3') do (Echo %%#)
Pause&Exit
PS:アプリのファイル名にスペースが含まれている場合は、トークンを正しく設定する必要があることに注意してください。