Get only PID from tasklist using cmd title

25,145

Solution 1

The difficult thing with tasklist is its default output format. For example, when command line:

tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running"

is executed, we get:

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
cmd.exe                      12740 Console                    1      3'328 K
cmd.exe                      11020 Console                    1      3'304 K

Unless the column widths are fixed, which I would not rely on, extracting the PID is not that trivial, because the image name could also have SPACEs in it, so using such as delimiters would not work.
A possible way was to count the number of =-signs in the second line up to the first SPACE, so we know the number of characters to truncate to have the image name removed, but this requires some kind of loop (using goto), so the performance might be quite bad.

However, there are other output formats available for tasklist. The command line:

tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO CSV

results in this output:

"Image Name","PID","Session Name","Session#","Mem Usage"
"cmd.exe","12740","Console","1","3'328 K"
"cmd.exe","11020","Console","1","3'304 K"

Now it is quite easy to extract the PID:

@echo off
for /F "delims=" %%R in ('
    tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO CSV /NH
') do (
    set "FLAG1=" & set "FLAG2="
    for %%C in (%%R) do (
        if defined FLAG1 (
            if not defined FLAG2 (
                echo %%~C
            )
            set "FLAG2=#"
        )
        set "FLAG1=#"
    )
)

Another output formats is used by the following command line:

tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO LIST

resulting in this output:

Image Name:   cmd.exe
PID:          12740
Session Name: Console
Session#:     1
Mem Usage:    3'328 K

Image Name:   cmd.exe
PID:          11020
Session Name: Console
Session#:     1
Mem Usage:    3'304 K

With this it is even simpler to get the desired output:

@echo off
for /F "tokens=2" %%K in ('
   tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO LIST ^| findstr /B "PID:"
') do (
   echo %%K
)

By the way, for the filter options /FI, there are the following operators available:

  • eq -- equal to;
  • ne -- not equal to;
  • gt -- greater than;
  • lt -- less than;
  • ge -- greater than or equal to;
  • le -- less than or equal to;

The Microsoft documentation as well as the help message (tasklist /?) do not explain their meaning, but I found the following external resources:

Solution 2

I am not sure what you are expecting. There could be several cmd shells running. If they are running a program, their window title typically changes.

It is easy enough to get the cmd processes and there PID (the Id field). The window title is also available.

PS C:\src\t\s1> Get-Process | Where-Object { $_.ProcessName -eq 'cmd' }

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    152      15    10280      16432      10.80   2808   1 cmd
    153      13     8472      12220       3.68   7232   1 cmd

PS C:\src\t\s1> Get-Process | Where-Object { $_.ProcessName -eq 'cmd' } | ForEach-Object { $_.MainWindowTitle }
cmd.exe
dirlist.bat (C:\src\t) - VIM

Getting the PID only to appear is easy enough. But, which one do you want?

PS C:\src\t\s1> Get-Process | Where-Object { $_.ProcessName -eq 'cmd' } | ForEach-Object { $_.Id }
2808
7232
Share:
25,145
GregariousJB
Author by

GregariousJB

Updated on September 29, 2021

Comments

  • GregariousJB
    GregariousJB over 2 years

    Desired output:

    1234
    

    Just the PID. Nothing else - no other characters, numbers, or symbols.

    I'm trying to run tasklist so it gives me only the PID of a named or titled process.

    tasklist | findstr /i "cmd.exe" is the closest I've gotten, but the result is too verbose. I just want the PID number.

    Bonus points for linking me a description of what the tasklist filter operators mean - "eq", "ne", etc, since they aren't anywhere in the documentation.

  • GregariousJB
    GregariousJB almost 6 years
    In Admin CMD: 'PS' is not recognized as an internal or external command In Admin PS: Get-Process : A positional parameter cannot be found that accepts argument 'Get-Process The plan is to use a titled CMD window, like TITLE test, and then find it that way.
  • GregariousJB
    GregariousJB almost 6 years
    $ tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO CSV INFO: No tasks are running which match the specified criteria. And tasklist /? shows the filter options like the documentation does, but neither one shows what "eq", "ge", "le" etc mean. That's what I was asking.
  • aschipfl
    aschipfl almost 6 years
    See my edit -- the operators are now explained. Concerning the return message you mentioned (INFO:): type tasklist without any filter options and check whether or not the tasks you want are listed, then add one filter option after another and heck again...
  • Satish Patro
    Satish Patro about 5 years
    Well explained with syntax everything
  • Ambrose Leung
    Ambrose Leung almost 5 years
    When you say 'title', it sounds like you mean 'Image name' (i.e. blah.exe). Also, the command starts at Get-Process, not PS
  • lit
    lit almost 5 years
    'Title' means the text in the system bar at the top of the window. It is not the executable image name. (Get-Process) | Where-Object { $null -ne $_.MainWindowTitle -and '' -ne $_.MainWindowTitle } | % { $_.MainWindowTitle }
  • Prajwal
    Prajwal over 4 years
    The second part is very convenient for iterating through PID of processes that correspond to a particular ImageName.