标题: [文件操作] 求助批处理自动批量打补丁的缺陷之处? [打印本页]
作者: rui155197583 时间: 2009-3-10 22:01 标题: 求助批处理自动批量打补丁的缺陷之处?
- @echo off
- setlocal enabledelayedexpansion
- set /a num=0
- for %%i in (D:\补丁\*.exe) do (%%i /passive /norestart /nobackup /quiet && set /a num+=1 && echo 已完成!num!个补丁程序 %%i。)
复制代码
这段代码就是自动安装d:\补丁\中的补丁程序,其中do中的三个语句实现的功能是:每当一个补丁程序完成之后,num加1,同时显示已完成了第几个补丁%%i。但有2个问题出现了,一个问题是/nobackup不是通用参数,对于某些补丁程序属于无效参数,所以尽管该补丁是可以正常运行的补丁,由于这个无效参数而不能运行,所以这里应该去掉该参数,我相信这个地方即使对于老鸟来说都是不容易察觉到的地方。另外一个问题,我目前仍不知如何解决,就是对于所有需要重启才能生效的补丁,执行了第一个语句“%%i /passive /norestart /nobackup /quiet ”之后,该补丁确实安装了,但是即使你加了/norestart 参数,批处理程序仍然认为这个语句没有完成,所以第一个&&之后的语句均不执行,这样就造成一个问题,后面显示的已完成补丁程序的数量跟实际完成的数量不一样,换句话说,假设成功运行了10个补丁,其中有5个补丁是需要重启才可以生效的补丁,那么最终的显示结果却是已完成了5个补丁。请问各位,这个缺陷如何弥补?谢谢!
作者: Batcher 时间: 2009-3-10 22:20 标题: 转帖(出处不详)
批量安装Windows补丁的方法已经有了,Google一下就可以了。
但目前的方法需要手工把补丁的文件名放到批处理中。
我改写了一下,只要把该脚本与补丁放到同一目录就可以了。
原理不说了,直接看代码吧。
最后的qchain用来调整文件版本,安装1个以上补丁而不重启时必须运行,确保最新的文件被安装。详情和下载的方法google一下吧。
补丁的下载方法也google一下吧,比如可以通过365安全卫士下载。
该脚本在WindowsXP下测试成功。
- @echo off
- setlocal
- set ATHTOFIXES=.
- rem Copyright:
- rem Zhaolei, 2007-4-16 (Please do not modify it, May God Bless You.)
- rem Manual:
- rem Put all windows updates and qchain and this batch into same directory, as following, and run this batch.
- rem WindowsXP-KB890046-x86-CHS.exe
- rem WindowsXP-KB899589-x86-CHS.exe
- rem WindowsXP-KB911567-x86-CHS.exe
- rem WindowsXP-KB918899-x86-CHS.exe
- rem WindowsXP-KB920214-x86-CHS.exe
- rem WindowsXP-KB921398-x86-CHS.exe
- rem WindowsXP-KB921883-x86-CHS.exe
- rem WindowsXP-KB922616-x86-CHS.exe
- rem WindowsXP-KB922760-x86-CHS.exe
- rem WindowsXP-KB925454-x86-CHS.exe
- rem WindowsXP-KB925486-x86-CHS.exe
- rem qchain.exe
- rem SETUP_HOTFIX.BAT
- rem For developer:
- rem Do not use "start" command, because it will cause several hotfix installed at same time,
- rem and only one hotfix successed(other hotfix will error and exit)
- rem We use /passive mode instead of /quiet mode to make user see install progress.
- rem We use /nobackup to save disk space.(Uninstall impossible)
- for /F %%F in ('DIR %ATHTOFIXES%\WindowsXP-KB??????-x86-CHS.exe /A-D /B /ON /W') do (
- echo Installing %%F
- %%F /passive /norestart /nobackup
- if ERRORLEVEL 1 (
- echo Failed
- ) else (
- echo Successed
- )
- )
- echo Executing qchain
- %ATHTOFIXES%\qchain.exe
- if ERRORLEVEL 1 (
- echo Failed
- ) else (
- echo Successed
- )
- echo Hotfix install complished
- pause
复制代码
作者: rui155197583 时间: 2009-3-10 23:29
上面的代码仍然没有解决这个问题,其中含有/nobackup参数,就是错的,因为很多补丁是不支持这个参数的,还没等运行就会检测到参数错而终止掉,而实际上如果手动安装这个补丁却是可以执行的。
作者: Batcher 时间: 2009-3-11 09:18 标题: 回复 3楼 的帖子
修改一下可以么?- @echo off
- setlocal
- set ATHTOFIXES=.
- rem Copyright:
- rem Zhaolei, 2007-4-16 (Please do not modify it, May God Bless You.)
- rem Manual:
- rem Put all windows updates and qchain and this batch into same directory, as following, and run this batch.
- rem WindowsXP-KB890046-x86-CHS.exe
- rem WindowsXP-KB899589-x86-CHS.exe
- rem WindowsXP-KB911567-x86-CHS.exe
- rem WindowsXP-KB918899-x86-CHS.exe
- rem WindowsXP-KB920214-x86-CHS.exe
- rem WindowsXP-KB921398-x86-CHS.exe
- rem WindowsXP-KB921883-x86-CHS.exe
- rem WindowsXP-KB922616-x86-CHS.exe
- rem WindowsXP-KB922760-x86-CHS.exe
- rem WindowsXP-KB925454-x86-CHS.exe
- rem WindowsXP-KB925486-x86-CHS.exe
- rem qchain.exe
- rem SETUP_HOTFIX.BAT
- rem For developer:
- rem Do not use "start" command, because it will cause several hotfix installed at same time,
- rem and only one hotfix successed(other hotfix will error and exit)
- rem We use /passive mode instead of /quiet mode to make user see install progress.
- rem We use /nobackup to save disk space.(Uninstall impossible)
- for /F %%F in ('DIR %ATHTOFIXES%\WindowsXP-KB??????-x86-CHS.exe /A-D /B /ON /W') do (
- echo Installing %%F
- %%F /passive /norestart /nobackup
- :::::::::::::::::::::::::::::::::::::
- ::Modified by Batcher 2009-03-11
- if %errorlevel% neq 0 (
- %%F /passive /norestart
- if errorlevel 1 (
- echo Failed
- ) else (
- echo Successed
- )
- )
- ::if ERRORLEVEL 1 (
- :: echo Failed
- ::) else (
- :: echo Successed
- ::)
- :::::::::::::::::::::::::::::::::::::
- )
- echo Executing qchain
- %ATHTOFIXES%\qchain.exe
- if ERRORLEVEL 1 (
- echo Failed
- ) else (
- echo Successed
- )
- echo Hotfix install complished
- pause
复制代码
作者: rui155197583 时间: 2009-3-11 09:25
修改之后确实可以了,但仍然无法准确的报告那些需要重启才可以生效的补丁。
作者: Batcher 时间: 2009-3-11 09:43 标题: 回复 5楼 的帖子
这样呢?- @echo off
- setlocal
- set ATHTOFIXES=.
- rem Copyright:
- rem Zhaolei, 2007-4-16 (Please do not modify it, May God Bless You.)
- rem Manual:
- rem Put all windows updates and qchain and this batch into same directory, as following, and run this batch.
- rem WindowsXP-KB890046-x86-CHS.exe
- rem WindowsXP-KB899589-x86-CHS.exe
- rem WindowsXP-KB911567-x86-CHS.exe
- rem WindowsXP-KB918899-x86-CHS.exe
- rem WindowsXP-KB920214-x86-CHS.exe
- rem WindowsXP-KB921398-x86-CHS.exe
- rem WindowsXP-KB921883-x86-CHS.exe
- rem WindowsXP-KB922616-x86-CHS.exe
- rem WindowsXP-KB922760-x86-CHS.exe
- rem WindowsXP-KB925454-x86-CHS.exe
- rem WindowsXP-KB925486-x86-CHS.exe
- rem qchain.exe
- rem SETUP_HOTFIX.BAT
- rem For developer:
- rem Do not use "start" command, because it will cause several hotfix installed at same time,
- rem and only one hotfix successed(other hotfix will error and exit)
- rem We use /passive mode instead of /quiet mode to make user see install progress.
- rem We use /nobackup to save disk space.(Uninstall impossible)
- for /F %%F in ('DIR %ATHTOFIXES%\WindowsXP-KB??????-x86-CHS.exe /A-D /B /ON /W') do (
- echo Installing %%F
- %%F /passive /norestart /nobackup
- :::::::::::::::::::::::::::::::::::::
- ::Modified by Batcher 2009-03-11
- if %errorlevel% neq 0 (
- %%F /passive /norestart
- if errorlevel 1 (
- echo 补丁%%F需要重启才能生效
- ) else (
- echo Successed
- )
- )
- ::if ERRORLEVEL 1 (
- :: echo Failed
- ::) else (
- :: echo Successed
- ::)
- :::::::::::::::::::::::::::::::::::::
- )
- echo Executing qchain
- %ATHTOFIXES%\qchain.exe
- if ERRORLEVEL 1 (
- echo Failed
- ) else (
- echo Successed
- )
- echo Hotfix install complished
- pause
复制代码
作者: rui155197583 时间: 2009-3-11 10:45
不适合根本无法安装的补丁。也就是说如果补丁无法安装的话,程序仍然报告重启后生效。
另外还想问以下版主,使用reg query命令查询注册表是否含有某补丁程序的名字的时候,如果查不到的话,会报找不到指定文件的错误。我不想让它报这个错,应该怎么写,后面加了>nul也没用,如果能想办法只取它的返回值作为下一步的判断条件也行。关键是怎么才能让它不显示那个错误。
作者: Batcher 时间: 2009-3-11 10:59 标题: 回复 7楼 的帖子
%%F /passive /norestart
你可以分别测试一下无法安装的补丁和需要重启的补丁在执行这句代码之后,errorlevel的值具体是多少,然后再区分即可。
>nul和2>nul的用法,请参考:批处理中的重定向符号以及句柄的使用方法和讲解
http://bbs.bathome.net/thread-3296-1-1.html
作者: rui155197583 时间: 2009-3-11 11:08
巡查高见!果然解决了!谢谢!!
作者: q115643492 时间: 2009-3-14 15:12
原帖由 rui155197583 于 2009-3-11 11:08 发表
巡查高见!果然解决了!谢谢!!
把你最终的代码分享下吧! 还需要把补丁名字复制到代码中去吗?
作者: zqz0012005 时间: 2009-3-14 16:54 标题: 回复 6楼 的帖子
for /F ... do (
...
if %errorlevel% neq 0 (
Batcher 也不小心犯了这个经典错误,呵呵。
在复合语句里面%errorlevel%应该换成!errorlevel!,一说大家就知道是什么原因了。
作者: Seter 时间: 2009-8-24 13:23
原帖由 zqz0012005 于 2009-3-14 16:54 发表
Batcher 也不小心犯了这个经典错误,呵呵。
在复合语句里面%errorlevel%应该换成!errorlevel!,一说大家就知道是什么原因了。
啊?errorlevel不自动更新的?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |