分享

win7 winsxs精简 cmd 脚本之 再次 改进版

 简心渡惑 2019-04-05
@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 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多