我试图得到wmic process call create
的输出,所以我可以得到新创build的进程的ProcessId
。 如果我只是运行:
wmic process call create "notepad.exe a.txt","d:\"
它工作得很好(它打开文件夹d:\
下的文件a.txt
与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
谢谢!
我刚刚发现如何做到这一点。 由于命令只是直接在命令提示符下工作,我决定使用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
循环使用默认分隔符TAB和SPACE来删除关键字ProcessId
前面的TAB ,内部循环包含一个if
条件来提取正确的行(而不是find
),并分离除了进程ID号。