【问题标题】:batch file wmic usage批处理文件 wmic 用法
【发布时间】:2020-11-05 06:39:26
【问题描述】:

我需要从下面的命令中获取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!

有人可以帮忙吗?

【问题讨论】:

  • 失败?失败了怎么办?你得到什么错误信息? wmic 行的原始输出为您显示了什么?对我来说,“进程名”和 PID 位于不同的行上。你知道WMIC 输出是Unicode 吗?
  • 还应该注意的是,WMIC 已被弃用。看到这个帖子:stackoverflow.com/questions/57121875/…
  • 这是 PowerShell 等效项:get-ciminstance win32_process -Filter "name = 'notepad.exe' and commandline like '%system32%'" | %{$_.ProcessId}

标签: batch-file wmic


【解决方案1】:

您的转义点不正确,不确定您是否启用了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

【讨论】:

    【解决方案2】:

    您在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 循环用于删除来自for /Fwmic 命令的Unicode 到ASCII/ANSI 转换的事实(孤立的回车符)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多