Windows batch-file wmic 获取 java 进程的 PID,如何将标记设置为变量以测试 PID 是否存在? - 如果没有启动,否则提示重启

Windows batch-file wmic to get PID of a java process, how do I set tokens to a variable to test if PIDs exist? - start if not,else prompt for restart

操作系统:Windows7
进程并发锁定:java线程

我正在创建一个像锁一样工作的 bat 文件。 要检查进程是否存在,我执行以下操作:

cmd /c wmic process where(name="java.exe") get ProcessID^,commandline| for /f "tokens=3" %%a in ('findstr "Thread"') do set pid=%%a

相关观察:

我确定 %%a 正在被填充,我刚刚发现集合 pid=%%a 实际上正在被填充运行 放在 cmd-line 上,而不是设置变量。
我更新了过于冗长的标题以反映这一认识。

具体来说,我只需要设置一个变量来告诉我是否存在来自 wmic return 的 processID。 (简单到 0/1)

THE RETURN(当然 pid 变化):
name/commandline/processID

java Thread 10144

问题比较清楚
我如何更改或添加到我上面的代码以使 %%a 实际上将其数据存储在变量中?
目前 %pid% 没有被填充,因为它 运行ning:

set pid=%%a 

作为控制台命令而不是执行赋值。
我还想知道如何处理如何测试赋值是否有效:
我应该使用 'if exists',或者某个比较器,如:

if "%pid%" != "" ( start "" ./newProcess.bat ) 

更新 从我读过的内容来看,@set 可以工作,但这里没有骰子:上面的尝试仍然是一个空的 %pid% 。我一直在尝试整个命令都在标记化 for-loop 内的变体,我似乎无法将此引导程序绑在将 wmic 与 Windows bat 文件一起使用时所需的极其精巧的转义符周围。 有语法高手能帮我找出下面代码中的错误吗?我将不胜感激。

for /f "tokens=3" %%a in ('wmic process where^(name="java.exe"^) get ProcessID^,commandline^|findstr "Thread"') do @set pid=%%a

解法:

主要问题是转义所有字符;批处理文件中使用的 wmic 通常需要大量插入符号 ^ 转义。我错过了 ^=。学过的知识。嵌套整个语句是将 pid 设置为令牌的关键。许多消息来源暗示使用@set pid=%%a,尽管这对我不起作用。

for /f "tokens=3" %%a in ('wmic process where ^(name^="java.exe" ^) get ProcessID ^,commandline ^| findstr "Thread"') do set pid=%%a

在以后的批处理脚本中,我将采纳朋友的可靠建议并使用 Powershell。能够更容易地解析和循环,并使用 Get-Help(类似于手册页)有几个原因。

ps - 请不要烧烤我,因为这是我第一次 post 来这里。我鼓励 post 批评以改进。

您只需要引用另一个标记,我确定您需要跳过 wmic 输出的第一行(header)。否则,您将空格分配给变量:

for /f "skip=1 tokens=3" %%a in ('wmic process where ^(name^="java.exe"^) get ProcessID^,commandline ^| findstr "Thread"') do set pid=%%a  

更改:'where' 后面的空白,'=' 之前的引号插入符号,以及 FOR 循环中的 'skip=1'。 编辑:
根据 OP,使用 @set pid=%%a 没有用,但是 set pid=%%a。这现在反映在上面的代码中。

如果您可以评论如何临时创建线程,我可以更好地测试它,因为我目前在我的 PC 上没有看到任何线程进程。