Windows 11 DOS FOR/IF

Windows 11 DOS FOR/IF

我试图在批处理文件中包含一个检查,以在尝试启动 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:xmlwith^| find "VALUE"来获取一行输出,并且没有多余的空格和/或换行符。

复制command|clip输出并将其粘贴到编辑中时,请注意附加行:

> wmic PROCESS where "name like '%cmd.exe%' and CommandLine like '%windows%'" get commandline|clip
  • 输出粘贴到文本编辑器中:

在此处输入图片描述

我建议你参考一下这个问题:
WMIC命令批量输出非UTF-8文本文件

相关内容