Board logo

标题: [已完成]批量更新系统update补丁的批处理 [打印本页]

作者: yardian     时间: 2006-12-27 01:20    标题: [已完成]批量更新系统update补丁的批处理


@echo off
setlocal
echo.>list.txt
echo.>list.bat
for /f "tokens=2 delims=: " %%i in ('systeminfo ^|findstr /c:"KB"')do echo.%%i>>list.txt
if not exist qchain.exe (start http://php.tech.sina.com.cn/download/d_load.php?d_id=34472^&down_id=135329
                        echo 下载完成后解压出qchain.exe,和本程序放在同一目录下!)
for /f "delims= " %%i in ('dir /b *-chs.exe') do (for /f "delims= " %%j in (list.txt) do (findstr /i "%%j" %%i>nul && echo.||echo.%%i /z /q>>list.bat))


echo qchain >> list.bat
pause
我的目的是想首先检查系统已经打了哪些补丁,然后在生成批处理时不要将这些加进去。但是没有达到预期目的。



实现了批量安装以及避免重复安装的问题。目前已知问题:1搜索已安装补丁时的信息没能去掉;2对于使用msi安装的补丁,没有解决。完成代码如下:
1完全是自己写的。缺点就是如果有相同内容会显示很多空行,2是参考lxmxn写的。
@echo off
cd.>list.txt
cd.>list.bat
for /f "tokens=2 delims=: " %%i in ('systeminfo ^|findstr /c:"KB"')do echo 系统已经安装的补丁有:%%i&echo.%%i>>list.txt
if not exist qchain.exe (echo 缺少文件,程序将自动下载。下载完成后解压出qchain.exe,和本程序放在同一目录下!
                        start http://php.tech.sina.com.cn/download/d_load.php?d_id=34472^&down_id=135329)
for /f "tokens=1,2* delims=- " %%i in ('dir /b windows*-chs.exe') do (findstr /i "%%j" list.txt>nul &&echo.||echo %%i-%%j-%%k /z /q>>list.bat)
echo qchain >> list.bat
cls
echo 正在安装补丁,请稍候!!!!!
list
del /q list.bat
echo 恭喜,安装完成! 系统将自动退出!
ping -n 2 127.1 >nul&exit

@echo off
setlocal
cd.>list.txt
cd.>list.bat
for /f "tokens=2 delims=: " %%i in ('systeminfo ^|findstr /c:"KB"')do echo 系统已经安装的补丁有:%%i&echo.%%i>>list.txt
if not exist qchain.exe (echo 缺少文件,程序将自动下载。下载完成后解压出qchain.exe,和本程序放在同一目录下!
                        start http://php.tech.sina.com.cn/download/d_load.php?d_id=34472^&down_id=135329)
dir /b windows*-chs.exe | findstr /v /g:list.txt >new.bat
for /f %%i in (new.bat) do echo %%i /z /q >>list.bat
del /q new.bat
echo qchain >> list.bat
cls
echo 正在安装补丁,请稍候!!!!!
list
del /q list.bat
echo 恭喜,安装完成! 系统将自动退出!
ping -n 2 127.1 >nul&exit
[ Last edited by yardian on 2006-12-27 at 05:29 AM ]
作者: yardian     时间: 2006-12-27 03:04
可能我上在的表达不够清楚,竟然没人帮忙。我再重新说一下:
有这样两个文件:
list.txt
KB867460
KB837272
KB889101
KB911927
KB917344
KB918439
KB920213
KB923414
KB925454

list.bat
WindowsServer2003-KB889101-SP1-x86-CHS.exe /z /q
WindowsServer2003-KB925454-x86-CHS.exe /z /q
WindowsServer2003-KB911927-x86-CHS.exe /z /q
WindowsServer2003-KB917344-x86-CHS.exe /z /q
WindowsServer2003-KB918439-x86-CHS.exe /z /q
WindowsServer2003-KB920213-x86-CHS.exe /z /q
WindowsServer2003-KB923414-x86-CHS.exe /z /q
msxml4-KB927978-chs.exe /z /q
WindowsServer2003-KB923694-x86-CHS.exe /z /q
WindowsServer2003-KB917537-x86-CHS.exe /z /q
WindowsServer2003-KB923980-x86-CHS.exe /z /q
WindowsServer2003-KB917953-x86-CHS.exe /z /q
WindowsServer2003-KB923191-x86-CHS.exe /z /q
WindowsServer2003-KB917422-x86-CHS.exe /z /q
WindowsServer2003-KB899591-x86-CHS.exe /z /q
WindowsServer2003-KB924191-x86-CHS.exe /z /q
WindowsServer2003-KB900725-x86-CHS.exe /z /q
WindowsServer2003-KB914389-x86-CHS.exe /z /q
WindowsServer2003-KB908981-x86-CHS.exe /z /q
WindowsServer2003-KB912919-x86-CHS.exe /z /q
WindowsServer2003-KB920670-x86-CHS.exe /z /q
WindowsServer2003-KB899589-x86-CHS.exe /z /q
WindowsServer2003-KB914388-x86-CHS.exe /z /q
WindowsServer2003-KB921883-v2-x86-CHS.exe /z /q
WindowsServer2003-KB920685-x86-CHS.exe /z /q
WindowsServer2003-KB901190-x86-CHS.exe /z /q
WindowsServer2003-KB912818-v3-x86-CHS.exe /z /q
WindowsServer2003-KB899588-x86-CHS.exe /z /q
WindowsServer2003-KB922582-x86-CHS.exe /z /q
WindowsServer2003-KB901214-x86-CHS.exe /z /q
WindowsServer2003-KB893756-x86-CHS.exe /z /q
WindowsServer2003-KB925486-x86-CHS.exe /z /q
WindowsServer2003-KB908531-v2-x86-CHS.exe /z /q
WindowsServer2003-KB899587-x86-CHS.exe /z /q
WindowsServer2003-KB923689-x86-CHS.exe /z /q
WindowsServer2003-KB896428-x86-chs.exe /z /q
WindowsServer2003-KB898715-x86-chs.exe /z /q
WindowsServer2003-KB922616-x86-CHS.exe /z /q
WindowsMedia-KB911564-x86-CHS.exe /z /q
WindowsServer2003-KB926247-x86-CHS.exe /z /q
WindowsServer2003-KB922819-x86-CHS.exe /z /q
WindowsServer2003-KB904706-v2-x86-CHS.exe /z /q
WindowsServer2003-KB929120-x86-CHS.exe /z /q
WindowsServer2003-KB920683-x86-CHS.exe /z /q
WindowsServer2003-KB921398-x86-CHS.exe /z /q
WindowsServer2003-KB911280-v2-x86-CHS.exe /z /q
WindowsServer2003-KB928388-x86-CHS.exe /z /q
WindowsServer2003-KB908519-x86-CHS.exe /z /q
WindowsServer2003-KB896358-x86-chs.exe /z /q
WindowsServer2003-KB911562-x86-CHS.exe /z /q
WindowsServer2003-KB905414-x86-CHS.exe /z /q
WindowsServer2003-KB910437-x86-CHS.exe /z /q
WindowsServer2003-KB917734-x86-CHS.exe /z /q
WindowsServer2003-KB901017-x86-CHS.exe /z /q
WindowsServer2003-KB896424-x86-CHS.exe /z /q
Windows-KB909520-v1.000-x86-CHS.exe /z /q
现在如何实现如果list.bat包含list.txt中的字符串,则将该行删除。
作者: yardian     时间: 2006-12-27 03:23
晕,不是吧。还没人能明白我的意思?
作者: lxmxn     时间: 2006-12-27 03:54

findstr /v /g:list.txt list.bat >new_list.bat

作者: yardian     时间: 2006-12-27 04:02
呵呵,到底是高手。不一样啊。我想了半天才想出来一种方法。
for /f "tokens=1,2* delims=- " %%i in (list.bat) do (findstr /i "%%j" list.txt>nul &&echo.||echo %%i-%%j-%%k>>list1.bat)
作者: kafen     时间: 2006-12-27 09:34
这个不错,可楼主,我还是看不明白,你主题上的已完成是什么意思?你所说的问题都解决了吗?
还有下载的qchain.exe是win2K_sp1?

[ Last edited by kafen on 2006-12-27 at 09:37 AM ]
作者: ronin     时间: 2007-1-9 02:29
这个是用list.txt来确认是否安装过的补丁吗,这样那个不好,要检测系统是否安装好了补丁才行,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix里面有纪录,应该是将这个已经安装的列表出来对比才行
作者: dikex     时间: 2007-1-9 02:41


  Quote:
@echo off
del list.log /q
cls
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 正在检测已经的安装补丁
cls
for /f "eol=o eol=O " %%j in (list.log) do echo 正在安装补丁%%j  && %%j /passive /norestart
cls
echo 安装了的补丁列表(list.log):& type list.log | more
pause

我前段时间写的,看看吧
不过有些补丁是特殊的,如msxml4-KB927978-chs.exe是不会在HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix里面记录的,而flash的那个补丁使用的安装包的形式不同,需要使用其他的参数,懒得写,弄个IF来判断就可以了

[ Last edited by dikex on 2007-1-8 at 01:51 PM ]
作者: vkill     时间: 2007-1-9 02:42
qchain.exe

这个文件是???
作者: ronin     时间: 2007-1-12 02:09
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\MSXML4SP2\Q927978
msxml4-KB927978-chs.exe在这里有记录
作者: lxmxn     时间: 2007-1-12 02:26

  systeminfo里面貌似也有一点系统补丁的信息。

作者: dikex     时间: 2007-1-12 02:42


  Quote:
Originally posted by ronin at 2007-1-11 01:09 PM:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\MSXML4SP2\Q927978
msxml4-KB927978-chs.exe在这里有记录

呵呵,查找是输入了KB927978,所以找不到了

另外也比较齐全的是在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates里面,所有的都看到了,不过比较分散,可以先导出再使用find来查找对照,但由于项目太多而比较慢,而使用下面这个可以导出范围比较小的列表
for /f "delims=" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates" /s ^| findstr /i "kb......$ q......$"') do echo %%i >>list.log