How to get the output of “wmic process call create”

前端 未结 2 1325
[愿得一人]
[愿得一人] 2021-01-20 08:25

I\'m trying to get the output of wmic process call create so I can get the ProcessId of the newly created process. If I just run:

w         


        
相关标签:
2条回答
  • 2021-01-20 08:57

    There is no need to initiate another cmd instance. You could do it as follows:

    for /F "tokens=2 delims==; " %I in ('wmic Process call create "notepad.exe a.txt"^,"D:\" ^| find "ProcessId"') do @echo PID = %I
    

    You need to escape the , like ^,, so the cmd instance initiated by the for /F loop receives it literally; otherwise, it becomes most likely replaced by a SPACE, because to cmd a comma is nothing but a token separator just like the SPACE.


    When the given text file a.txt does not exist, the above code does not open a notepad.exe instance, even if executed without surrounding for /F loop:

    rem // This fails in case `a.txt` is not found, `notepad.exe` is not opened:
    wmic Process call create "notepad.exe a.txt","D:\" | find "ProcessId"
    
    rem /* When removing the pipe, `notepad.exe` is opened and a window appears:
    rem    `Cannot find the a.txt file. Do you want to create a new file?`: */
    wmic Process call create "notepad.exe a.txt","D:\"
    

    I guess this behaviour comes from the pipe (|), because it initiates new cmd instances for either side; I believe notepad.exe (or any other application) is run in a kind of hidden mode where no user interaction is required (for the application not to await input in the background to no avail).

    Therefore I recommend to use a variant without need of a pipe, like this:

    for /F "tokens=*" %I in ('wmic Process call create "notepad.exe a.txt"^,"D:\"') do @for /F "tokens=1-2 delims==; " %J in ("%I") do @if "%J"=="ProcessId" echo PID = %K
    

    The outer for /F loop uses the default delimiters TAB and SPACE in order to remove the leading TAB in front of the keyword ProcessId, the inner loop contains an if condition to extract the correct line (instead of find) and splits off everything but the process ID number.

    0 讨论(0)
  • 2021-01-20 09:03

    I just found how can it be done. Due to the command was working only directly in the command prompt I decided to use cmd /c "...", it's as follows:

    for /f "usebackq delims==; tokens=1,2" %i in (`cmd /c "wmic process call create 'notepad.exe a.txt','d:\'"^|findstr ProcessId`) do @echo pid = %j
    

    Now the only thing is that the PID needs to be trimed out of spaces, but that something else. Sorry for the inconvinience.

    0 讨论(0)
提交回复
热议问题