[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
先不论技术,首先这个题就没有多打意义?批处理的优势在于“源码”完全公开,还搞那么流氓干啥?

TOP

因为还看不懂  所以支持一下

TOP

如果再加上个AT ...,三重保险,就更不得了了

TOP

只有看的份。插不上嘴。呵呵

TOP

对我来说是极大的难度,我等着看结果~不过这样有点类似于禁止终结某个进程以及本批处理也防止被终止

TOP

大家看看这个代码应该能行~~不是本人原创!!

@echo off & SetLocal EnableDelayedExpansion

set "self=%~0"
if /i "%~1"=="ExitCode" goto :EXIT
if /i "%~1"=="" echo 现在是测试运行
if /i "%~1"=="WIN_Exit" echo 貌似我又复活了
echo start "" "%~0" WIN_Exit>ErrExit.cmd
call :查找进程

call :FINDEXISTPID

call :守护进程

start Check.vbs
:REINPUT
        echo -----------------------------------------
        echo  输入:ExitCode 完全退出程序
        echo -----------------------------------------
        set /p "Input=请输入入口代码:"
        if /i "%Input%"=="ExitCode" goto :EXITPROCESS_OK
goto :REINPUT

:查找进程
echo for each ps in getobject _>ps.vbs
echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
echo if ps.name ="cmd.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
echo next>>ps.vbs
goto :EOF

:FINDEXISTPID
        if exist ExistPid.txt del ExistPid.txt
        for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do echo %%m>>ExistPid.txt
        for /f "tokens=1,* " %%m in ('cscript //nologo ps.vbs') do (
                type ExistPid.txt | find /i "%%m">nul && set "Pid=%%m"
                )
goto :EOF

:守护进程
echo set Cleaner=createobject^("wscript.shell"^)>Check.vbs
echo do>>Check.vbs
echo WScript.Sleep 100>>Check.vbs
echo if not isProcessExists^("%Pid%"^) then>>Check.vbs
echo Cleaner.run "ErrExit.cmd">>Check.vbs
echo Exit do>>Check.vbs
echo End if>>Check.vbs
echo loop>>Check.vbs
echo Function isProcessExists^(proName^)>>Check.vbs
echo Set objWMIService = GetObject^("winmgmts:" ^& "{impersonationlevel=impersonate}^!\\.\root\cimv2"^)>>Check.vbs
echo Set colProcessList = objWMIService.ExecQuery^("Select * from Win32_Process Where Handle='" ^& proName ^& "'"^)>>Check.vbs
echo isProcessExists = ^(colProcessList.Count ^<^> 0^)>>Check.vbs
echo End Function>>Check.vbs
goto :EOF
:EXITPROCESS_OK
echo for each ps in getobject _>ps.vbs
echo ^("winmgmts:\\.\root\cimv2:win32_process"^).instances_ >>ps.vbs
echo if ps.name ="WScript.exe" Then wscript.echo ps.handle^&vbtab^&ps.name>>ps.vbs
echo next>>ps.vbs

for /f "tokens=1,* " %%i in ('cscript //nologo ps.vbs') do ntsd -c q -p %%i
echo del ps.vbs>>deltemp.cmd
echo del check.vbs>>deltemp.cmd
echo del ErrExit.cmd>>deltemp.cmd
echo del ExistPid.txt>>deltemp.cmd
echo del run.vbs>>deltemp.cmd
echo del deltemp.cmd>>deltemp.cmd
echo set Cleaner=createobject^("wscript.shell"^)>>run.vbs
echo Cleaner.run "cmd /c deltemp.cmd",^0>>run.vbs
start run.vbs

:EXIT
exit

TOP

原帖由 youxi01 于 2009-3-24 18:41 发表
个人认为,通过此种方式 来实现的话,太容易让人发现了,没太大的应用价值

有个问题不懂:为什么要让一个批处理不停的运行呢?

如果真要这样,把所要的批处理注册为系统服务是不是更简洁明了?

如果需要有价值的话,就不是讨论这个了.

这个题目只是为了开阔批处理的使用方式而已..

另:思路大家都会想,但实现才是最重要的..

就好象说想飞到天上去:甚至有很多现成的思路可以帮你完成,但若你自己要飞上去,还是有好多细节要完成的.

而细节决定成败.

TOP

个人认为,通过此种方式 来实现的话,太容易让人发现了,没太大的应用价值

有个问题不懂:为什么要让一个批处理不停的运行呢?

如果真要这样,把所要的批处理注册为系统服务是不是更简洁明了?

TOP

有wmic的话多简单,直接创建进程就好了,自动返回PID的。。。

TOP

回复 53楼 的帖子

刚学批处理的时候,试着写所谓的批处理病毒,用的就是这个方法,呵呵。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

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

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

TOP

原帖由 qq362220083 于 2009-3-18 06:27 发表
又仔细看了下题目,发现我似乎没做第一个。另外参考了前面几位朋友的代码,第三个其实也不麻烦啊。

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

第三个 ...


嗯,使用批处理与vbs的结合是可以实现bat被删除时提示"文件正在使用"的..

嗯,就我不玩批处理时的研究,可以实现防修改防删除的目的..

不过方法有点恶心.呵,还可以杀冰刃哟

只提示,可以实现哟:

[ 本帖最后由 flyinspace 于 2009-3-22 02:02 编辑 ]

TOP

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

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

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

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

TOP

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

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

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

返回列表