微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

批处理文件的用法

如何解决批处理文件的用法

我需要从下面的命令中获取pid,如果我在如下所示的命令行中使用它,该命令将起作用:

wmic process where "name="java.exe" and CommandLine like '%%cassandra%%'" get ProcessId | FINDSTR /v ProcessId | FINDSTR /r /v "^$"

但在.bat文件中使用时失败:

FOR /F "tokens=2" %%G IN ('wmic process where ^(name^="java.exe"^ and CommandLine like '%%cassandra%%') get ProcessId ^| FINDSTR /v ProcessId ^| FINDSTR /r /v "^$"') DO (
   set PARENT_PID=%%G
)
echo !PARENT_PID!

有人可以帮忙吗?

解决方法

您的转义点不正确,不确定是否启用了delayedexpansion,但在此示例中我将不使用它:

@echo off
for /F "tokens=2 delims==" %%G IN ('wmic process where (name^="java.exe" and commandline like '%%cassandra%%'^) get ProcessId /value') DO if not defined parent_pid set "parent_pid=%%G"
echo %parent_pid%

您会注意到,我为/value使用了wmic开关,并删除了findstr /v命令,因为我使用=作为分隔值的定界符。>

还请注意,如果有多个进程使用相同的命令行和名称运行,则只会得到一个结果,因为您只设置了一个值,因此,请勿设置变量。即:

@echo off
for /F "tokens=2 delims==" %%G IN ('wmic process where (name^="java.exe" and commandline like '%%cassandra%%'^) get ProcessId /value') DO echo %%G
,

您在for /F循环中使用的代码与您在命令提示符中尝试的代码不同,因为还有其他括号。然后,您转义了(的开头,却忘记了)的结尾,这更重要,因为它结束了in关键字后面的括号块。

无论如何,您应该更改wmic命令行并引用整个where子句:

wmic Process where "Name='java.exe' and CommandLine like '%%cassandra%%'" get ProcessId

因此,在for /F中使用此代码时,您不必费心构建转义序列:

set "PARENT_PID="
for /F "skip=1 delims=" %%P in ('
    wmic Process where "Name='java.exe' and CommandLine like '%%cassandra%%'" get ProcessId
') do for /F "tokens=1" %%Q in ("%%P") do set "PARENT_PID=%%Q"
echo/%PARENT_PID%

第二个for /F循环用于删除wmic命令从for /F的Unicode到ASCII / ANSI转换的反事实(孤立的回车字符)。 / p>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。