中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]批处理安装系统补丁 写不下去了 谁帮帮我
作者:
标题: [求助]批处理安装系统补丁 写不下去了 谁帮帮我 上一主题 | 下一主题
qq275757820
新手上路





积分 5
发帖 3
注册 2009-6-30
状态 离线
『楼 主』:  [求助]批处理安装系统补丁 写不下去了 谁帮帮我

这个是我想要的样子
已安装补丁名称如下                   安装进度24/60
kB**** kb**** kb**** kb**** kb**** kb****      
kB**** kb**** kb**** kb**** kb**** kb****
kB**** kb**** kb**** kb**** kb**** kb****
kB**** kb**** kb**** kb**** kb**** kb****  


这个是目前我程序运行起来的样子
已安装补丁名称如下                   安装进度24/60
kB****



下面是我写的不完整代码  希望被补全
@echo off
title 系统补丁包更新至**年**月**日
MODE con: COLS=50 LINES=22
color 0a
:start0
echo               ╭─────────────╮        
echo   ╭───┤     系统补丁安装程序          ├───╮
echo   │         ╰─────────────╯         │
echo   │       1.windows-XP-sp2中文版补丁包             │
echo   │       2.windows-XP-sp2英文版补丁包             │
echo   │       3.Internet Explorer 6 补丁包                 │
echo   │       4.Internet Explorer 7 补丁包                 │
echo   │       5.      退出本程序                                │
echo   │       6.退出本程序并重新启动计算机              │
echo   │                                                               │
echo   ╰─────────────────────╯
set /p list0=请输入选项:
if "%list0%"=="1" goto list0_1
if "%list0%"=="2" goto list0_2
if "%list0%"=="3" goto list0_3
if "%list0%"=="4" goto list0_4
if "%list0%"=="5" goto list0_5
if "%list0%"=="6" goto list0_6
goto start0

:list0_1
MODE con: COLS=50 LINES=22
echo 即将安装系统补丁,按任意键继续
pause >nul

dir /b xp-sp2-chs\* >0.txt

set sum=0
set n=1

set tmep=replace_bak.tmp
setlocal enabledelayedexpansion

for /f "tokens=1* delims=:" %%i in ('findstr /i /n .* 0.txt') do (
    set str=%%j
    if not "!str!"=="" set "str=!str:.bat=!"
    >>"%tmep%" echo.!str!
    set /a sum=sum+1>nul
)
move "%tmep%" 0.txt

for /f "tokens=1* delims=:" %%m in (0.txt) do (
start /wait .\xp-sp2-chs\%%m.bat

cls
echo    已安装下列补丁                进度: !n! /!sum!
echo  %%m

set /a n=n+1
)
del 0.txt
echo 按任意键返回主菜单
pause >nul & goto start0


:list0_2






:list0_3





:list0_4




:list0_5
exit
:list0_6
::shutdown -r -t now

2009-10-2 14:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
www0com0my
初级用户





积分 31
发帖 19
注册 2008-2-5
状态 离线
『第 2 楼』:  

之前有在网上找到2个安装补丁的批处理。

可能可以参考看看。
@echo off
title 无人职守安装系统补丁!
color 1f
cls
MODE con: COLS=60 LINES=25
echo.
echo        ###########################################
echo        #                                        #
echo        #           网管-丫美D                   #
echo        #                                        #
echo        #              www.yamed.cn              #
echo        #                                        #
echo        ###########################################
echo.
echo          确定该文件所在文件夹内含有你需要安装的补丁
echo                      按任意键开始安装!
pause >nul
cls
set tm1=%time:~0,2%
set tm2=%time:~3,2%
set tm3=%time:~6,2%
ECHO              %date% %tm1%点%tm2%分%tm3%秒
echo 补丁安装中......
echo.
for %%i in (*.exe) do (
echo 正在安装%%i ......
%%i /passive /norestart /nobackup
)
set tm1=%time:~0,2%
set tm2=%time:~3,2%
set tm3=%time:~6,2%
ECHO              %date% %tm1%点%tm2%分%tm3%秒
echo                    补丁全部安装完毕!
echo ......
for /l %%m in (30,-1,1) do (
ping /n 2 127.1>nul
title %%m ...... 系统将在30秒后重起!
)
shutdown -r -t 0




hihi~ 大家好,小弟初到贵处,请各位高手多多指教。。。:)
2009-10-5 10:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
www0com0my
初级用户





积分 31
发帖 19
注册 2008-2-5
状态 离线
『第 3 楼』:  

还有一个比较高级的。
@ECHO off
REM By zzzfinal
SET TITLE=Windows 补丁安装脚本 V0.070408
TITLE %TITLE%
SETLOCAL ENABLEDELAYEDEXPANSION
SET PATCHFLAG=KB
SET CAT=%PATCHFLAG%*.cat
SET PATCHLIST="%temp%\patcheslist.tmp"
SET INSTALLED=√ 已安装
SET NOTINSTALLED=× 未安装
SET DELIMS=-----------------------------------------
SET PATCH_TOTAL=0
SET PATCH_NOTINSTALLED=0
SET FLAG_INSTALLED=1*
SET FLAG_NOTINSTALLED=0*

:main
TITLE 正在搜索... -- %TITLE%
ECHO 正在搜索当前目录"%cd%"及其子目录下的补丁...
ECHO 如果想在搜索完成后立即安装未安装的补丁,请按回车。
ECHO.
REM 搜索补丁,没有搜索到则退出,否则继续。
CALL :pfind || (call :error 1& goto :eof)
ECHO.
:confirm
TITLE 请选择要安装的补丁 -- %TITLE%
ECHO 搜索到如上%PATCH_TOTAL%个补丁,其中%PATCH_NOTINSTALLED%个未安装。安装全部请输入ALL,否则请直接按回车安装尚未安装的补丁。
SET confirm=
SET /p confirm=
IF /i "%confirm%" == "ALL" (SET confirm=
) ELSE IF not defined confirm (SET confirm=%FLAG_INSTALLED:~0,1%
) ELSE GOTO confirm
ECHO %DELIMS%
ECHO.
ECHO 正在安装,请稍候。安装程序不会抢占窗口焦点,所以你可以干点别的:)
ECHO.
CALL :setup %confirm%
del %PATCHLIST% 2>nul >nul
TITLE 安装已结束 -- %TITLE%
ECHO %DELIMS%
ECHO.
ECHO 安装已结束。要使补丁生效,你可能需要手动重新启动计算机。
ECHO 按任意键退出。
SET TITLE=
ENDLOCAL
PAUSE >nul
TITLE %ComSpec%
goto :eof

REM 安装补丁
:setup
if "%1" == "" (set patchsum=%PATCH_TOTAL%) ELSE set patchsum=%PATCH_NOTINSTALLED%
set patch_counter=0
FOR /f "eol=%1 usebackq tokens=2,*" %%i in (%PATCHLIST%) DO (
set /a patch_counter+=1
TITLE !patch_counter!/%patchsum%-%%i -- %TITLE%
set nobackup=nobackup
echo %%i | find /i "%PATCHFLAG%8" 2>nul >nul && set nobackup=n
%%j /quiet /passive /norestart /!nobackup! 2>nul >nul
ECHO !patch_counter!/%patchsum% %%i √)
goto :eof

REM 搜索当前目录下的补丁,返回非零值为失败。
:pfind
SET REG=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
SET listinreg="%temp%\listinreg.tmp"
reg query %reg%>%listinreg%
del %PATCHLIST% 2>nul >nul
REM 补丁是一个压缩包
FOR /r %%i in (*%PATCHFLAG%*.exe) DO CALL :pfind.sub "%%~ni" "%%~fi" "%%~sfi"
REM 补丁在压缩包展开后的目录内
FOR /r %%i in (%cat%) DO IF exist %%~dpiupdate.exe FOR /f %%j in ("%%~dpiupdate.exe") DO CALL :pfind.sub "%%~ni" "%%~fj" "%%~sfj"
IF not exist %PATCHLIST% EXIT /b 1
sort %PATCHLIST% /o %PATCHLIST%
rem 得到补丁个数
FOR /f "tokens=3 delims= " %%i in ('find /c /i "%FLAG_NOTINSTALLED%" %PATCHLIST%') DO SET PATCH_NOTINSTALLED=%%i
FOR /f "tokens=3 delims= " %%i in ('find /c /i "%FLAG_INSTALLED%" %PATCHLIST%') DO SET /a PATCH_TOTAL=%%i + %PATCH_NOTINSTALLED%
del %listinreg% 2>nul >nul
IF not defined patch_total EXIT /b 2
IF %patch_total% LSS 1 EXIT /b 3
EXIT /b 0
goto :eof
REM 看看补丁安装了没,然后写到标准输出和%PATCHLIST%内
:pfind.sub
IF "%~3" == "" GOTO :eof
CALL :getkbnum %1
SET id=!errorlevel!
IF not "!id!" == "-1" (
find /i "!id!" %listinreg% 2>nul >nul && (
set status=%FLAG_INSTALLED%& set isinstalled=%INSTALLED%
)||(set status=%FLAG_NOTINSTALLED%& set isinstalled=%NOTINSTALLED%)
ECHO !status! %PATCHFLAG%!id! %2>>%PATCHLIST%
ECHO !isinstalled! %PATCHFLAG%!id! %3
)
goto :eof

REM 返回给定字串中的KB号,返回-1表示失败。
:getkbnum
SETLOCAL ENABLEDELAYEDEXPANSION
SET str=%~1
IF not defined str EXIT /b -1
IF not defined PATCHFLAG SET PATCHFLAG=KB
echo %PATCHFLAG%>getsize.tmp
for %%i in (getsize.tmp) do SET /a offset=%%~zi-2
del getsize.tmp 2>nul >nul
SET start=0
REM 仅有%PATCHFLAG%则返回-1
IF /i "%str%" == "%PATCHFLAG%" EXIT /b -1
REM 删除%PATCHFLAG%前的字符,删除失败则返回-1
:getkbnum.findkb
IF "%~1" == "!str!" (IF "!str:~%start%,%offset%!" == "" (EXIT /b -1
) ELSE IF /i "!str:~%start%,%offset%!" == "%PATCHFLAG%" (SET str=!str:~%start%!
) ELSE (SET /a start+=1 & goto getkbnum.findkb))
REM 仅有%PATCHFLAG%则返回-1
SET str=!str:~%offset%!
IF "%str%" == "" EXIT /b -1
SET start=0
REM 保证%PATCHFLAG%后的第一个字符不是数字时,仍能返回-1
IF "!str:~%start%,1!" GTR "9" EXIT /b -1
IF "!str:~%start%,1!" LSS "0" EXIT /b -1
REM 返回%PATCHFLAG%后的数字
:getkbnum.findnum
IF "!str:~%start%,1!" GTR "9" EXIT /b !str:~0,%start%!
IF "!str:~%start%,1!" LSS "0" EXIT /b !str:~0,%start%!
SET /a start+=1
goto getkbnum.findnum
ENDLOCAL
EXIT /b -1

:error
TITLE ERROR -- %TITLE%
IF "%1" == "1" (ECHO 没有找到补丁。使用的搜索规则是:CAT:%cat%,PATCHFLAG:%PATCHFLAG%。程序已结束。)
SET TITLE=
PAUSE >nul
TITLE %ComSpec%
goto :eof




hihi~ 大家好,小弟初到贵处,请各位高手多多指教。。。:)
2009-10-5 10:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: