[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
俺刚来,在找个资料的时候,偶然发现了这个感兴趣的话题,看来今晚上睡不着觉了。明天还要约会呢,5555555

看我今晚上能不能搞掉这个挑战

TOP

  1. @echo off
  2. if "%~1"=="0" (goto :App0)
  3. if "%~1"=="1" (goto :App1)
  4. if "%~1"=="C" (goto :App2)
  5. if "%~1"=="R" (goto :App3)
  6. start "" %~nx0 0
  7. exit
  8. :App0
  9. start "" %~nx0 1
  10. start "" %~nx0 C
  11. exit
  12. :App1
  13. title 主
  14. echo.
  15. echo.
  16. echo 嗯,现在是批处理测试ing...
  17. echo.
  18. set /p keycode=
  19. if "%keycode%"=="q" (goto :App4)
  20. goto :App1
  21. :App2
  22. title 创建守护VBS...
  23. ::::::::::::::::::::::::::::::::::::::::::::::::::::
  24. echo.if Wscript.Arguments.count ^< 1 then >noshut1.vbs
  25. echo. wscript.quit >>noshut1.vbs
  26. echo.end if >>noshut1.vbs
  27. echo.select case ucase(Wscript.Arguments(0)) >>noshut1.vbs
  28. echo. case "Q" >>noshut1.vbs
  29. echo. wscript.quit >>noshut1.vbs
  30. echo. case "R" >>noshut1.vbs
  31. echo. >>noshut1.vbs
  32. echo. >>noshut1.vbs
  33. echo.Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") >>noshut1.vbs
  34. echo.Set colMonitoredProcesses = objWMIService.ExecNotificationQuery("select * from __instancedeletionevent within 1 where TargetInstance isa 'Win32_Process'") >>noshut1.vbs
  35. echo.Do While i ^<^> -1 >>noshut1.vbs
  36. echo.Set objLatestProcess = colMonitoredProcesses.NextEvent >>noshut1.vbs
  37. echo.if instr(objLatestProcess.TargetInstance.CommandLine,WScript.ScriptName ^& " Q") > 0 then >>noshut1.vbs
  38. echo. exit do >>noshut1.vbs
  39. echo.end if >>noshut1.vbs
  40. echo.for i=1 to Wscript.Arguments.count-1 >>noshut1.vbs
  41. echo. if instr(objLatestProcess.TargetInstance.CommandLine,Wscript.Arguments(i)) > 0 then >>noshut1.vbs
  42. echo. '结束的进程是被守护进程i,则启动 >>noshut1.vbs
  43. echo. if instr(wscript.arguments(i)," 1") > 0 then >>noshut1.vbs
  44. echo. Wscript.createobject("wscript.shell").run replace(objLatestProcess.TargetInstance.CommandLine," 1"," R"),1 >>noshut1.vbs
  45. echo. else >>noshut1.vbs
  46. echo. Wscript.createobject("wscript.shell").run objLatestProcess.TargetInstance.CommandLine,1 >>noshut1.vbs
  47. echo. end if >>noshut1.vbs
  48. echo. end if >>noshut1.vbs
  49. echo.next >>noshut1.vbs
  50. echo.Loop >>noshut1.vbs
  51. echo.wscript.sleep 3000 >>noshut1.vbs
  52. echo.wscript.quit >>noshut1.vbs
  53. echo.end select >>noshut1.vbs
  54. ::::::::::::::::::::::::::::::::::::::::::::::::::::
  55. copy noshut1.vbs noshut2.vbs
  56. start wscript.exe //nologo noshut1.vbs R "%~nx0 1" "%~nx0 R" "noshut2.vbs R"
  57. start wscript.exe //nologo noshut2.vbs R "noshut1.vbs R"
  58. exit
  59. :App3
  60. title 被关闭后,重新运行
  61. echo 哈哈,我又运行了!
  62. pause>nul
  63. goto :App1
  64. :App4
  65. title 带参数启动守护VBS,使其结束自身
  66. start wscript.exe //nologo noshut1.vbs Q
  67. start wscript.exe //nologo noshut2.vbs Q
  68. ping.exe 127.1 -n 15 >nul 2>nul
  69. del noshut1.vbs /f /q /a >nul 2>nul
  70. del noshut2.vbs /f /q /a >nul 2>nul
  71. exit
复制代码


似乎第三条,被Kill后不同的提示,这个没法做,只能和被结束一起处理

嘿嘿,2个VBS互相守护
一个看着 bat 和另一个 vbs
另一个只管 第一个vbs

TOP

测试的时候发现个问题,系统的bat关联传参数的时候,第一个参数前面有2个空格,所以在启动守护进程的时候,对于bat参数,我多加了个空格。

    若有时无法检测bat时,可以去掉看看。反正我的系统是2个空格。。。

TOP

又仔细看了下题目,发现我似乎没做第一个。另外参考了前面几位朋友的代码,第三个其实也不麻烦啊。

说下思路吧:
第一个可以修改vbs,检查bat被结束后,则创建以当前日期时间命名的文件或写入某个文件

第三个可以在P启动后创建临时文件,正常关闭时删除临时文件。下次启动时,先检查那个文件,若存在,则删除它,并提示复活。否则继续重复

P处理高级功能有限,尤其对于进程和系统其他高级操作,所以只好借助VBS实现双进程守护。不知能不能实现文件锁定呢,这样删除P就无效了,哈哈

TOP

还是只写思路吧,实在没时间弄代码了,最近调试软件调的我一看代码就头晕。

批处理启动时复制一个自己的副本到临时文件夹

守护VBS使用WMI,检测系统删除文件消息,若是两个批处理的任意一个,则复制对方至被删除的地方。若是主批被删除,复制还原后还需要重新执行主批。
当一个人不断追问的时候,其实就已经对自己产生了怀疑

TOP

返回列表