我正在尝试获取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
谢谢!
答案 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号之外的所有内容。