![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-25 16:10 |
共 47,813 主题排行 / 349,918 发帖 / 今日 0 篇 / 48,274 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 紧急求助:如何实现无人干预自动备份系统服务 |
| 可打印版本 3,700 / 19 |
| 第1楼 livesweet | 发表于 2007-07-28 04:39 |
| 初级用户 发帖 45 积分 86 | |
|
紧急求助:如何实现无人干预自动备份系统服务 这是我编写的一个备份系统服务的批处理程序,可成功备份系统服务的状态和启动类型
现有两个问题不能解决: 1、程序运行是为何中途会有停顿,必须键盘按键才能继续运行??? 2、如何实现显示状态为START的系统服务的个数???我在第二行末尾加了SET /A NUM1=%NUM1%+1也没有没有起作用,最后NUM1变量的值还是1,为什么会没有参加循环计算??请各位高手指点!!!备份系统服务.BAT sc query type= service state= all| findstr /r /C:"SERVICE_NAME:" >tmpsrv.txt for /f "tokens=2 delims=:" %%j in (tmpsrv.txt) do sc query %%j|findstr STATE>tmpstype.txt && for /f "tokens=3 delims=: " %%s in (tmpstype.txt) do if "%%s"=="RUNNING" @echo sc start %%j>>恢复系统服务列表.bat for /f "tokens=2 delims=:" %%j in (tmpsrv.txt) do sc query %%j|findstr STATE>tmpstype.txt && for /f "tokens=3 delims=: " %%s in (tmpstype.txt) do if not "%%s"=="RUNNING" @echo sc stop %%j>>恢复系统服务列表.bat for /f "tokens=2 delims=:" %%j in (tmpsrv.txt) do @( sc qc %%j |findstr START_TYPE >tmpstype.txt && for /f "tokens=4 delims=:_ " %%s in (tmpstype.txt) do echo sc config %%j start= %%s >>"恢复系统服务列表.bat") del /q tmpstype.txt del /q tmpsrv.txt ren "恢复系统服务列表.bat" "恢复系统服务列表(%date%).bat" [ Last edited by livesweet on 2007-7-28 at 12:27 PM ] |
|
| 第2楼 livesweet | 发表于 2007-07-28 11:19 |
| 初级用户 发帖 45 积分 86 | |
|
自己顶一个先,请高手指教!!
|
|
| 第3楼 slore | 发表于 2007-07-28 11:54 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
::服务状态列表 By Slore
@echo off&setlocal EnableDelayedExpansion sc query type= service state= all| findstr /r "SERVICE_NAME: STATE">tmpsrv.txt Set flags=0 for /f "tokens=1,2,3,4" %%i in (tmpsrv.txt) do ( if !flags!==0 (Set flags=1&&Set SN=%%i%%j) else Set flags=0&&echo !SN! %%i:%%k %%l ) ::可以自己修改不要SERVICE_NAME: STATE,对应的是tokens的1即%%i pause |
|
| 第4楼 livesweet | 发表于 2007-07-28 12:28 |
| 初级用户 发帖 45 积分 86 | |
Originally posted by slore at 2007-7-28 11:54 AM: 这个还是计算不了当前正在运行的系统服务的个数 |
|
| 第5楼 slore | 发表于 2007-07-28 12:45 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
晕~有了这个那个还不容易?
findstr过滤出RUNNING的。。然后统计行数就好了 ::服务状态列表 By Slore @echo off&setlocal EnableDelayedExpansion sc query type= service state= all| findstr /r "SERVICE_NAME: STATE">tmpsrv.txt Set flags=0 for /f "tokens=1,2,3,4" %%i in (tmpsrv.txt) do ( if !flags!==0 (Set flags=1&&Set SN=%%i%%j) else Set flags=0&&echo !SN! %%i:%%k %% l>>tmpsrv1.txt ) ::可以自己修改不要SERVICE_NAME: STATE,对应的是tokens的1即%%i findstr/C:"RUNNING" tmpsrv1.txt>tmpsrv.txt for /f %%i in (tmpsrv.txt) do Set /a flags+=1 echo RUNNING中的服务有%flags%个 pause>nul del tmpsrv.txt del tmpsrv1.txt |
|
| 第6楼 livesweet | 发表于 2007-07-28 13:52 |
| 初级用户 发帖 45 积分 86 | |
Originally posted by slore at 2007-7-28 12:45 PM: 很感激slore,我是老菜来的,现在问题已经解决!是早上我按照你的方法操作时漏了一个符号没写!! 但是第一个问题为何这样???百思不得其解??? [ Last edited by livesweet on 2007-7-28 at 01:55 PM ] |
|
| 第7楼 slore | 发表于 2007-07-28 14:04 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
你的P我运行正常,就是调用SC的次数太多……很慢。。我这个主要是对文本用FOR一次处理好个清单,然后这个清单,有服务名,有启动模式,有运行状态。
所以用findstr筛选你想要的信息就很方便了。 |
|
| 第8楼 livesweet | 发表于 2007-07-28 23:15 |
| 初级用户 发帖 45 积分 86 | |
|
谢谢slore
|
|
| 第9楼 livesweet | 发表于 2007-07-29 11:36 |
| 初级用户 发帖 45 积分 86 | |
|
还有个问题啊!!
要查看系统服务的启动类型即START_TYPE好像只能用SC QC命令逐个服务查询???是不是这样的??如果这样要花很多时间的!!!有没有一次可以枚举所有服务启动类型的命令???? |
|
| 第10楼 slore | 发表于 2007-07-29 12:12 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("Services.txt") strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Service") For Each objItem In colItems OutStr = OutStr & objItem.Name & " " & objItem.StartMode & " " & objItem.State & vbCrLf Next objFile.Write OutStr objFile.Close Set objWMIService = Nothing Set colItems = Nothing Set objFile = Nothing Set objFSO = Nothing 这个可以得到格式: 如果你了解SQL语句的话可以直接过滤出你想要的某些条件服务…… |
|
| 第11楼 terse | 发表于 2007-07-29 13:13 |
| 银牌会员 发帖 946 积分 2,404 | |
|
发一个备份当前服务的P:
@echo off rem get current date and time for /f "tokens=1, 2, 3, 4 delims=-/. " %%j in ('Date /T') do set FILENAME=srv_%%j_%%k_%%l_%%m for /f "tokens=1, 2 delims=: " %%j in ('TIME /T') do set FILENAME=%FILENAME%_%%j_%%k.bat rem get all service name sc query type= service state= all| findstr /r /C:"SERVICE_NAME:" >tmpsrv.txt echo Save Service Start State In %FILENAME% rem save service start state into batch file rem echo @echo Restore The Service Start State Saved At %TIME% %DATE% >"%FILENAME%" echo @pause >>"%FILENAME%" for /f "tokens=2 delims=:" %%j in (tmpsrv.txt) do @( sc qc %%j |findstr START_TYPE >tmpstype.txt && for /f "tokens=4 delims=:_ " %%s in ( tmpstype.txt) do @echo sc config %%j start= %%s >>"%FILENAME%") echo @pause >>"%FILENAME%" del tmpsrv.txt del tmpstype.txt |
|
| 第12楼 slore | 发表于 2007-07-29 13:30 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
和原来的一样调用SC好多次……有点慢。
好像和LZ的那段没有什么区别 |
|
| 第13楼 livesweet | 发表于 2007-07-29 15:12 |
| 初级用户 发帖 45 积分 86 | |
|
先谢了slore和terse!我还有问题迟下回来再问。
|
|
| 第14楼 livesweet | 发表于 2007-07-29 23:22 |
| 初级用户 发帖 45 积分 86 | |
|
还有一种情况我想只是我机器的特殊情况
为什么以上程序执行老,总是在这几个地方会停下了,必须按键才能继续运行,我作了截图,一共6个地方停下来,而且是关系到三个服务的,一个是显卡服务,一个是声卡服务,还有一个是多媒体的,为什么会停下来啊??能不能解决?? [ Last edited by livesweet on 2007-7-29 at 11:25 PM ] 附件 1.JPG (74.11 KiB) |
|
| 第15楼 livesweet | 发表于 2007-07-29 23:22 |
| 初级用户 发帖 45 积分 86 | |
|
2
附件 2.JPG (67.13 KiB) |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |