[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 如何修改下安装补丁的批处理?

  1. @echo off
  2. color 2f
  3. mode con: cols=36 lines=8
  4. ECHO 自动安装截止3月份补丁
  5. FOR %%i IN (office\*.exe) DO cls& ECHO 正在安装 %%i 补丁,请稍候 &start /wait %%i /q
  6. REM By Leo
  7. SET TITLE=Windows 补丁安装脚本 V0.070408
  8. TITLE %TITLE%
  9. SETLOCAL ENABLEDELAYEDEXPANSION
  10. SET PATCHFLAG=KB
  11. SET CAT=%PATCHFLAG%*.cat
  12. SET PATCHLIST="%temp%\patcheslist.tmp"
  13. SET INSTALLED=√ 已安装
  14. SET NOTINSTALLED=× 未安装
  15. SET DELIMS=-----------------------------------------
  16. SET PATCH_TOTAL=0
  17. SET PATCH_NOTINSTALLED=0
  18. SET FLAG_INSTALLED=1*
  19. SET FLAG_NOTINSTALLED=0*
  20. :main
  21. TITLE 正在搜索... -- %TITLE%
  22. ECHO 正在搜索当前目录"%cd%"及其子目录下的补丁...
  23. ECHO 如果想在搜索完成后立即安装未安装的补丁,请按回车。
  24. ECHO.
  25. REM 搜索补丁,没有搜索到则退出,否则继续。
  26. CALL :pfind || (call :error 1& goto :eof)
  27. ECHO.
  28. :confirm
  29. TITLE 请选择要安装的补丁 -- %TITLE%
  30. ECHO 搜索到如上%PATCH_TOTAL%个补丁,其中%PATCH_NOTINSTALLED%个未安装。安装全部请输入ALL,否则请直接按回车安装尚未安装的补丁。
  31. SET confirm=
  32. SET /p confirm=
  33. IF /i "%confirm%" == "ALL" (SET confirm=
  34. ) ELSE IF not defined confirm (SET confirm=%FLAG_INSTALLED:~0,1%
  35. ) ELSE GOTO confirm
  36. ECHO %DELIMS%
  37. ECHO.
  38. ECHO 正在安装,请稍候。安装程序不会抢占窗口焦点,所以你可以干点别的:)
  39. ECHO.
  40. CALL :setup %confirm%
  41. del %PATCHLIST% 2>nul >nul
  42. TITLE 安装已结束 -- %TITLE%
  43. ECHO %DELIMS%
  44. ECHO.
  45. ECHO 安装已结束。要使补丁生效,你可能需要手动重新启动计算机。
  46. ECHO 按任意键退出。
  47. SET TITLE=
  48. ENDLOCAL
  49. PAUSE >nul
  50. TITLE %ComSpec%
  51. goto :eof
  52. REM 安装补丁
  53. :setup
  54. if "%1" == "" (set patchsum=%PATCH_TOTAL%) ELSE set patchsum=%PATCH_NOTINSTALLED%
  55. set patch_counter=0
  56. FOR /f "eol=%1 usebackq tokens=2,*" %%i in (%PATCHLIST%) DO (
  57. set /a patch_counter+=1
  58. TITLE !patch_counter!/%patchsum%-%%i -- %TITLE%
  59. set nobackup=nobackup
  60. echo %%i | find /i "%PATCHFLAG%8" 2>nul >nul && set nobackup=n
  61. %%j /quiet /passive /norestart /!nobackup! 2>nul >nul
  62. ECHO !patch_counter!/%patchsum% %%i √)
  63. goto :eof
  64. REM 搜索当前目录下的补丁,返回非零值为失败。
  65. :pfind
  66. SET REG=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  67. SET listinreg="%temp%\listinreg.tmp"
  68. reg query %reg%>%listinreg%
  69. del %PATCHLIST% 2>nul >nul
  70. REM 补丁是一个压缩包
  71. FOR /r %%i in (*%PATCHFLAG%*.exe) DO CALL :pfind.sub "%%~ni" "%%~fi" "%%~sfi"
  72. REM 补丁在压缩包展开后的目录内
  73. FOR /r %%i in (%cat%) DO IF exist %%~dpiupdate.exe FOR /f %%j in ("%%~dpiupdate.exe") DO CALL :pfind.sub "%%~ni" "%%~fj" "%%~sfj"
  74. IF not exist %PATCHLIST% EXIT /b 1
  75. sort %PATCHLIST% /o %PATCHLIST%
  76. rem 得到补丁个数
  77. FOR /f "tokens=3 delims= " %%i in ('find /c /i "%FLAG_NOTINSTALLED%" %PATCHLIST%') DO SET PATCH_NOTINSTALLED=%%i
  78. FOR /f "tokens=3 delims= " %%i in ('find /c /i "%FLAG_INSTALLED%" %PATCHLIST%') DO SET /a PATCH_TOTAL=%%i + %PATCH_NOTINSTALLED%
  79. del %listinreg% 2>nul >nul
  80. IF not defined patch_total EXIT /b 2
  81. IF %patch_total% LSS 1 EXIT /b 3
  82. EXIT /b 0
  83. goto :eof
  84. REM 看看补丁安装了没,然后写到标准输出和%PATCHLIST%内
  85. :pfind.sub
  86. IF "%~3" == "" GOTO :eof
  87. CALL :getkbnum %1
  88. SET id=!errorlevel!
  89. IF not "!id!" == "-1" (
  90. find /i "!id!" %listinreg% 2>nul >nul && (
  91. set status=%FLAG_INSTALLED%& set isinstalled=%INSTALLED%
  92. )||(set status=%FLAG_NOTINSTALLED%& set isinstalled=%NOTINSTALLED%)
  93. ECHO !status! %PATCHFLAG%!id! %2>>%PATCHLIST%
  94. ECHO !isinstalled! %PATCHFLAG%!id! %3
  95. )
  96. goto :eof
  97. REM 返回给定字串中的KB号,返回-1表示失败。
  98. :getkbnum
  99. SETLOCAL ENABLEDELAYEDEXPANSION
  100. SET str=%~1
  101. IF not defined str EXIT /b -1
  102. IF not defined PATCHFLAG SET PATCHFLAG=KB
  103. echo %PATCHFLAG%>getsize.tmp
  104. for %%i in (getsize.tmp) do SET /a offset=%%~zi-2
  105. del getsize.tmp 2>nul >nul
  106. SET start=0
  107. REM 仅有%PATCHFLAG%则返回-1
  108. IF /i "%str%" == "%PATCHFLAG%" EXIT /b -1
  109. REM 删除%PATCHFLAG%前的字符,删除失败则返回-1
  110. :getkbnum.findkb
  111. IF "%~1" == "!str!" (IF "!str:~%start%,%offset%!" == "" (EXIT /b -1
  112. ) ELSE IF /i "!str:~%start%,%offset%!" == "%PATCHFLAG%" (SET str=!str:~%start%!
  113. ) ELSE (SET /a start+=1 & goto getkbnum.findkb))
  114. REM 仅有%PATCHFLAG%则返回-1
  115. SET str=!str:~%offset%!
  116. IF "%str%" == "" EXIT /b -1
  117. SET start=0
  118. REM 保证%PATCHFLAG%后的第一个字符不是数字时,仍能返回-1
  119. IF "!str:~%start%,1!" GTR "9" EXIT /b -1
  120. IF "!str:~%start%,1!" LSS "0" EXIT /b -1
  121. REM 返回%PATCHFLAG%后的数字
  122. :getkbnum.findnum
  123. IF "!str:~%start%,1!" GTR "9" EXIT /b !str:~0,%start%!
  124. IF "!str:~%start%,1!" LSS "0" EXIT /b !str:~0,%start%!
  125. SET /a start+=1
  126. goto getkbnum.findnum
  127. ENDLOCAL
  128. EXIT /b -1
  129. :error
  130. TITLE ERROR -- %TITLE%
  131. IF "%1" == "1" (ECHO 没有找到补丁。使用的搜索规则是:CAT:%cat%,PATCHFLAG:%PATCHFLAG%。程序已结束。)
  132. SET TITLE=
  133. PAUSE >nul
  134. TITLE %ComSpec%
  135. goto :eof
复制代码



主要是能改成自动判断系统和OFFICE的补丁,有没有安装,如没有安装分别用参数自动安装,请高手们支招,谢谢

[ 本帖最后由 lzl88123 于 2011-3-17 10:12 编辑 ]

举个示例,楼主可以作为参考:
1,返回注册表等下所有补丁的编号,例如KB976578,并将其定义为变量
2,递归指定目录中所有安装文件如 .exe (最好文件名有规律,例如 WindowsXP-KB976578-SP3-x86-CHS),以-分隔,如果第二区段为存在的变量,则不安装,否则安装
WindowsXP-KB976578-SP3-x86-CHS
组件名-编号-版本-处理器结构-语言

[ 本帖最后由 hanyeguxing 于 2011-3-16 13:50 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

  1. @echo off&setlocal EnableDelayedExpansion
  2. ::定义非系统补丁类,例如 Microsoft Office
  3. for /f "delims=" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"') do (
  4.         set t=
  5.         reg query "%%a\InstallProperties" /v DisplayName 2>nul |find /i "Microsoft Office">nul 2>nul&&set t==
  6.         if defined t for /f "tokens=1,2*" %%b in ('reg query "%%a" /s') do if /i "%%b"=="DisplayName" for /f "tokens=1,2 delims=()" %%e in ("%%d") do (
  7.                 set f=%%f
  8.                 if /i "!f:~0,2!"=="KB" set %%f==
  9. ))
  10. ::定义系统补丁类
  11. for /f "delims=" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix"') do (
  12.         set a=%%a
  13.         if /i "!a:~71,2!"=="KB" set !a:~71!==
  14. )
  15. set KB&echo;请确认系统以及office安装过的补丁全部显示&pause>nul
  16. ::文件递归以判断
  17. cd/d "d:\补丁库"
  18. for /f "tokens=1,2* delims=-" %%a in ('dir /b/a-d *.exe') do if not defined %%b (
  19.         echo;正在安装 %%a-%%b-%%c
  20.         "%%a-%%b-%%c" 通用参数
  21. )
  22. echo;安装已完成&pause
复制代码
1,补丁文件必须以 类-KB编号-其他名 的形式命名(不能有空格)
类,指office还是windowsxp等
KB编号,指安装后的KB编号,例如:xp系统补丁编号为update\update.inf中[Strings]节SP_SHORT_TITLE的值(但不能使用-符号)
例如:
WindowsXP-KB2079403-SP3-x86-CHS
WindowsXP-KB936929-SP3-x86-CHS
WindowsXP-KB978695_WM9-SP3-x86-CHS
WindowsXP-KB888111WXPSP2-SP3-x86-CHS
2,"%%a-%%b-%%c" 通用参数
“通用参数”修改为实际使用的参数
3,仅适用于xp系统,因为win7下系统补丁不在使用HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix
4,cd/d "d:\补丁库",这里的"d:\补丁库"为补丁所在路径,如果为当前目录可省略本行代码

[ 本帖最后由 hanyeguxing 于 2011-3-18 20:30 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

谢谢版主了,我先试下看看,
试了,提示环境变量KB没定义
是乍回事

[ 本帖最后由 lzl88123 于 2011-3-18 18:47 编辑 ]

TOP

  1. @echo off&setlocal EnableDelayedExpansion
  2. ::定义非系统补丁类,例如 Microsoft Office
  3. for /f "delims=" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"') do (
  4.         set t=
  5.         reg query "%%a\InstallProperties" /v DisplayName 2>nul |find /i "Microsoft Office">nul 2>nul&&set t==
  6.         if defined t for /f "tokens=1,2*" %%b in ('reg query "%%a" /s') do if /i "%%b"=="DisplayName" for /f "tokens=1,2 delims=()" %%e in ("%%d") do (
  7.                 set f=%%f
  8.                 if /i "!f:~0,2!"=="KB" set %%f==
  9. ))
  10. ::定义系统补丁类
  11. for /f "delims=" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix"') do (
  12.         set a=%%a
  13.         if /i "!a:~71,2!"=="KB" set !a:~71!==
  14. )
  15. set KB&echo;请确认系统以及office安装过的补丁全部显示&pause>nul
  16. ::文件递归以判断
  17. cd/d "d:\补丁库"
  18. for /f "tokens=1,2* delims=-" %%a in ('dir /b/a-d *.exe') do if not defined %%b (
  19.         echo;正在安装 %%a 的 %%a-%%b-%%c
  20.         if /i "%%a"=="windowsxp" (%%a-%%b-%%c /wait /quiet /passive /norestart /nobackup) else %%a-%%b-%%c /q
  21. )
  22. echo;安装已完成&pause
复制代码
说明:系统补丁文件名必须以 windowsxp- 开头
其他注意事项同3楼

[ 本帖最后由 hanyeguxing 于 2011-3-18 21:02 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

@echo off&setlocal EnableDelayedExpansion
::定义非系统补丁类,例如 Microsoft Office
for /f "delims=" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Pr ...
hanyeguxing 发表于 2011-3-18 19:31



运行一次后,再运行,他还是要安装,不明白

TOP

返回列表