【问题标题】:Find opened process in Windows batch在 Windows 批处理中查找打开的进程
【发布时间】:2015-08-15 03:02:25
【问题描述】:

我正在尝试编写循环代码并判断某个进程是否已打开。它应该是一个循环,它会实时显示进程是否打开。换句话说,文本会在程序打开时改变,而在程序关闭时再次改变。相反,我得到的是具有相同文本的洪水,它没有在其下方显示“回声”。

我试过了:

@echo off 
goto xera
:start 
tasklist /FI "IMAGENAME eq notepad.exe" | find /I "notepad.exe" > nul
IF %ERRORLEVEL% equ 0 ECHO is opened
IF %ERRORLEVEL% equ 1 ECHO isnt opened 
:xera
    set /p "=Status: " <nul &call :start //the code got 'stuck' here
    ECHO Text 2 (doesnt show)
    pause>nul

【问题讨论】:

  • 它永远不会显示“文本 2”,因为您在到达之前调用了一个子例程。从字面上看,您将永远无法达到该代码。但从好的方面来说,您的进程状态检查器非常适合我。

标签: windows batch-file cmd tasklist


【解决方案1】:

您没有正确终止您的子例程:start。请尝试以下操作:

@echo off 
goto xera
:start 
tasklist /FI "IMAGENAME eq notepad.exe" | find /I "notepad.exe" > nul
IF %ERRORLEVEL% equ 0 ECHO is opened
IF %ERRORLEVEL% equ 1 ECHO isnt opened
exit /b
:xera
set /p "=Status: " <nul &call :start
ECHO Text 2 (doesnt show)
pause>nul

我插入了exit /b,它告诉命令解释器在实际调用它的call 语句之后返回命令。您也可以改用goto :EOF。输入call /? 了解更多关于如何批量调用子程序的信息。

【讨论】:

  • 是的,但是,如果我使用 'goto :eof' 代码将只运行一次,但我想要的是保持循环的代码总是说是否打开了 'process.exe' .
  • 哪部分代码应该在循环中?当您在call :start 命令之后附加`& goto :xera` 时,代码会按照您的意愿执行吗??
  • 那部分叫做:start。在 Delphi 中会是这样的:procedure TForm1.Timer1Timer(Sender: TObject); begin if ProcessVerify('notepad.exe') then //ProcessVerify is the function to verify a opened process Label1.caption:='is opened'; else Label1.caption:='isn't opened';
  • 如果我做对了,您可以在原始代码中简单地将call :start 替换为goto :start...但是我仍然没有得到:应该在某个时候回显Text 2 ,如果是的话,什么时候?
  • 不客气!如果您需要在批处理中建立无限循环的延迟,您可以使用:timeout /T 2 /NOBREAK &gt; nul(这会告诉您在继续下一行代码之前等待 2 秒;/NOBREAK 可以通过键禁用过早终止命令-按下;&gt; nul 禁止显示消息)。
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多