11 12
发新话题
打印

[原创] 为网友分析的一段DOS命令脚本,分享下

为网友分析的一段DOS命令脚本,分享下

本文网址:http://bbs.bitscn.com/107986 复制

::批量无人安装系统补丁的批处理完整脚本原内容
echo off
::关闭显示信息

del list.log /q
::删除上次运行后留下的文件

echo 正在检测已经的安装补丁

for /f "delims=- tokens=2" %%i in ('dir *-kb*.exe /b /on') do REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix\%%i" >nul || dir /b *%%i*.exe >>list.log && cls && echo 正在检测已经的安装补丁
::从文件中取出一个补丁的名字,截取中间的补丁标号(如KB873339),到注册表查询这个是否已经安装了,没有就将其存放到list.log文件里

cls
::清屏

for /f "eol=o eol=O " %%j in (list.log) do echo 正在安装补丁%%j  && %%j /quiet /norestart
::从list.log文件中取出一个补丁的名字,利用参数(/quiet /norestart)进行安装无人安装

cls

echo 安装了的补丁(list.log):& type list.log | more
::显示安装了的补丁的列表,more是用来防止补丁过多,分屏显示用的

pause
::暂停让别人看列表

del list1.log /q
::删除使用过的list1.log文件

将上面引用的内容复制到记事本里面,然后按另存为,文件类型选择所有文件,文件名为setup.cmd(使用cmd而不用bat是因为cmd对中文名以及长文件名的支持好,况且应该没有人用98而去打补丁吧);
最后将setup.cmd文件放到补丁的目录下,双击即可运行并批量安装补丁,而且可以跳过已经安装了的补丁


下面是我对关键的两段语句做的详细解释:

for /f "delims=- tokens=2" %%i in ('dir *-kb*.exe /b /on') do REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix\%%i" >nul || dir /b *%%i*.exe >>list.log && cls && echo 正在检测已经的安装补丁

这段命令实在太长

但执行时是按照顺序执行的。
for的用法,参考for /?

('dir *-kb*.exe /b /on') 这段是dir命令的用法,dir命令的用法参考 dir /?
for /f "delims=- tokens=2" %%i in这段是for的用法,其中/f是分析要读取对象的每一行, delims=-表示碰到“-”标记,就表示一行读取结束,“-”符号的作用是把一行用-分成许多段形成列,tokens=2表示跳到delims标记出来的第二个位置开始读取,一直到碰到下一个delims标记结束,在这里就是符号“-”, %%i是变量,在bat脚本中使用时,必须用两个%符号,in表示变量i的值是从('dir *-kb*.exe /b /on') 的输出结果中获得。

上面一段代码最终目的是获取脚本当前目录的补丁文件名的kb段名(如KB873339,因为MS的补丁文件名都是带有KB字段的,当然也有不是KB的,所以这个脚本还有带完善,但能满足大部分的补丁), do 是for的 下一条命令的 中间命令(这就是for命令的格式),没有实际意义,但必须保留。当然do的后面就是下一条被执行的命令。

REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix\%%i" >nul
这段代码中的reg是对注册表操作的一个命令,query是reg的子命令,表示查询操作,(详细参考reg /?),查询注册表的位置是 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix\%%i,就是这个地方,其中%%i就是前面获取到的kb段,在这里也派上用场了。并且把结果输入到 >nul设备中。
注释:nul是一个设备,表示的是空设备,因为默认时的输出是控制台既电脑的显示器,现在把他输出到nul设备中,意图是不要在显示器中输出reg的查询结果。当然也可以输出到printer设备中。

|| 命令是表示前面的命令执行成功了,就不执行后面的命令了,
为什么需要这个命令了,因为,如果reg query 命令是成功执行的话,就表示该补丁已经打过了就不需要在打了,那么后面打补丁的命令也就不需要在执行了。

dir /b *%%i*.exe >>list.log是把该次执行的打补丁文件名输出到list.log文件中,以便形成需要打的补丁列表,提供给后面一些命令读取。 &&表示前面的命令如果执行出错了,就不执行后面的命令了。
这段的主要目的是提取补丁文件存放目录中的补丁文件名,并且以kb命令格式表示出来,并输出到list.log文件中

这一段解释就这么多。

在来看下面一段

for /f "eol=o eol=O " %%j in (list.log) do echo 正在安装补丁%%j  && %%j /quiet /norestart

for /f "eol=o eol=O 参考for /? 帮助,表示注释的结束。偶在写类似脚本时,还没有使用到eol参数。

%%j in (list.log)是指变量j的值从list.log里获取,然后执行do后面的命令

%%j /quiet /norestart安装补丁的参数,你应该比我熟悉。

结束

不要笑我老土,土,也是一种时尚。
精品软件下载www.ylware.cn

TOP


TOP

强 我努力学习

TOP

看来我还有好多路要走````

TOP

我来刷威望了
顺便来逛逛

TOP

佩服,我才刚刚开始学呢,以后还请多出好帖啊^ ^

TOP

好久没有看到这么好的帖子了..

我讨厌计算机病毒,但是不可否认它们在一定程度上的确推动了计算机事业的发展。

TOP

正在学习中,,,谢谢!!

TOP

thanks for lz doc

TOP


TOP

 11 12
发新话题
版块跳转 
沪ICP备08026629号 / 管理员木木 / QQ58284700 / MSNjacro|at|bitscn.net / TEL13641763379 /