如何获得“wmic process call create”

时间:2017-04-03 19:32:57

标签: windows cmd

我正在尝试获取wmic process call create的输出,以便我可以获得新创建的进程的ProcessId。如果我跑:

wmic process call create "notepad.exe a.txt","d:\"

它工作正常(它会在文件夹a.txt下打开文件d:\notepad)。现在,如果我尝试:

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

它没有,并向我显示错误:

  

Formato错误。   Sugerencia:<lista_parámetros> =<parámetro> [,<lista_parámetros>]。

我真的不知道这里发生了什么,有人可以向我解释这个问题,或者这是否可行?

注意:其他命令正常。例如,如果我跑:

for /f "usebackq" %i in (`wmic process where "executablepath like '%%notepad.exe'" get ProcessId /value^|findstr ProcessId`) do @echo OUTPUT: %i

它给出了预期的输出,在这种情况下是:

  

OUTPUT:ProcessId = 2084

谢谢!

2 个答案:

答案 0 :(得分:4)

我刚刚发现它是如何完成的。由于该命令仅在命令提示符下直接使用,我决定使用cmd /c "...",其内容如下:

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

现在唯一的问题是PID需要从空间中挑选出来,但那是其他的东西。很抱歉给您带来不便。

答案 1 :(得分:3)

无需启动另一个cmd实例。你可以这样做:

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

您需要转发, ^,,因此cmd循环启动的for /F实例会从字面上接收它;否则,它很可能被 SPACE 替换,因为cmd逗号只是一个标记分隔符,就像 SPACE 一样。

当给定的文本文件a.txt不存在时,上面的代码不会打开notepad.exe实例,即使在没有围绕for /F循环的情况下执行:

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:\"

我猜这个行为来自管道(|),因为它会为任何一方启动新的cmd个实例;我相信notepad.exe(或任何其他应用程序)是以一种隐藏模式运行的,在这种模式下不需要用户交互(对于应用程序不等待后台输入无效)。

因此我建议使用不需要管道的变体,如下所示:

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

外部for /F循环使用默认分隔符 TAB SPACE ,以便删除前面的前导 TAB 关键字ProcessId,内部循环包含if条件以提取正确的行(而不是find)并拆分除进程ID号之外的所有内容。