标题: 如何让批处理不断扫描进程,并结束指定进程
[打印本页]
作者: xjzhf4
时间: 2008-1-21 18:05
标题: 如何让批处理不断扫描进程,并结束指定进程
请各位高手帮我写一个批处理,可以一直扫描进程,如发现有dwwin.exe进程,则立即结束它,谢谢,另外这个批处理要和下面这个批处理文件配合使用,我发出来大家看下。下面这个批处理是保证DprClient.exe一直运行的,但DprClient.exe不能和dwwin.exe同时运行。最好能隔五分种扫描一次,先谢谢各位了。
@echo off
set app_name=DprClient.exe
set app_path=D:\asde\bb
set proc_name=%app_name%
set reboot=0
set rdelay=300
set call_delay=120
set loop_timeout=60
set /a _m=2
set fullname=%app_path%\%app_name%
set tmpvar=%_m%
set /a _m=%_m%+1
set /a count=0
set /a tmpvar1=0
:loop
cls
echo .........................................
echo 延时守护脚本(WinXP)
echo .........................................
echo 可实现延时启动、看护、重启系统
echo 纯脚本运行不需借助第三方工具
echo 请将本脚本放入 Windows 启动组自动运行
echo.
echo 设定参数列表
echo 被看护对象:%app_name%
echo 对象路径:%app_path%
echo 进程名称:%proc_name%
echo 检查周期:%loop_timeout% 秒 呼叫延时:%call_delay% 秒
echo 重启系统延时:%rdelay% 秒
echo 重启前被看护程序死亡次数:%tmpvar% 次
echo .........................................
echo.
if not exist "%fullname%" goto nofile
goto begin
:nofile
echo 找不到文件 %fullname%
echo 请检查脚本
echo 脚本中止
goto end
:begin
echo 查找进程 %proc_name%
(tasklist /nh | findstr /i "%proc_name%") || (goto callit)
echo 程序已运行
echo 被看护对象已经死亡 %tmpvar1% 次
goto continue
:callit
echo 进程未找到
set /a count=%count%+1
set /a tmpvar1=%count%-1
echo 被看护对象已经死亡 %tmpvar1% 次
if %count% EQU %_m% goto reboot
echo 延时 %call_delay% 秒启动
ping -n %call_delay% localhost > nul
start "" /D"%app_path%" "%app_name%"
goto continue
:continue
echo.
echo 等待 %loop_timeout% 秒重新看护
ping -n %loop_timeout% localhost > nul
goto loop
:reboot
echo 按规则将在 %rdelay% 秒之后重启
echo.
shutdown /r /t %rdelay% /c "被看护程序死亡 %tmpvar% 次,按规则将在 %rdelay% 秒之后重启"
:choice
set /P choice=要中止重启动,输入Y(不分大小写)并回车:
if /I "%choice%" NEQ "Y" goto choice
:stop
shutdown /a
echo 重启已经中止
goto end
:end
echo 按任一键退出守护脚本
pause>nul
[
Last edited by xjzhf4 on 2008-1-21 at 06:07 PM ]
作者: xjzhf4
时间: 2008-1-21 19:27
咋还没有帮我呀,自己顶个先。。
作者: plp626
时间: 2008-1-21 21:42
你哪程序看的 我头晕.
很基本,太基本:
:loop
ping/n 5 127.1>nul
tskill dwwin
goto loop
[
Last edited by plp626 on 2008-1-21 at 09:43 PM ]
作者: zhu6225103
时间: 2008-1-22 01:07
感觉楼主的那个P全是废话比较多有用的没几句
作者: dato
时间: 2008-1-22 08:41
你用"进程"做关键词搜索一下吧,似乎只有注册表的映象截止方式才能实现你的要求
想用纯批的方法实现即时监测,汗那CPU资源占用就厉害了,这种只有用高级语言才好实现
作者: regvip2008
时间: 2008-1-23 10:11
楼上说得非常有道理!
作者: fastslz
时间: 2008-1-23 11:31
5秒提示方式
On Error Resume Next
strComputer = "."
arrTargetProcs = Array("calc.exe")
set objShell = CreateObject ("Wscript.Shell")
Set SINK = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
objWMIService.ExecNotificationQueryAsync SINK, _
"SELECT * FROM __InstanceCreationEvent WITHIN 1 " & _
"WHERE TargetInstance ISA 'Win32_Process'"
Do
WScript.Sleep 1000
Loop
Sub SINK_OnObjectReady(objLatestEvent, objAsyncContext)
For Each strTargetProc In arrTargetProcs
If LCase(objLatestEvent.TargetInstance.Name) = LCase(strTargetProc) Then
ProcessName=objLatestEvent.TargetInstance.Name
objShell.Popup Now & " 发现进程: " & ProcessName, 5, "提示信息"
intReturn = objLatestEvent.TargetInstance.Terminate
If intReturn = 0 Then
objShell.Popup Now & " 终止进程: " & ProcessName & " 成功", 5, "提示信息"
Else
objShell.Popup Now & " 终止进程: " & ProcessName & " 失败", 5, "提示信息"
End If
End If
Next
End Sub
宁静日志方式(D:\kill.log)
On Error Resume Next
strComputer = "."
arrTargetProcs = Array("calc.exe")
set objShell = CreateObject ("Wscript.Shell")
set fso=Wscript.CreateObject("Scripting.FileSystemObject")
set file=fso.OpenTextFile("D:\kill.log",2,True)
Set SINK = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
objWMIService.ExecNotificationQueryAsync SINK, _
"SELECT * FROM __InstanceCreationEvent WITHIN 1 " & _
"WHERE TargetInstance ISA 'Win32_Process'"
Do
WScript.Sleep 1000
Loop
Sub SINK_OnObjectReady(objLatestEvent, objAsyncContext)
For Each strTargetProc In arrTargetProcs
If LCase(objLatestEvent.TargetInstance.Name) = LCase(strTargetProc) Then
ProcessName=objLatestEvent.TargetInstance.Name
file.Writeline Now & " 发现进程: " & ProcessName
intReturn = objLatestEvent.TargetInstance.Terminate
If intReturn = 0 Then
file.Writeline Now & " 终止进程: " & ProcessName & " 成功"
Else
file.Writeline Now & " 终止进程: " & ProcessName & " 失败"
End If
End If
Next
End Sub
Quote: |
arrTargetProcs = Array("calc.exe")把calc.exe改为自己的程序名 |
|