当前位置:文档之家› 清理winsxs的小工具

清理winsxs的小工具

清理winsxs的小工具因为磁盘空间不够了,所以想起来清理一下系统垃圾文件,主要目标就是臭名昭著的winsxs 目录。

这个winsxs就是微软为了解决“dll hell”问题,结果是好比在windows系统里安置了一个毫无节制不断增大的“肿瘤”。

听说微软研究院现在在研究这个问题,不过我想我的硬盘空间不够大,等不到这个补丁出来的时候,所以只好自己动手了。

winsxs目录下的文件都是系统要用的各种库文件,system32下存放了这些dll的最新的版本,所有老版本的dll都放在winsxs下。

所以只要你安装程序或者更新补丁,system32下的文件就会被更新,而同时winsxs就会增加一些旧文件,所以我们的C盘空间就在持续不断地减少,直到磁盘容量不够,被迫重装系统为止,如果你足够幸运,可以直接安装最新的SP的话,或许可以为winsxs节约一点微薄的空间。

winsxs目录下的不同版本文件都存放在特定命名规则的目录下,比如C:\Windows\winsxs>dir msil_microsoft.transactions.bridge.resources*驱动器C 中的卷是vista卷的序列号是989F-EFF3C:\Windows\winsxs 的目录msil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6000.16 386_zh-cn_1cde5a17d78fb5ecmsil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6000.16 716_zh-cn_1cd75781d79605cfmsil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6000.20 876_zh-cn_060fb27df137fddfmsil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6001.18 000_zh-cn_1cb2dbd3d7e75eb8msil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6001.18 106_zh-cn_1cb252ffd7e7f8cfmsil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6001.22 221_zh-cn_05e71ebbf18d0b5emsil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6002.18 005_zh-cn_1c8e610fd838f2cc0 个文件0 字节7 个目录5,382,139,904 可用字节这里的各个部分用下划线分割,其中我们关注的是“6.0.6000.16386”部分,它表示旧文件的版本号,之前则是唯一文件标识,之后是语言,最后部分是散列值(防止名字冲突)。

本工具的设计思想就是删除所有的旧文件。

所有满足如下全部条件的目录都会被移动到C:\Windows\winsxs_del目录中。

1.存在比自身更新的版本2.本身不是最新版本运行工具前的C盘剩余空间:所列文件总数:4473 个文件3,336,376,627 字节7655 个目录326,840,320 可用字节C:\Windows\winsxs_del>运行工具并且执行命令for /d %v in (%SystemRoot%\winsxs_del\*.*) do rd /s /q %v删除所有可以删除的无用文件之后的剩余空间:所列文件总数:52 个文件7,555,048 字节131 个目录5,383,979,008 可用字节C:\Windows\winsxs_del>工具源代码如下:请保存为winsxs_clear.bat即可。

所有不再需要的文件会移动到c:\windows\winsxs_del目录中,可以直接进行删除。

执行时候,务必请使用“管理员”权限。

@echo offrem 获取windows版本set move_dir=%SystemRoot%\winsxs_delif not exist %move_dir%\nul md %move_dir%set winver=noneFOR /F "eol=; tokens=4* delims=] " %%i in ('ver') do set winver=%%iif "%winver%" == "none" goto enoverecho windows version is %winver%, ready to list winsxs dir.if not exist %SystemRoot%\winsxs\nul goto enosxsset ver_prefix=%winver:~0,-1%echo list winsxs finished! now ready to clear duplicated filesecho dir /ad %SystemRoot%\winsxs\*_%ver_prefix%*if "%1" == "run-winsxs-generated" goto :lSkipGenrem 准备生成代码copy /y "%~f0" "%temp%\%~nx0" > nulecho rem genereted code here >> "%temp%\%~nx0"echo :ldcdStat1 >> "%temp%\%~nx0"echo set end4=%%arg:%ver_prefix%=%%>> "%temp%\%~nx0"echo goto ldcdStat2 >> "%temp%\%~nx0"echo :ldcdStat3 >> "%temp%\%~nx0"echo set end4a=%%arg:%winver%=%%>> "%temp%\%~nx0"echo goto ldcdStat4 >> "%temp%\%~nx0"rem notepad "%temp%\%~nx0""%temp%\%~nx0" run-winsxs-generatedgoto :EOF:lSkipGenFOR /F "eol=; tokens=1-4 delims= " %%a in ('dir /ad %SystemRoot%\winsxs\*_%ver_prefix%*') do (if "%%c" == "<DIR>" call:fnDoClear %%d)echo clear OK!goto :EOF:enoverecho could not get windows version, abort!goto :EOF:enosxsecho not found %SystemRoot%\winsxs! maybe no privilege or lower windows!echo only support windows XP and later!goto :EOF:fnDoClearrem arg: dir_nameFOR /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 %%zgoto :EOF:fnDoClearDirrem arg: dir_name dir_partsset d_name=%1rem 检查参数是否匹配%winver%, 先跳过前两个.同时准备组合新版本匹配名称,nv1存当前版本,nv2存当前的前一个版本set nv1=%2_%3_set nv2=%2_%3_:ldcdCycleif "%4" == "" goto :EOFrem 检查是否ver_prefix 开头,如果是则继续检查是否winver,如果不是winver则表示目标存在set arg=%4rem set line=set end4=%%arg:%ver_prefix%=%%rem %line%goto ldcdStat1:ldcdStat2if "%arg%" == "%end4%" goto ldcdNextrem 检查是否winver 开头rem set line=set end4a=%%arg:%winver%=%%rem %line%goto ldcdStat3:ldcdStat4if not "%arg%" == "%end4a%" goto :EOFrem 至此则为ver_prefix 开头且不等于winver 的目录名,检查最新版本是否存在,存在则可删除旧的set newfound=falsefor /d %%v in ("%SystemRoot%\winsxs\%nv1%%winver%.*_%5_*") do (if exist %%v\nul set newfound=true)if "%newfound%" == "true" call:fnDelDir %d_name%goto :EOF:ldcdNextset nv2=%nv1%set nv1=%nv2%%4_shiftgoto ldcdCycle:fnDelDirrem arg: direcho del %SystemRoot%\winsxs\%1takeown /r /f "%SystemRoot%\winsxs\%1"cacls "%SystemRoot%\winsxs\%1" /t /e /g everyone:fmove "%SystemRoot%\winsxs\%1" "%move_dir%\%1"goto :EOF代码导读有助于大家理解程序和算法,但是基本的批处理语法就不讲了,有几年编程经验的我想也看得懂。

相关主题