VISTA清理WINSXS的方法(轉)

將如下代碼另存爲bat文件,一些沒用的文件會移動到windows\winsxs_del目錄。sql

  
  
  
  
  1. @echo off 
  2. rem 獲取windows版本  
  3. set move_dir=%SystemRoot%\winsxs_del  
  4. if not exist %move_dir%\nul md %move_dir%  
  5. set winver=none  
  6. FOR /F "eol=; tokens=4* delims=] " %%i in ('ver') do set winver=%%i  
  7. if "%winver%" == "none" goto enover  
  8. echo windows version is %winver%, ready to list winsxs dir.  
  9. if not exist %SystemRoot%\winsxs\nul goto enosxs  
  10.  
  11. set ver_prefix=%winver:~0,-1%  
  12. echo list winsxs finished! now ready to clear duplicated files   
  13. echo dir /ad %SystemRoot%\winsxs\*_%ver_prefix%*  
  14.  
  15. if "%1" == "run-winsxs-generated" goto :lSkipGen  
  16. rem 準備生成代碼  
  17. copy /y "%~f0" "%temp%\%~nx0" > nul  
  18. echo rem genereted code here >> "%temp%\%~nx0" 
  19. echo :ldcdStat1 >> "%temp%\%~nx0" 
  20. echo set end4=%%arg:%ver_prefix%=%%>> "%temp%\%~nx0" 
  21. echo goto ldcdStat2 >> "%temp%\%~nx0" 
  22. echo :ldcdStat3 >> "%temp%\%~nx0" 
  23. echo set end4a=%%arg:%winver%=%%>> "%temp%\%~nx0" 
  24. echo goto ldcdStat4 >> "%temp%\%~nx0" 
  25. rem notepad "%temp%\%~nx0" 
  26. "%temp%\%~nx0" run-winsxs-generated  
  27. goto :EOF  
  28.  
  29. :lSkipGen  
  30. FOR /F "eol=; tokens=1-4 delims= " %%a in ('dir /ad %SystemRoot%\winsxs\*_%ver_prefix%*') do (  
  31.     if "%%c" == "<DIR>" call:fnDoClear %%d  
  32. )  
  33.  
  34. echo clear OK!  
  35. goto :EOF  
  36.  
  37. :enover  
  38. echo could not get windows version, abort!  
  39. goto :EOF  
  40.  
  41. :enosxs  
  42. echo not found %SystemRoot%\winsxs! maybe no privilege or lower windows!  
  43. echo only support windows XP and later!  
  44. goto :EOF  
  45.  
  46. :fnDoClear  
  47. rem arg: dir_name  
  48. FOR /F "eol=; tokens=1-14 delims=_" %%g in ("%1") do call:fnDoClearDir %1 %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q %%r %%s %%t %%u %%v %%w %%x %%y %%z  
  49. goto :EOF  
  50.  
  51. :fnDoClearDir   
  52. rem arg: dir_name dir_parts   
  53. set d_name=%1  
  54. rem 檢查參數是否匹配 %winver%, 先跳過前兩個.同時準備組合新版本匹配名稱,nv1存當前版本,nv2存當前的前一個版本  
  55. set nv1=%2_%3_  
  56. set nv2=%2_%3_  
  57. :ldcdCycle  
  58. if "%4" == "" goto :EOF  
  59. rem 檢查是否 ver_prefix 開頭,若是是則繼續檢查是否winver,若是不是winver則表示目標存在  
  60. set arg=%4  
  61. rem set line=set end4=%%arg:%ver_prefix%=%%  
  62. rem %line%  
  63. goto ldcdStat1  
  64. :ldcdStat2  
  65. if "%arg%" == "%end4%" goto ldcdNext  
  66. rem 檢查是否 winver 開頭  
  67. rem set line=set end4a=%%arg:%winver%=%%  
  68. rem %line%  
  69. goto ldcdStat3  
  70. :ldcdStat4  
  71. if not "%arg%" == "%end4a%" goto :EOF  
  72. rem 至此則爲 ver_prefix 開頭 且 不等於 winver 的目錄名,檢查最新版本是否存在,存在則可刪除舊的  
  73. set newfound=false 
  74. for /d %%v in ("%SystemRoot%\winsxs\%nv1%%winver%.*_%5_*") do (  
  75.     if exist %%v\nul set newfound=true 
  76. )      
  77. if "%newfound%" == "true" call:fnDelDir %d_name%  
  78.  
  79. goto :EOF  
  80. :ldcdNext  
  81. set nv2=%nv1%  
  82. set nv1=%nv2%%4_  
  83. shift  
  84. goto ldcdCycle  
  85.  
  86. :fnDelDir  
  87. rem arg: dir  
  88. echo del %SystemRoot%\winsxs\%1  
  89. takeown /r /f "%SystemRoot%\winsxs\%1" 
  90. cacls "%SystemRoot%\winsxs\%1" /t /e /g everyone:f  
  91. move "%SystemRoot%\winsxs\%1" "%move_dir%\%1" 
  92. goto :EOF  
相關文章
相關標籤/搜索