@echo off SETLOCAL ENABLEDELAYEDEXPANSION title 清理WIN7 WINSXS重复文件 ver.5.3 COLOR 0A set startT=%TIME% set move_dir=%SystemRoot%\winsxs_del set df=0&& set df1=0&& set nf=0 if not exist %move_dir%\nul md %move_dir% set log=%temp%\winsxs-clear.log pushd "%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= popd pause>nul goto :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 :fnSplitName for %%c in (f_type f_name f_id f_rev f_lang f_sign) do set %%c= SET L=%~1 SET /A M=0 :LOOP1 SET 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 END1 GOTO LOOP1 :END1 for %%c in (l l1 l2) do set %%c= if %m% lss 5 set f_name= goto :EOF :fnDoClearDir call:fnStdVer %5 set curorgver=%5 set curver=%R_STDVER% set cursign=%7 set 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 :EOF echo ------%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 :fnCompVer set V1=%~1 call:fnStdVer %2 set V2=%R_STDVER% set R_STDVER= if "%~1"=="" set neworgver=%2&&set newver=%V2%&&set newsign=%3&& goto :EOF if /I "%V1%" LSS "%V2%" set neworgver=%2&&set newver=%V2%&&set newsign=%3&& goto :EOF goto :EOF :fnStdVer FOR /F "eol=; tokens=1-10 delims=." %%v in ("%~1") do call:fnStdVerImpl %%v %%w %%x %%y %%z goto :EOF :fnStdVerImpl set svi_1=0000000000%1 set svi_2=0000000000%2 set svi_3=0000000000%3 set svi_4=0000000000%4 set svi_5=0000000000%5 set svi_6=0000000000%6 set R_STDVER=%svi_1:~-10%.%svi_2:~-10%.%svi_3:~-10%.%svi_4:~-10%.%svi_5:~-10%.%svi_6:~-10% goto :EOF :fnDelDir set /a df+=1 takeown /r /f "%SystemRoot%\winsxs\%~1" >nul 2>nul cacls "%SystemRoot%\winsxs\%~1" /t /e /g everyone:f >nul 2>nul move "%SystemRoot%\winsxs\%~1" "%move_dir%\%~1" >nul 2>nul if not ERRORLEVEL 1 ( echo ...%df%# 成功移除 %1 echo ...%df%# 成功移除 %1>> "%log%" set /a df1+=1 ) else ( echo ...%df%# 未能移除 %1 echo ...%df%# 未能移除 %1>> "%log%" ) goto :EOF |
|