为网友分析的一段DOS命令脚本,分享下
::批量无人安装系统补丁的批处理完整脚本原内容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文件放到补丁的目录下,双击即可运行并批量安装补丁,而且可以跳过已经安装了的补丁
[b][color=red]下面是我对关键的两段语句做的详细解释:
[/color][/b]
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安装补丁的参数,你应该比我熟悉。
[b][color=red]结束[/color][/b] 强 :lol 强 我努力学习 看来我还有好多路要走```` 我来刷威望了
顺便来逛逛 佩服,我才刚刚开始学呢,以后还请多出好帖啊^ ^ 好久没有看到这么好的帖子了.. [font=黑体][size=2][color=#000000]正在学习中,,,谢谢!![/color][/size][/font] thanks for lz doc :loveliness:
页:
[1]