无忧启动论坛

标题: 请高手帮忙批处理怎么解决? [打印本页]

作者: uc9    时间: 2016-7-19 10:23
标题: 请高手帮忙批处理怎么解决?
本帖最后由 uc9 于 2016-7-22 20:05 编辑

请问这个批处理,需要怎么修改
执行久了,很容易当机


:go

timeout /t 10
tasklist /FI "IMAGENAME eq 001.exe" /FO CSV > search.log
FOR /F %%A IN (search.log) do if %%A == 资讯: goto process_off
:process_on
goto end
:process_off
start 002.exe
timeout /t 10
taskkill /f /im 002.exe
:end

del search.log

goto go
作者: dos时代菜鸟    时间: 2016-7-19 11:15
本帖最后由 dos时代菜鸟 于 2016-7-19 12:08 编辑

循环判断 系统进程中是否存在 001.exe 如果不存在就运行 002.exe ,10秒后关闭002进程,,循环间隔 10秒。

1、将当前进程转换成文件通过 for 调取,可能造成时间上的误差,
2、002进程未必能在10秒后开启,

所以给你改进如下:
1、直接用 for 对tasklist命令结果进行分析 2、增加 002 进程的存在的循环判断。 win7.ch.x86 环境调试通过。



  1. @echo off
  2. :loop1
  3. echo.
  4. echo loop1 循环监视 notepad.exe 进程,如果进程消失,就启动 iexplore.exe
  5. timeout /t 10  /nobreak >nul
  6. FOR /F %%A IN ('tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV') do (
  7.          if "%%A" == "信息:" (
  8.                 start iexplore.exe
  9. :loop2
  10. echo.
  11. echo loop2  循环等待 iexplore.exe 进程,如果出现就关闭之,并退出 loop2 循环
  12.                 timeout /t 5 /nobreak >nul
  13.                 FOR /F  "skip=1"  %%A IN ('tasklist /FI "IMAGENAME eq iexplore.exe" /FO CSV') do (
  14.                         taskkill /f /im iexplore.exe
  15.                         goto loop1
  16.                 )
  17.                 goto loop2
  18.         ) else (
  19.                 goto loop1
  20.         )

  21. )
复制代码





作者: uc9    时间: 2016-7-19 13:26
dos时代菜鸟 发表于 2016-7-19 11:15
循环判断 系统进程中是否存在 001.exe 如果不存在就运行 002.exe ,10秒后关闭002进程,,循环间隔 10秒。

...

用了你的代码,以.bat执行
进程一闪就消失了
希望的功能是能够,常驻运行
win7.x64
谢谢
作者: dos时代菜鸟    时间: 2016-7-19 14:17
本帖最后由 dos时代菜鸟 于 2016-7-19 14:21 编辑
uc9 发表于 2016-7-19 13:26
用了你的代码,以.bat执行
进程一闪就消失了
希望的功能是能够,常驻运行


这种 利用 cmd 实现 死循环,并在循环中调用 外部命令 的cmd脚本,运行效率不高,本人不建议常驻内存。
如果非要如此,应该考虑编写 vbs 或者 powershell 或者 exe .

可以把 需要驻留内存的 001 类的程序 和不需要 存在的 002 类程序 imagename 统统写入一个txt 文件做数据库,交由 脚本 处理。如此就可以处理 更多的需要监视的进程。
作者: uc9    时间: 2016-7-19 15:01
dos时代菜鸟 发表于 2016-7-19 14:17
这种 利用 cmd 实现 死循环,并在循环中调用 外部命令 的cmd脚本,运行效率不高,本人不建议常驻内存。
...

感谢帮助,本人程式一窍不通
只好原来的,继续使用--
作者: dos时代菜鸟    时间: 2016-7-20 10:19
没看明白 ,
1.你是说,我那个 脚本一运行 就 消失了?没有发挥作用?
2.还是,脚本发挥了作用,你那个 不想要的 002 进程瞬间就关闭了?

要是你自己不会改 脚本,连 notepad 换成 001 都不会,那就只能算了。
你原来的 脚本是搜索 tasklist 指令返回文本 中的 "咨询:" ,而我在 win7.x86中发现,应该是 "信息:" ,这个和语言环境有关系,难道你用的是 繁体?这个也需要你自己改。



作者: 窄口牛    时间: 2016-7-20 11:03
字体不是繁体,但措辞是繁体,我猜是港或台简体。
作者: uc9    时间: 2016-7-20 15:24
dos时代菜鸟 发表于 2016-7-20 10:19
没看明白 ,
1.你是说,我那个 脚本一运行 就 消失了?没有发挥作用?
2.还是,脚本发挥了作用,你那个  ...

@echo off
:loop1
echo.
echo loop1 循环监视 notepad.exe 进程,如果进程消失,就启动 02.exe
timeout /t 10  /nobreak >nul
FOR /F %%A IN ('tasklist /FI "IMAGENAME eq 01.exe" /FO CSV') do (
         if "%%A" == "信息:" (
                start 02.exe
:loop2
echo.
echo loop2  循环等待 02.exe 进程,如果出现就关闭之,并退出 loop2 循环
                timeout /t 5 /nobreak >nul
                FOR /F  "skip=1"  %%A IN ('tasklist /FI "IMAGENAME eq 02.exe" /FO CSV') do (
                        taskkill /f /im 02.exe
                        goto loop1
                )
                goto loop2
        ) else (
                goto loop1
        )


没错我用的是繁体,win7-x64 大大真厉害
这个脚本一运行,就消失了,完全没有发挥作用
作者: yfwang0798    时间: 2016-7-20 16:50
每检查一次后,应  释放 %%a 清空变量的值,释放内存空间。
作者: 窄口牛    时间: 2016-7-20 17:22
那你必须把汉字都改了,也得把措辞改对,比如信息必须改成資詢
作者: nttwqz    时间: 2016-7-20 23:26
仅学过几天AU3,水平有限,简单编了个小工具,测试有效。

附件是编译好的,杀毒软件一般都会报毒(小a检测通过),特别是360(连bat都不放过,何况...),所以一定要添加例外,或者允许。
不放心可以自己下载au3安装编译。当然,这是能用的前提下。。。




  1. #include <Misc.au3>
  2. If _Singleton("test", 1) = 0 Then Exit

  3. #pragma compile(UPX, true)
  4. #pragma compile(Compression, 9)
  5. #pragma compile(FileDescription, "循环检测001.exe进程,然后操作002.exe")


  6. ;在运行里输入001.exe或002.exe能打开的,本程序才能正常工作
  7. ;否则请编辑环境变量Path,将001.exe和002.exe的目录添加进去就可以了


  8. While 1
  9.    If Not ProcessExists("001.exe") Then
  10.           ShellExecute("002.exe")
  11.           If ProcessExists("002.exe") Then
  12.                  Sleep(10000)
  13.                  ProcessClose("002.exe")
  14.           EndIf
  15.    EndIf
  16.    Sleep(10000)
  17. WEnd
复制代码




C001D002.7z (368.53 KB, 下载次数: 0)


作者: nttwqz    时间: 2016-7-21 01:40
批处理,同样假设001.exe和002.exe能直接运行打开


  1. @echo off
  2. mode con: cols=30 lines=10
  3. echo CreateObject^("Shell.Application"^).ShellExecute "%~f0", "", "", "runas", 1 > "%temp%\getadmin.vbs"
  4. reg query HKU\S-1-5-20>nul 2>nul||cscript //b "%temp%\getadmin.vbs"&&del "%temp%\getadmin.vbs" /f /q>nul 2>nul&&exit /b
  5. title C001D002
  6. color 2f

  7. echo.&echo.&echo.&echo.
  8. set /p=│          执行中...       │<nul

  9. :start
  10. wmic process where "name='002.exe'" get name 2>nul | find /i "002.exe" >nul 2>nul
  11. if %errorlevel%==0 (
  12.         timeout /t 10 /nobreak >nul 2>nul
  13.         taskkill /im 002.exe /f >nul 2>nul
  14. )

  15. wmic process where "name='001.exe'" get name 2>nul | find /i "001.exe" >nul 2>nul
  16. if not %errorlevel%==0 (
  17.         start 002.exe
  18.         call :002openwait
  19.         ) else (
  20.         timeout /t 10 /nobreak >nul 2>nul
  21.         goto start
  22. )

  23. :002openwait
  24. wmic process where "name='002.exe'" get name 2>nul | find /i "002.exe" >nul 2>nul
  25. if %errorlevel%==0 (
  26.         timeout /t 10 /nobreak >nul 2>nul
  27.         taskkill /im 002.exe /f >nul 2>nul
  28.         ) else (
  29.         goto 002openwait
  30. )
  31. timeout /t 10 /nobreak >nul 2>nul
  32. goto start
复制代码

作者: uc9    时间: 2016-7-21 06:52
nttwqz 发表于 2016-7-20 23:26
仅学过几天AU3,水平有限,简单编了个小工具,测试有效。

附件是编译好的,杀毒软件一般都会报毒(小a检 ...

#include <Misc.au3>
If _Singleton("test", 1) = 0 Then Exit

#pragma compile(UPX, true)
#pragma compile(Compression, 9)
#pragma compile(FileDescription, "循环检测001.exe进程,然后操作002.exe")


;在运行里输入001.exe或002.exe能打开的,本程序才能正常工作
;否则请编辑环境变量Path,将001.exe和002.exe的目录添加进去就可以了


While 1
   If Not ProcessExists("001.exe") Then
          ShellExecute("002.exe")
          If ProcessExists("002.exe") Then
                 Sleep(10000)
                 ProcessClose("002.exe")
          EndIf
   EndIf
   Sleep(10000)
WEnd

谢谢ntt大,测试可用
如果要001.exe每运行30分钟后
关闭001.exe进程一次再重启,要如何修改

ps  001.exe进程需要用002.exe才能开启
作者: uc9    时间: 2016-7-21 06:54
nttwqz 发表于 2016-7-21 01:40
批处理,同样假设001.exe和002.exe能直接运行打开

用了你的批处理,以.bat执行
进程一闪就消失了
作者: nttwqz    时间: 2016-7-21 11:55
uc9 发表于 2016-7-21 06:54
用了你的批处理,以.bat执行
进程一闪就消失了
ps  001.exe进程需要用002.exe才能开启


如果有其它问题,请一并说清楚,因为我不知道你是怎么用的。我还怕打开批处理的时候002已经开启,所以开头加了检测等待结束以免重复运行,看来是多余了

你说的进程消失,是说的哪个进程,001?002?还是说我的批处理,批处理我试了几分钟没有问题。

001是在002启动后才能启动,还是用002去启动001?
作者: uc9    时间: 2016-7-21 12:56
nttwqz 发表于 2016-7-21 11:55
如果有其它问题,请一并说清楚,因为我不知道你是怎么用的。我还怕打开批处理的时候002已经开启,所 ...

001因为有检测,需要用002开起过检测
因为001每30分钟还会检测一次
所以需要每运行30分再重启一次
002开启001有时候会失败


进程消失,是说的哪个进程------ 批处理消失
批处理以.bat执行,画面一闪就不见了

AU3的方法测试8个小时没问题
作者: nttwqz    时间: 2016-7-21 18:25
uc9 发表于 2016-7-21 12:56
001因为有检测,需要用002开起过检测
因为001每30分钟还会检测一次
所以需要每运行30分再重启一次

两个人的批处理都一闪而过?!

不知道你是怎么另存为的,不要点击那个复制,手动选择复制,打开记事本,自动换行取消,另存为一定要选ASCII编码。

既然au3没问题,我在帮你实现重启001就可以了。

001应该怎么启动?先启动002,等002启动后,再启动001,然后10秒后结束002?

还是,直接重启001,不管002
作者: uc9    时间: 2016-7-21 18:57
nttwqz 发表于 2016-7-21 18:25
两个人的批处理都一闪而过?!

不知道你是怎么另存为的,不要点击那个复制,手动选择复制,打开记事本 ...

感谢ntt大的回覆

启动002就会启动开启001
反正就是001不存在时
就开启002来启动001
001开启后就要关闭002
30分钟关闭001一次
叙述有点不好请原谅
作者: 窄口牛    时间: 2016-7-21 19:34
002是启动001的,没有001就用002来启动它。30分钟要关闭一次001。
作者: nttwqz    时间: 2016-7-22 14:06
uc9 发表于 2016-7-21 18:57
感谢ntt大的回覆

启动002就会启动开启001
  1. #include <Misc.au3>
  2. #include <Timers.au3>
  3. If _Singleton("test", 1) = 0 Then Exit

  4. #pragma compile(UPX, true)
  5. #pragma compile(Compression, 9)
  6. #pragma compile(FileDescription, "循环检测001.exe,然后操作002.exe,且每30分钟重启001.exe")

  7. Local $starttime, $nowtime, $endtime
  8. $starttime = _Timer_Init()

  9. While 1
  10.           $nowtime = Round(_Timer_Diff($starttime)/1000,2)
  11.           $endtime = $nowtime/1800
  12.           If ProcessExists("001.exe") And StringIsInt($endtime) Then
  13.                  ProcessClose("001.exe")
  14.           ElseIf Not ProcessExists("001.exe") Then
  15.                  ShellExecute("002.exe")
  16.                  If ProcessExists("002.exe") Then
  17.                         Sleep(10000)
  18.                         ProcessClose("002.exe")
  19.                  EndIf
  20.                  Sleep(10000)
  21.                  $nowtime -= 20
  22.           EndIf
  23. WEnd
复制代码

作者: nttwqz    时间: 2016-7-22 14:07
先试试,不晓得可用半小时可用否,计时可能会不准确或错误。
作者: uc9    时间: 2016-7-22 16:01
nttwqz 发表于 2016-7-22 14:06

刚刚测试计时不会和001同步
我设定5分自动重自
15/5开始15/10  自动重自
15/13手动关闭001自动重自后 15/15又自动重自

15/20自动重自
15/21手动关闭001自动重自后 15/25又自动重自
如果能15/21关闭001自动重自后15/26又自动重自更好
不过这样也可以用,反正知道用法就好
谢谢大家的帮忙
作者: nttwqz    时间: 2016-7-22 17:51
uc9 发表于 2016-7-22 16:01
刚刚测试计时不会和001同步
我设定5分自动重自
15/5开始15/10  自动重自

你自己改成5分钟了?

获取进程运行时间目前无法做到,不过批处理我倒是知道

所以,我是从脚本开始计时的,并不是001的运行时间
作者: uc9    时间: 2016-7-22 20:06
nttwqz 发表于 2016-7-22 17:51
你自己改成5分钟了?

获取进程运行时间目前无法做到,不过批处理我倒是知道

改5分钟是测试用
我现在还是用第一次的版本
感谢
ntt大的帮忙
作者: 鲁a4cb79    时间: 2016-9-5 14:11
为什么回复也要那么多字啊.........UR银盾uryindun.com
UR银盾钢化膜aiyanm.com












看帖是心情,回帖是道德
UR银盾uryindun.com
UR银盾钢化膜aiyanm.com

作者: wushb    时间: 2016-9-12 14:10
相信楼主的说,非常支持你












民间捉鬼师,重庆民间道士
作者: qq909877    时间: 2019-10-5 19:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: gdd123123    时间: 2021-5-18 22:44
请教各位大神们如何把USB和网卡的电源节能模式关掉做成批处理或者脚本




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3