如何解决批处理文件的用法
我需要从下面的命令中获取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 举报,一经查实,本站将立刻删除。