如何获得“wmic进程调用创build”的输出

我试图得到wmic process call create的输出,所以我可以得到新创build的进程的ProcessId 。 如果我只是运行:

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

它工作得很好(它打开文件夹d:\下的文件a.txtnotepad )。 现在,如果我尝试:

 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

谢谢!

我刚刚发现如何做到这一点。 由于命令只是直接在命令提示符下工作,我决定使用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需要从空间中分离出来,但还有其他的东西。 对不起,不便之处

没有必要启动另一个cmd实例。 你可以这样做:

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

你需要像^,那样转义,所以for /F循环启动的cmd实例会直接接收它; 否则,它最有可能被一个空格代替,因为对于cmd ,逗号不过是一个象空格一样的标记分隔符。


当给定的文本文件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循环使用默认分隔符TABSPACE来删除关键字ProcessId前面的TAB ,内部循环包含一个if条件来提取正确的行(而不是find ),并分离除了进程ID号。