我试图在批处理文件中包含一个检查,以在尝试启动 Java 进程之前查看它是否已在运行。
我有以下工作命令:
FOR /F "tokens=*" %g IN ('wmic PROCESS where "name like '%java%' and CommandLine like '%surveyEngine%'" get ProcessId') DO (SET var=%g)
ECHO %var%
但是,该var
变量未正确设置。
当我运行初始 wmic 命令时,我返回了三行;
) Users\gavin>(SET var=ProcessId
) Users\gavin>(SET var=4964
) Users\gavin>(SET var=
如果我尝试,ECHO %var%
我得到的ECHO is on
不是一个值。
有人能看到对我的命令进行任何调整以允许我捕获第二行吗?
我并没有“坚持”使用 wmic……我只是关心这个过程是否正在运行。
答案1
该var
变量未正确设置。
在批处理文件中,您需要使用 2%
而不是 1。
该命令的操作
FOR
可以概括为......
- 取一组数据
- 使
FOR
参数%%G
等于该数据的某一部分- 执行命令(可选择使用参数作为命令的一部分)。
- 对每一项数据重复上述步骤
如果您在命令行而不是批处理程序中使用 FOR 命令,则只需使用一个百分号:
%G
而不是%%G
。
来源:For - 循环命令 - Windows CMD - SS64.com
仅捕获第二行:
rem skip 1st line
FOR /F "tokens=* skip=1" %%g IN ('wmic PROCESS where "name like '%java%' and CommandLine like '%surveyEngine%'" get ProcessId') DO (
SET var=%%g
rem finished
goto done
)
done:
ECHO %var%
进一步阅读
答案2
@echo off
for /f useback^tokens^=4^delims^=^<^> %%g in (
`%__AppDir__%wbem\wmic.exe Process where "Name like '%java%' and CommandLine like '%surveyEngine%'" get ProcessId /format:xml ^| find "VALUE"
`)do set "_var=%%~g"
echo; %_var%
但是,var 变量未正确设置。
这样说是不对的,实际上变量在 for 输出的第 1 次和第 2 次循环中取值
,但在最后一次循环中它删除了该变量。SET var=ProcessId SET var=4964 SET var= // remove variable //
的输出 (encodind)wmic.exe
没有帮助,并且在以简单形式 () 使用时会产生换行符get MyPizza
。在尝试了几次不同的可选输出格式 (通过命令补充) 后,我开始使用/format:xml
with^| find "VALUE"
来获取一行输出,并且没有多余的空格和/或换行符。
复制command|clip
输出并将其粘贴到编辑中时,请注意附加行:
> wmic PROCESS where "name like '%cmd.exe%' and CommandLine like '%windows%'" get commandline|clip
- 输出粘贴到文本编辑器中:
我建议你参考一下这个问题:
WMIC命令批量输出非UTF-8文本文件