中国DOS联盟论坛

中国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:
::服务状态列表 By Slore
@echo off&setlocal EnableDelayedExpansion
sc query type= service state= all| findstr /r "SERVICE_NAME: STATE">tmpsrv.txt
Set flags=0
for /f " ...


这个还是计算不了当前正在运行的系统服务的个数
第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:
晕~有了这个那个还不容易?

findstr过滤出RUNNING的。。然后统计行数就好了

::服务状态列表 By Slore
@echo off&setlocal EnableDelayedExpansion
sc query type= ...



很感激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