网络技术疯人院

电脑网络常见故障、疑难杂症,电脑网络学堂,网络管理员,硬件装机,网络前沿技术

« 局域网访问的问题解析推荐一款不错的加密软件,并教你如何破解垃圾加密软件 »

读阿拉发贴的 XP-2003服务优化批处理

小民新来,不懂规矩,新发一贴,就是向大家学习。
(另:威望太少,赚点好下东西)
今天下了阿拉发贴的 XP-2003服务优化批处理(就在一个超多附件的贴中——害我没威望了),正是我要找的东西。理解了下,拿出来分享。
我要做的是服务的批处理备份和一次设置到位,帖中附件是只有服务的启动状态,没有服务失败是否重启,不知道谁增强过没。自己也边试试加上,废话少说了。
今天时间关系贴出服务备份.BAT的注解吧(其他的简单)

// 第一段,写备份文件名。目标:srv_2008_04_13_星期日_17_25.bat
@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。Date /T输出为2008-04-13 星期日,故分四段取出"2008"、"04"、"13"、"星期日",把-和空格作为分隔符
for /f "tokens=1, 2 delims=: " %%j in ('TIME /T') do set FILENAME=%FILENAME%_%%j_%%k.bat
//参考for的用法,写文件故用/f。TIME /T输出为17:25,故分两段取出"17"、"25",把:作为分隔符。


rem get all service name
sc query type= service state= all| findstr /r /C:"SERVICE_NAME:" >tmpsrv.txt
//参考sc命令的用法。在本机中输入sc query type= service state= all,显示如下许多服务结果。

SERVICE_NAME: xmlprov
DISPLAY_NAME: Network Provisioning Service
        TYPE               : 20  WIN32_SHARE_PROCESS
        STATE              : 1  STOPPED
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN))

        WIN32_EXIT_CODE    : 1077  (0x435)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
根据现在的需要,理解下findstr /r /C:"SERVICE_NAME:"
参考findstr命令的用法。 /R         将搜索字符串作为一般表达式使用。
因为对结果文本明确需要SERVICE_NAME:分隔打头的服务,故字符串搜索,作为一般表达式(有区别于正则表达式)。取出来的是:类似于SERVICE_NAME: xmlprov的系统服务列表,仅有该表达式,只包含服务名。
理解下>tmpsrv.txt这句,即是输出到一个临时的文本文件中。(有区别于>>追加输出)
句中|号为通道,即前面的输出作为后面的输入。
该整句含义是把系统的服务名称按SERVICE_NAME: xmlprov记录方式写入tmpsrv.txt文件中。
echo Save Service Start State In %FILENAME%
//FILENAME是变量,即指的是srv_2008_04_13_星期日_17_25.bat这样的刚才建立的批处理文件。
rem save service start state into batch file
rem

//第二段:写备份文件的开头,就是双击备份文件时,有个界面良好的回显提示。
echo @echo Restore The Service Start State Saved At %TIME% %DATE% >"%FILENAME%"
//第一段运行过Date /T和TIME /T命令,故生成TIME和DATE两个临时变量可用,回显出时间日期。>"%FILENAME%" 为写入备份文件,从开始位置写起。
echo @pause >>"%FILENAME%"
//pause为暂停批处理程序,并显示以下消息:  请按任意键继续. . .
给用户一个考虑时间。@则为不显示出该命令。>>"%FILENAME%"为写入备份文件,接着上次后面写。

//第三段:写备份文件的主体内容,并加pause的停顿,符合用户习惯。
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%"
//for语句嵌套,外层功能是读出tmpsrv.txt索引出来的服务名,内层功能是按格式将服务备份内容写入文件。
这么写其实是将sc的内容提出备份项(服务名和对应启动设置状态两项),按格式写入备份文件中;分两个临时文件存放,有助于使用for等基于集合的脚本命令,便于分析理清思路。
外层语句:参考for的用法,写文件故用/f。
内层语句:参考for的用法,写文件故用/f。
(仍以xmlprov服务项为例)在本机中输入sc qc xmlprov|findstr  START_TYPE得到以下结果:
START_TYPE         : 3   DEMAND_START
这也就是sc qc %%j |findstr  START_TYPE部分的输出结果,写在tmpstype.txt文件里( >tmpstype.txt)。可以看出要备份项DEMAND_START在第四个,故有for /f "tokens=4 delims=:_ " %%s in ( tmpstype.txt)。备份命令的需要,写备份文件命令格式为:sc config   xmlprov start= DEMAND ,故相关语句:@echo sc config  %%j start= %%s >>"%FILENAME%")。
//关于这后面部分tokens=4的说明。试试运行下面命令:
sc qc xmlprov|findstr  START_TYPE>tmpstype.txt
for /f "tokens=2 delims=:_ " %s in ( tmpstype.txt) do @ echo %s
即读START_TYPE         : 3   DEMAND_START结果的第二个,是TYPE,说明这里从1到4分别是:START、TYPE、3、DEMAND。取的DEMAND(而不是DEMAND_START)才是我们需要的结果。
//注:参考for的用法,在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable而不要用 %variable。我测试使用时不在批处理下,不受影响。用 %variable批处理时提示:此时不应有 s。for /f "tokens=2 delims=:_ " s


//第四段:扫尾工作,清除临时文件,不留垃圾。
del tmpsrv.txt
del tmpstype.txt
编辑发布在www.goutuizi.com,更多请参考以上网站.

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright © www.goutuizi.com 网络技术疯人院. Some Rights Reserved.