Board logo

标题: [系统相关] [已解决]批处理如何监控一个进程,等这个进程结束一分钟后关机? [打印本页]

作者: 001011    时间: 2011-8-18 21:44     标题: [已解决]批处理如何监控一个进程,等这个进程结束一分钟后关机?

本帖最后由 001011 于 2011-8-19 19:19 编辑

假设这个进程是a.exe。这个进程是个识别软件的进程,对每张图片进行识别的时候,这一张转换完成 在转换下一张的时候这个进程会自动终止,当读取到下一张图片的时候这个进程就会出现。所以不能在某个时刻没有监听到这个进程就判断可以关机了。而是连续一分钟没有这个进程出现才能代表这个任务已经结束,才能关机!
作者: xslxslxsl    时间: 2011-8-18 22:45

本帖最后由 xslxslxsl 于 2011-8-19 22:16 编辑

是不是你那个A.EXE停止后,在进程中就消失了,也就是大于等于一分钟未发现该进程就可以视为程序停止,可以关闭计算机了吗?
  1. @echo off
  2. :RESTART
  3. tasklist /FI "username eq administrator" | find /C "a.exe" > temp.txt
  4. set /p n= < temp.txt
  5. del /F temp.txt
  6. ping -n 100 172.0.0.1 > nul
  7. tasklist /FI "username eq administrator" | find /C "a.exe" > t.txt
  8. set /p m= < t.txt
  9. del /F t.txt
  10. set /a b=n+m
  11. if "%b%"=="0" (shutdown -s ) else echo 程序还在运行
  12. goto restart
复制代码
写得有些粗糙,可以修改ping -n 100 172.0.0.1  中n后面的100来延长时间,我还真不知道发一个数据包大概是多久哦。
作者: xzix    时间: 2011-8-18 22:53

酱紫
@echo off
:A
set var=0
for /f %%a in ('tasklist') do (if /i %%a==A.exe set var=1)
if %var%==1 (echo 存在) else (GOTO B)
GOTO A
:B
echo.
shutdown -s -t 60
邮箱‘;[email]xzix@qq.com[/email]
作者: 001011    时间: 2011-8-18 23:17

是不是你那个A.EXE停止后,在进程中就消失了,也就是大于等于一分钟未发现该进程就可以视为程序停止,可以关 ...
xslxslxsl 发表于 2011-8-18 22:45

是的,一分钟之内没有这个进程就可以关机了 谢谢
作者: 001011    时间: 2011-8-18 23:26

是不是你那个A.EXE停止后,在进程中就消失了,也就是大于等于一分钟未发现该进程就可以视为程序停止,可以关 ...
xslxslxsl 发表于 2011-8-18 22:45



    我如何改为我的自己的进程呢?难道是改:notepad.exe
作者: 001011    时间: 2011-8-18 23:27

酱紫
@echo off
:A
set var=0
for /f %%a in ('tasklist') do (if /i %%a==A.exe set var=1)
if %var% ...
xzix 发表于 2011-8-18 22:53



    貌似没有延时呀  只要没有A.EXE就马上关机了
作者: xzix    时间: 2011-8-19 00:06

回复 6# 001011


@echo off
:A
set var=0
for /f %%a in ('tasklist') do (if /i %%a==A.exe set var=1)
if %var%==1 (echo 存在) else (GOTO B)
GOTO A
:B
echo.
shutdown -s -t 60
作者: smith203    时间: 2011-8-19 14:45

60秒就是延时吧。
作者: 001011    时间: 2011-8-19 19:18

还是不行呀  我现在用按键精灵解决了这个问题  谢谢啦
作者: xslxslxsl    时间: 2011-8-19 22:17

回复 5# 001011


    我刚刚上网看到你的消息,我当时是用记事本(notepad)做测试的,其实就是将那NOTEPAD的进程改成你那个程序的进程就可以了。不好意思回话迟了。
作者: wolfan    时间: 2011-8-20 12:40

这个其实就是用 tasklist、find 、ping -n 和管通或者FOR就可以了。
俺还是不太会用FOR,还是用 “| && ||”这个简单的好用的判断句顺手的说。~
作者: 001011    时间: 2011-8-21 00:21

回复  001011


    我刚刚上网看到你的消息,我当时是用记事本(notepad)做测试的,其实就是将那NOTE ...
xslxslxsl 发表于 2011-8-19 22:17

非常感谢您,非常好用。我从100调整到了3  OK
作者: cjiabing    时间: 2011-8-21 01:06

  1. @echo off&setlocal enabledelayedexpansion
  2. :loop
  3. set dp_var=1
  4. call :DetechProcess
  5. ping /n 60 127.0.1>nul
  6. if !dp_var!==1 (shutdown -s -t 60) else (goto loop)
  7. echo over
  8. pause
  9. exit
  10. :DetechProcess
  11. for /f "tokens=1" %%a in ('tasklist /fi "IMAGENAME eq notepad.exe" /FO TABLE /NH') do (
  12.     if /i "%%a"=="notepad.exe" (set dp_var=0&ping /n 20 127.0.1>nul&goto DetechProcess)
  13. )
  14. goto :eof
复制代码

作者: xslxslxsl    时间: 2011-8-21 20:48

回复 12# 001011
不用客气哦,好用就行了,大家都是为了学习嘛,这里的人很多都很耐心的,嘻嘻。
作者: yakeyun    时间: 2021-7-8 16:53

@echo off
::隐藏窗口
if "%1" neq "1" (
>"%temp%\tmp.vbs" echo set WshShell = WScript.CreateObject^(^"WScript.Shell^"^)
>>"%temp%\tmp.vbs" echo WshShell.Run chr^(34^) ^& %0 ^& chr^(34^) ^& ^" 1^",0
start /d "%temp%" tmp.vbs
exit
)
::执行代码
title 进程监控
::从进程列表中查找指定进程
:start
tasklist /nh>C:\kill.ini
@find /I /C "a.exe" C:\kill.ini > nul
if %ERRORLEVEL% == 0 (
ping 127.1 -n 9 >nul
goto start
) else (
echo %date%%time%   检测不到进程,5秒后执行关机 >>c:\log.ini
shutdown -s -t 5
)




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2