【问题标题】:Batch to check if process exists批处理检查进程是否存在
【发布时间】:2017-11-04 12:14:14
【问题描述】:

我想要一个批处理来检查进程 firefox.exe 是否存在(在它被 start 命令启动之后)。 如果该进程存在,它将转到标签:全屏, 否则批次将进入标签:超时。然后,它会再次检查进程 firefox.exe 是否存在,如果不存在,它会再次进入标签:fullscreen,直到进程存在。

这是我的批次:

@echo off
start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe"
:timeout
timeout /t 5
:fullscreen
nircmd sendkeypress F11
exit

我该如何做这个检查?

【问题讨论】:

    标签: windows batch-file command-line cmd


    【解决方案1】:

    您也可以使用查询过程:

    @Echo Off
    If Not Exist "%ProgramFiles(x86)%\Mozilla Firefox\firefox.exe" Exit/B
    Start "" "%ProgramFiles(x86)%\Mozilla Firefox\firefox.exe"
    :Loop
    Timeout 5 /NoBreak>Nul
    QProcess firefox.exe>Nul 2>&1||GoTo :Loop
    NirCmd SendKeyPress F11
    

    【讨论】:

      【解决方案2】:

      我建议这个任务使用批处理文件:

      @echo off
      start "" /max firefox.exe
      if errorlevel 1 goto :EOF
      set LoopCount=0
      
      :WaitLoop
      %SystemRoot%\System32\timeout.exe /T 5
      %SystemRoot%\System32\tasklist.exe /FI "IMAGENAME eq firefox.exe" 2>nul | %SystemRoot%\System32\find.exe /I "firefox.exe" >nul
      if not errorlevel 1 nircmd.exe sendkeypress F11 & goto :EOF
      set /A LoopCount+=1
      if not %LoopCount% == 6 goto WaitLoop
      

      让我解释一下这里使用的几个命令行。


      1。启动 Firefox

      命令STARTcmd.exe 的内部命令,将第一个双引号字符串解释为控制台窗口的可选标题。因此命令行

      start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe"
      

      结果只是打开一个新的控制台窗口,窗口标题为:
      C:\Program Files (x86)\Mozilla Firefox\firefox.exe

      因此,"" 被指定为第一个 START 参数以定义一个空标题。 Firefox 是一个 GUI 应用程序。所以没有打开控制台窗口,这意味着一个空的窗口标题就足够了。

      /max 参数实际上并不是必需的,但目标是让 Firefox 在启动后进入全屏模式。那么为什么不开始它已经最大化呢?

      Firefox 的 32 位版本默认安装在 32 位 Windows 上的目录 %ProgramFiles% 和 64 位 Windows 上的 %ProgramFiles(x86)% 目录中。但是可以在安装过程中将 Firefox 安装到任何其他文件夹中。但 Firefox 安装程序编码良好,并在 Windows 注册表中注册 firefox.exe 键:

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
      

      这是微软在 MSDN 文章 Application Registration 中所推荐的。

      命令 START 还在 Windows 注册表中的此键下搜索指定为不带路径的参数的可执行文件,如Where is “START” searching for executables? 的回答中所述

      这就是在 START 命令行上仅使用 firefox.exe 的原因,因为这会启动独立于安装位置的已安装 Firefox

      START 如果firefox.exe 无法启动并在这种情况下以大于 0 的返回码(我在一台计算机上的测试中为 9059)退出,则会显示一个适当的消息框。

      在命令提示符窗口中运行if /? 的帮助输出解释了如何在不使用即时或延迟环境变量扩展的情况下评估先前命令或应用程序的退出代码,从而在 MS-DOS 的批处理文件中的任何位置工作(真的!)到当前最新的 Windows 10。

      命令行if errorlevel 1 goto :EOF 表示IF start 无法启动firefox.exe 由退出代码指示大于或等于1 THEN 退出执行此批处理文件.有关退出批处理文件执行的详细信息,请参阅Where does GOTO :EOF return to? 上的答案


      2。检查正在运行的 Firefox

      命令TASKLIST为外部命令,即Windows系统目录下的控制台应用程序,输出正在运行的进程列表。此列表已由 TASKLIST 本身过滤,用于特定进程,如在批处理文件中使用/FI "IMAGENAME eq firefox.exe" 完成的那样。

      TASKLIST 仅用于打印进程列表。它不是为检查特定进程是否正在运行并通过退出代码将结果返回给调用进程而设计的。 TASKLIST 总是以 0 退出。

      但是在使用过滤器时会输出一条错误消息来处理STDERR,并且在与该过滤器匹配的进程列表中找不到进程。出于这个原因,2>nul 用于通过将其重定向到设备 NUL 来抑制此错误消息。阅读有关 Using Command Redirection Operators 的 Microsoft 文章,了解有关重定向的更多信息。

      在检查运行 Firefox 时获得简单的 false/true 和 0/1 结果的简单方法是使用外部命令 FINDTASKLIST 的输出/strong> 如果确实找到了要查找的字符串,则以 0 退出;如果在这种情况下从 STDIN 读取的文本中找不到所搜索的字符串,则以 1 退出。 FIND 的输出没有意义,因此使用 >nul 重定向到设备 NUL 来抑制。

      除了使用 TASKLISTFIND 之外,还可以使用 QPROCESS

      %SystemRoot%\System32\qprocess.exe firefox.exe >nul 2>&1
      
      如果在正在运行的进程列表中找不到firefox.exe

      QPROCESS 会以退出代码1 退出。否则退出代码是 0 on firefox.exe is running。


      3。评估 Firefox 进程检查结果

      if not errorlevel 1 nircmd.exe sendkeypress F11 & goto :EOF
      

      IF 命令检查 FIND 的退出代码是否不大于或等于 1,这意味着退出代码是否低于1。命令 FIND 永远不会以负值退出。因此,如果此条件为真,那么是时候执行nircmd.exe 将按键 F11 发送到前台应用程序,希望是 Firefox(此代码不能保证)并退出批处理文件。

      否则批处理文件应该再次等待 5 秒,然后再次进行检查。如果用户在 5 秒等待超时之前立即关闭启动的 Firefox,这很容易导致无限运行的批处理文件。出于这个原因,它计算了等待循环已经执行的频率。在 6 次循环运行后,或 30 秒后,真的是时候不再等待 Firefox 并退出批处理文件了。


      4。获取有关使用的命令的更多信息

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

      • echo /?
      • find /?
      • if /?
      • qprocess /?
      • set /?
      • start /?
      • tasklist /?
      • timeout /?

      除了上面已经引用的所有其他网页之外,还应阅读 Single line with multiple commands using Windows batch file 解释运算符 &

      【讨论】:

        【解决方案3】:

        您可以像这样显示打开的程序列表:

        tasklist
        

        检查firefox是否存在:

        编辑:编辑代码以显示一个完整的工作示例

        @echo off
        start "C:\Program Files (x86)\Mozilla Firefox\firefox.exe"
        goto :checkloop
        
        :checkloop
        tasklist|find "firefox.exe" > NUL
        if %ERRORLEVEL% == 0 ( 
            call :fullscreen 
            exit
        ) else ( 
             call :timeout
             goto :checkloop
        )
        
        
        :fullscreen
        nircmd sendkeypress F11
        goto :EOF
        
        :timeout
        timeout /t 5
        goto :EOF
        

        【讨论】:

          猜你喜欢
          • 2013-03-05
          • 1970-01-01
          • 2011-05-25
          • 1970-01-01
          • 2013-04-27
          • 2015-07-09
          • 1970-01-01
          相关资源
          最近更新 更多