无忧启动论坛

标题: win7 winsxs精简 cmd 脚本之 再次 改进版 [打印本页]

作者: dos时代菜鸟    时间: 2012-7-24 20:13
标题: win7 winsxs精简 cmd 脚本之 再次 改进版
网上传播 的 所谓  用于 win7 winsxs精简的  cmd 脚本,我 进行了 改进 。大家帮忙 测试 下 吧 。

  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. title 清理WIN7 WINSXS重复文件 ver.5.3
  4. COLOR 0A
  5. set startT=%TIME%
  6. set move_dir=%SystemRoot%\winsxs_del
  7. set df=0&& set df1=0&& set nf=0
  8. if not exist %move_dir%\nul md %move_dir%
  9. set log=%temp%\winsxs-clear.log
  10. pushd "%SystemRoot%\winsxs"
  11. echo ===================== Start... %startT% ============================ >> "%log%"
  12. FOR /F "delims=" %%a in ('dir /ad /b /o-n %SystemRoot%\winsxs\*.*') do (
  13.     set /a nf+=1
  14.     if exist "%SystemRoot%\winsxs\%%a" call:fnDoClear "%%a"
  15. )
  16. echo ===================== OK... %DATE% %TIME% (%df1%/%df%/%nf%)================= >> "%log%"
  17. echo 清理完毕.  %startT% - %TIME%. %log%.
  18. echo 文件已经被移至 %move_dir%. (%df1%/%df%/%nf%)
  19. for %%c in (startt move_dir log df df1 nf) do set %%c=
  20. popd
  21. pause>nul
  22. goto :EOF
  23.   
  24. :fnDoClear
  25.     call:fnSplitName %1
  26.     if not "%f_name%"=="" call:fnDoClearDir %1 !f_type! !f_name! !f_id! !f_rev! !f_lang! !f_sign!
  27. goto :EOF
  28.   
  29. :fnSplitName
  30. for %%c in (f_type f_name f_id f_rev f_lang f_sign) do set %%c=
  31. SET L=%~1
  32. SET /A M=0
  33. :LOOP1
  34. SET L2=%L:~-1,1%
  35. SET L=%L:~0,-1%
  36. IF "%L2%"=="_" (
  37.    SET /A M+=1
  38.    IF "%M%"=="3" (
  39.      FOR /F "delims=_ tokens=1*" %%C IN ("%L%") DO (
  40.        SET f_name=%%D
  41.        set f_type=%%C)
  42.      set f_id=%l1%)
  43.    if "%m%"=="0" set f_sign=%l1%
  44.    if "%m%"=="1" set f_lang=%l1%
  45.    if "%m%"=="2" set f_rev=%l1%
  46.    set l1=
  47. ) else ( set l1=%L2%%l1%)
  48. IF "%L%"=="" GOTO END1
  49. GOTO LOOP1
  50. :END1
  51. for %%c in (l l1 l2) do set %%c=
  52. if %m% lss 5 set f_name=
  53. goto :EOF
  54. :fnDoClearDir
  55. call:fnStdVer %5
  56. set curorgver=%5
  57. set curver=%R_STDVER%
  58. set cursign=%7
  59. set R_STDVER=
  60. set newver=
  61. set neworgver=
  62. set newsign=
  63. FOR /F "delims=" %%a in ('dir /ad /o-n /b %2_%3_%4_*_%6_*') do (
  64.         call:fnSplitName %%a
  65.         if not "%f_name%"=="" call:fnCompVer "!newver!" !f_rev! !f_sign!
  66. )
  67. if "%newver%"=="" goto :EOF
  68. echo ------%nf%# !f_type! !f_name! !neworgver! !newsign! ---
  69. echo ------%nf%# !f_type! !f_name! !neworgver! !newsign! --->>"%log%"
  70. FOR /F "delims=" %%a in ('dir /ad /o-n /b %2_%3_%4_*_%6_*') do (
  71.         call:fnSplitName %%a
  72.         if not "!f_name!"=="" (
  73.             if "!neworgver!"=="!f_rev!" (
  74.   if "!newsign!"=="!f_sign!" (
  75.    echo 保留 %%a
  76.    echo 保留 %%a >> "%log%"
  77.   ) else ( call:fnDelDir "%%a")
  78.      ) else ( call:fnDelDir "%%a")
  79.         )
  80. )
  81. echo ============================================================================
  82. echo ============================================================================>>"%log%"
  83. goto :EOF
  84.   
  85. :fnCompVer
  86. set V1=%~1
  87. call:fnStdVer %2
  88. set V2=%R_STDVER%
  89. set R_STDVER=
  90. if "%~1"=="" set neworgver=%2&&set newver=%V2%&&set newsign=%3&& goto :EOF
  91. if /I "%V1%" LSS "%V2%" set neworgver=%2&&set newver=%V2%&&set newsign=%3&& goto :EOF
  92. goto :EOF
  93.   
  94. :fnStdVer
  95. FOR /F "eol=; tokens=1-10 delims=." %%v in ("%~1") do call:fnStdVerImpl %%v %%w %%x %%y %%z
  96. goto :EOF
  97.   
  98. :fnStdVerImpl
  99. set svi_1=0000000000%1
  100. set svi_2=0000000000%2
  101. set svi_3=0000000000%3
  102. set svi_4=0000000000%4
  103. set svi_5=0000000000%5
  104. set svi_6=0000000000%6
  105. set R_STDVER=%svi_1:~-10%.%svi_2:~-10%.%svi_3:~-10%.%svi_4:~-10%.%svi_5:~-10%.%svi_6:~-10%
  106. goto :EOF
  107.   
  108. :fnDelDir
  109. set /a df+=1
  110. takeown /r /f "%SystemRoot%\winsxs\%~1" >nul 2>nul
  111. cacls "%SystemRoot%\winsxs\%~1" /t /e /g everyone:f >nul  2>nul
  112. move "%SystemRoot%\winsxs\%~1" "%move_dir%\%~1" >nul 2>nul
  113. if not ERRORLEVEL 1 (
  114.   echo ...%df%# 成功移除 %1   
  115.   echo ...%df%# 成功移除 %1>> "%log%"
  116.   set /a df1+=1
  117. ) else (
  118.   echo ...%df%# 未能移除 %1
  119.   echo ...%df%# 未能移除 %1>> "%log%"
  120. )
  121. goto :EOF
复制代码

[ 本帖最后由 dos时代菜鸟 于 2012-8-2 10:20 编辑 ]
作者: dos时代菜鸟    时间: 2012-7-24 20:19
主要  改进 :
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=

[ 本帖最后由 dos时代菜鸟 于 2012-8-2 10:21 编辑 ]
作者: 2011回忆爱情    时间: 2012-9-23 20:36
dos 大  想問一下 x86 x64 皆適用嗎

另 這是精簡 安裝好的系統!?
作者: slyneo    时间: 2012-9-29 17:13
减肥减肥,哈哈,谢谢分享.
作者: wang6610    时间: 2012-9-29 18:55
精简后,兼容性???????????
作者: 2011sinma    时间: 2012-10-13 11:33
感谢楼主的共享!回头测试一下看看效果。
作者: hhxxcx    时间: 2012-10-18 13:00
能精简多大体积啊??
作者: 2012kingson    时间: 2012-10-22 01:18
菜鸟不明白啊。。。改这个有什么作用呢?望指教~~
作者: xianglang    时间: 2012-10-22 12:09
我晕,精简目录居然不能删除,还有文件被调用中:msvcrt.dll、csrsrv.dll。
作者: 2012武汉-小虾    时间: 2012-10-22 22:17
标题: 回复 #1 dos时代菜鸟 的帖子
谢谢分享。。。不错的帖子




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3