【问题标题】:How to get process ID of a specific process using wmic and check on error?如何使用 wmic 获取特定进程的进程 ID 并检查错误?
【发布时间】:2016-01-04 11:39:52
【问题描述】:

我创建了一个批处理脚本,它运行 WMIC 以从特定进程获取 PID。如果我打开 bat 脚本,我会看到“ProcessID 1234”或“没有可用的实例”。在命令窗口中。

我想创建一个 IF 语句,用于检查此命令的输出是 PID 还是 No Instance(s) Available.。我可以为此使用哪个变量?

我的代码:

wmic process where "Name like '%%cmd.exe%%' and CommandLine like '%%WatchdogStarter.bat%%'" get processid
if %%outputfromthiswmiccommand%% == 'No Instance(s) Available.' ....

【问题讨论】:

  • 我建议查看 findstr 命令和错误级别
  • 你能分享更多代码吗?更有可能与this有关
  • 我添加了我的代码。我想知道如何读取 wmic 命令的输出以在 if 语句中使用它。
  • 另一种选择(如果您可以访问看门狗脚本)是让相关脚本维护一个包含自己的 pid 的文本文件。

标签: batch-file cmd


【解决方案1】:

您可以使用以下批处理代码来获取进程标识符值或分配给变量 ProcessID 的错误消息。

@echo off
set "ProcessID="
for /F "usebackq skip=1 delims=" %%I in (`wmic process where "Name like '%%cmd.exe%%' and CommandLine like '%%WatchdogStarter.bat%%'" get processid 2^>nul`) do set "ProcessID=%%I"
if "%ProcessID%" == "" (
    echo PID could not be determined.
) else (
    echo PID is: %ProcessID%
)

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • for /?
  • if /?
  • set /?
  • wmic /?

另请参阅 Using command redirection operators 以了解 2>nul 将写入 STDERR 的错误消息 No Instance(s) Available.(英文 Windows)重定向到设备 NUL2>nul 中的尖括号必须用 ^ 转义,以将 2>nul 应用于命令 wmic 而不是命令 FOR

如果 wmic 命令不成功,将错误消息重定向到设备 NUL 并确保 ProcessID 不存在优于比较 wmic 的输出strong> 带有特定字符串,因为错误消息取决于 Windows 的语言。此解决方案独立于 Windows 语言。

【讨论】:

  • ++ 语言中立:忽略这一点会使脚本随着时间的推移变得非常脆弱
【解决方案2】:

感谢所有帮助的人。 我通过使用 TASKLIST 而不是 WMIC 解决了我的问题。

WMIC 给了我输出,从 2 个非 ascii 字符和 2 行不可用信息开始。我必须过滤这些,什么有效。

@echo off
for /f "skip=1 tokens=*" %%i in ('wmic process where name^="chrome.exe" get Processid') do echo %%i

这有点用,但是当我试图“监视”的程序没有运行时,它给了我一个随机 pid,我认为我得到的 pid 来自正在查找请求的进程 id 的 WIDC 进程。

这就是为什么我尝试使用 TASKLIST 并使用 FINDSTR 搜索完整输出以找到我正在寻找的正确 pid。这对我有用。

for /f "tokens=2 delims=," %%P in ('tasklist /v /fo csv ^| findstr /i "WatchdogStarterBATCH"') do set pid=%%~P

感谢大家的帮助!:)

【讨论】:

    【解决方案3】:

    我还认为您对引号(或我的示例中的双引号)有疑问:例如我的脚本中有以下代码:

    IF "%5"==""
    

    您会看到 '==' 符号的两边都有(双)引号。

    换句话说,我会将您的行替换为:

    if '%%outputfromthiswmiccommand%%' == 'No Instance(s) Available.' ....
    

    【讨论】:

      【解决方案4】:

      如果 wmic 找不到 PID %errorlevel% 将被设置。在 IF 语句中使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 2023-03-29
        • 1970-01-01
        • 2010-12-26
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        相关资源
        最近更新 更多