发表于 2012-7-24
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=255200&highlight=win7%2B%BE%AB%BC%F2
网上传播 的 所谓 用于 win7 winsxs精简的 cmd 脚本,我 进行了 改进 。大家帮忙 测试 下 吧 。
@echo offSETLOCAL ENABLEDELAYEDEXPANSIONtitle 清理WIN7 WINSXS重复文件 ver.5.3COLOR 0Aset startT=%TIME%set move_dir=%SystemRoot%\winsxs_delset df=0&& set df1=0&& set nf=0if not exist %move_dir%\nul md %move_dir%set log=%temp%\winsxs-clear.logpushd "%SystemRoot%\winsxs"echo ===================== Start... %startT% ============================ >> "%log%"FOR /F "delims=" %%a in ('dir /ad /b /o-n %SystemRoot%\winsxs\*.*') do ( set /a nf+=1 if exist "%SystemRoot%\winsxs\%%a" call:fnDoClear "%%a")echo ===================== OK... %DATE% %TIME% (%df1%/%df%/%nf%)================= >> "%log%"echo 清理完毕. %startT% - %TIME%. %log%.echo 文件已经被移至 %move_dir%. (%df1%/%df%/%nf%)for %%c in (startt move_dir log df df1 nf) do set %%c=popdpause>nulgoto :EOF:fnDoClear call:fnSplitName %1 if not "%f_name%"=="" call:fnDoClearDir %1 !f_type! !f_name! !f_id! !f_rev! !f_lang! !f_sign!goto :EOF:fnSplitNamefor %%c in (f_type f_name f_id f_rev f_lang f_sign) do set %%c=SET L=%~1SET /A M=0:LOOP1SET L2=%L:~-1,1%SET L=%L:~0,-1%IF "%L2%"=="_" ( SET /A M+=1 IF "%M%"=="3" ( FOR /F "delims=_ tokens=1*" %%C IN ("%L%") DO ( SET f_name=%%D set f_type=%%C) set f_id=%l1%) if "%m%"=="0" set f_sign=%l1% if "%m%"=="1" set f_lang=%l1% if "%m%"=="2" set f_rev=%l1% set l1=) else ( set l1=%L2%%l1%)IF "%L%"=="" GOTO END1GOTO LOOP1:END1for %%c in (l l1 l2) do set %%c=if %m% lss 5 set f_name=goto :EOF:fnDoClearDircall:fnStdVer %5set curorgver=%5set curver=%R_STDVER%set cursign=%7set R_STDVER=set newver=set neworgver=set newsign=FOR /F "delims=" %%a in ('dir /ad /o-n /b %2_%3_%4_*_%6_*') do ( call:fnSplitName %%a if not "%f_name%"=="" call:fnCompVer "!newver!" !f_rev! !f_sign!)if "%newver%"=="" goto :EOFecho ------%nf%# !f_type! !f_name! !neworgver! !newsign! ---echo ------%nf%# !f_type! !f_name! !neworgver! !newsign! --->>"%log%"FOR /F "delims=" %%a in ('dir /ad /o-n /b %2_%3_%4_*_%6_*') do ( call:fnSplitName %%a if not "!f_name!"=="" ( if "!neworgver!"=="!f_rev!" ( if "!newsign!"=="!f_sign!" ( echo 保留 %%a echo 保留 %%a >> "%log%" ) else ( call:fnDelDir "%%a") ) else ( call:fnDelDir "%%a") ))echo ============================================================================echo ============================================================================>>"%log%"goto :EOF:fnCompVerset V1=%~1call:fnStdVer %2set V2=%R_STDVER%set R_STDVER=if "%~1"=="" set neworgver=%2&&set newver=%V2%&&set newsign=%3&& goto :EOFif /I "%V1%" LSS "%V2%" set neworgver=%2&&set newver=%V2%&&set newsign=%3&& goto :EOFgoto :EOF:fnStdVerFOR /F "eol=; tokens=1-10 delims=." %%v in ("%~1") do call:fnStdVerImpl %%v %%w %%x %%y %%zgoto :EOF:fnStdVerImplset svi_1=0000000000%1set svi_2=0000000000%2set svi_3=0000000000%3set svi_4=0000000000%4set svi_5=0000000000%5set svi_6=0000000000%6set R_STDVER=%svi_1:~-10%.%svi_2:~-10%.%svi_3:~-10%.%svi_4:~-10%.%svi_5:~-10%.%svi_6:~-10%goto :EOF:fnDelDirset /a df+=1takeown /r /f "%SystemRoot%\winsxs\%~1" >nul 2>nulcacls "%SystemRoot%\winsxs\%~1" /t /e /g everyone:f >nul 2>nulmove "%SystemRoot%\winsxs\%~1" "%move_dir%\%~1" >nul 2>nulif not ERRORLEVEL 1 ( echo ...%df%# 成功移除 %1 echo ...%df%# 成功移除 %1>> "%log%" set /a df1+=1) else ( echo ...%df%# 未能移除 %1 echo ...%df%# 未能移除 %1>> "%log%")goto :EOF
主要 改进 :
1、用 dir /ad /b /o-n 代替 dir /ad /o-n 可以节省 判断 <DIR> 的语句条目2、改进 名称 split 段 内容,适合 更多情况3、改进 删除文件 的 条件判断 ,使其 更合理。 当确定 一个文件的 文件名 版本 签名 以后 , 原有 判断条件 是版本+签名同时与 要保留的 文件 不同的时候 才 删除。 改进为 版本 或 签名 其一不同就 删掉。4、增加 项目计数另外 原版本中如下语句不明 何意set mxms=a if not "!mxms!" == "a" set mxms=&&%comspec% /V:ON /C %0 %* && goto :EOF set mxms=