web-dev-qa-db-ja.com

Windowsコマンドラインのタスクリストの出力から特定のフィールドを抽出する方法

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)を抽出するにはどうすればよいですか?

13
ashish makani

以前の回答と同様ですが、tasklistの特定のスイッチを使用してヘッダーをスキップし、画像名のスペースに関係なく正しく動作します。

for /f "tokens=2 delims=," %F in ('tasklist /nh /fi "imagename eq BitTorrent.exe" /fo csv') do @echo %~F

(コマンドラインから直接実行した場合、バッチから実行した場合は%F%%Fに置き換えます

14
wmz

最も簡単な方法は、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

9
npocmaka

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:アプリのファイル名にスペースが含まれている場合は、トークンを正しく設定する必要があることに注意してください。

3
ElektroStudios