清理winsxs的小工具

清理winsxs的小工具因为磁盘空间不够了 所以想起来清理一下系统垃圾文件 主要目标就是臭名昭著的 winsxs 目录 这个 winsxs 就是微软为了解决 dllhell 问题 结果是好比在 windows 系统里安置了一个毫无节制

原文地址为: 清理winsxs的小工具

因为磁盘空间不够了,所以想起来清理一下系统垃圾文件,主要目标就是臭名昭著的winsxs目录。这个winsxs就是微软为了解决“dll hell”问题,结果是好比在windows系统里安置了一个毫无节制不断增大的“肿瘤”。听说微软研究院现在在研究这个问题,不过我想我的硬盘空间不够大,等不到这个补丁出来的时候,所以只好自己动手了。

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

winsxs目录下的不同版本文件都存放在特定命名规则的目录下,比如

C:\Windows\winsxs 的目录

这里的各个部分用下划线分割,其中我们关注的是“6.0.6000.16386”部分,它表示旧文件的版本号,之前则是唯一文件标识,之后是语言,最后部分是散列值(防止名字冲突)。

本工具的设计思想就是删除所有的旧文件。所有满足如下全部条件的目录都会被移动到C:\Windows\winsxs_del目录中。

  1. 存在比自身更新的版本
  2. 本身不是最新版本

运行工具前的C盘剩余空间:

C:\Windows\winsxs_del>

 

运行工具并且执行命令

for /d %v in (%SystemRoot%\winsxs_del\*.*) do rd /s /q %v

删除所有可以删除的无用文件之后的剩余空间:

C:\Windows\winsxs_del>

 

工具源代码如下:请保存为winsxs_clear.bat即可。所有不再需要的文件会移动到c:\windows\winsxs_del目录中,可以直接进行删除。

1
清理winsxs的小工具 @echo   off
2 清理winsxs的小工具 rem 获取windows版本
3 清理winsxs的小工具 set move_dir = %SystemRoot% \ winsxs_del
4 清理winsxs的小工具 if   not   exist %move_dir% \ nul md %move_dir%
5 清理winsxs的小工具 set winver = none
6 清理winsxs的小工具 FOR   / F eol=; tokens=4* delims=] %%i in ( ver )   do   set winver = %%i
7 清理winsxs的小工具 if   %winver%   ==   none   goto enover
8 清理winsxs的小工具 echo windows version is %winver% , ready to list winsxs dir .
9 清理winsxs的小工具 if   not   exist %SystemRoot% \ winsxs \ nul goto enosxs
10 清理winsxs的小工具
11 清理winsxs的小工具 set ver_prefix = %winver:~ 0 , 1 %
12 清理winsxs的小工具 echo list winsxs finished! now ready to clear duplicated files   清理winsxs的小工具
13 清理winsxs的小工具 echo   dir   / ad %SystemRoot% \ winsxs \ *_%ver_prefix%*
14 清理winsxs的小工具
15 清理winsxs的小工具 if   %1   ==   run-winsxs-generated   goto   :lSkipGen
16 清理winsxs的小工具 rem 准备生成代码
17 清理winsxs的小工具 copy   / y %~f0   %temp%\%~nx0   > nul
18 清理winsxs的小工具 echo   rem genereted code here >> “%temp%\%~nx0”
19 清理winsxs的小工具 echo   :ldcdStat1   >>   %temp%\%~nx0
20 清理winsxs的小工具 echo   set end4 = %%arg:%ver_prefix% = %% >>   %temp%\%~nx0
21 清理winsxs的小工具 echo   goto ldcdStat2 >>   %temp%\%~nx0
22 清理winsxs的小工具 echo   :ldcdStat3   >>   %temp%\%~nx0
23 清理winsxs的小工具 echo   set end4a = %%arg:%winver% = %% >>   %temp%\%~nx0
24 清理winsxs的小工具 echo   goto ldcdStat4 >>   %temp%\%~nx0
25 清理winsxs的小工具 rem notepad “%temp%\%~nx0”
26 清理winsxs的小工具 %temp%\%~nx0   run -winsxs-generated
27 清理winsxs的小工具 goto   :EOF
28 清理winsxs的小工具
29 清理winsxs的小工具 :lSkipGen
30 清理winsxs的小工具 FOR   / F eol=; tokens=1-4 delims= %%a in ( dir   / ad %SystemRoot% \ winsxs \ *_%ver_prefix%*’ )   do   (
31 清理winsxs的小工具    if   %%c   ==  


 
call
:fnDoClear
%%d

32
清理winsxs的小工具
)


33
清理winsxs的小工具

34
清理winsxs的小工具
echo
clear OK!

35
清理winsxs的小工具
goto
 
:EOF


36
清理winsxs的小工具

37
清理winsxs的小工具
:enover


38
清理winsxs的小工具
echo
could
not
get windows version
,
abort!

39
清理winsxs的小工具
goto
 
:EOF


40
清理winsxs的小工具

41
清理winsxs的小工具
:enosxs


42
清理winsxs的小工具
echo
 
not
found %SystemRoot%
\
winsxs! maybe no privilege or lower windows!

43
清理winsxs的小工具
echo
only support windows XP and later!

44
清理winsxs的小工具
goto
 
:EOF


45
清理winsxs的小工具

46
清理winsxs的小工具
:fnDoClear


47
清理winsxs的小工具
rem
arg: dir_name


48
清理winsxs的小工具
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
清理winsxs的小工具
goto
 
:EOF


50
清理winsxs的小工具

51
清理winsxs的小工具
:fnDoClearDir
 

52
清理winsxs的小工具
rem
arg: dir_name dir_parts 清理winsxs的小工具


53
清理winsxs的小工具
set
d_name
=
%1


54
清理winsxs的小工具
rem
检查参数是否匹配 %winver%, 先跳过前两个.同时准备组合新版本匹配名称,nv1存当前版本,nv2存当前的前一个版本


55
清理winsxs的小工具
set
nv1
=
%2
_
%3
_

56
清理winsxs的小工具
set
nv2
=
%2
_
%3
_

57
清理winsxs的小工具
:ldcdCycle


58
清理winsxs的小工具
if
 

%4

 
==
 
“”
 
goto
 
:EOF


59
清理winsxs的小工具
rem
检查是否 ver_prefix 开头,如果是则继续检查是否winver,如果不是winver则表示目标存在


60
清理winsxs的小工具
set
arg
=
%4


61
清理winsxs的小工具
rem
set line=set end4=%%arg:%ver_prefix%=%%


62
清理winsxs的小工具rem
%line%


63
清理winsxs的小工具
goto
ldcdStat1

64
清理winsxs的小工具
:ldcdStat2


65
清理winsxs的小工具
if
 

%arg%

 
==
 

%end4%

 
goto
ldcdNext

66
清理winsxs的小工具
rem
检查是否 winver 开头


67
清理winsxs的小工具rem
set line=set end4a=%%arg:%winver%=%%


68
清理winsxs的小工具rem
%line%


69
清理winsxs的小工具
goto
ldcdStat3

70
清理winsxs的小工具
:ldcdStat4


71
清理winsxs的小工具
if
 
not
 

%arg%

 
==
 

%end4a%

 
goto
 
:EOF


72
清理winsxs的小工具
rem
至此则为 ver_prefix 开头 且 不等于 winver 的目录名,检查最新版本是否存在,存在则可删除旧的


73
清理winsxs的小工具
set
newfound
=
false

74
清理winsxs的小工具
for
 
/
d %%v in
(

%SystemRoot%\winsxs\%nv1%%winver%.*_%5_*

)
 
do
 
(


75
清理winsxs的小工具   
if
 
exist
%%v
\
nul
set
newfound
=
true

76
清理winsxs的小工具
)
   

77
清理winsxs的小工具
if
 

%newfound%

 
==
 

true

 
call
:fnDelDir
%d_name%

78
清理winsxs的小工具

79
清理winsxs的小工具
goto
 
:EOF


80
清理winsxs的小工具
:ldcdNext


81
清理winsxs的小工具
set
nv2
=
%nv1%

82
清理winsxs的小工具
set
nv1
=
%nv2%
%4
_

83
清理winsxs的小工具
shift


84
清理winsxs的小工具
goto
ldcdCycle

85
清理winsxs的小工具

86
清理winsxs的小工具
:fnDelDir


87
清理winsxs的小工具
rem
arg: dir


88
清理winsxs的小工具
echo
 
del
%SystemRoot%
\
winsxs
\
%1


89
清理winsxs的小工具takeown
/
r
/
f

%SystemRoot%\winsxs\%1



90
清理winsxs的小工具cacls

%SystemRoot%\winsxs\%1

 
/
t
/
e
/
g everyone
:f


91
清理winsxs的小工具
move
 

%SystemRoot%\winsxs\%1

 

%move_dir%\%1



92
清理winsxs的小工具
goto
 
:EOF


93
清理winsxs的小工具

94
清理winsxs的小工具

 

代码导读有助于大家理解程序和算法,但是基本的批处理语法就不讲了,有几年编程经验的我想也看得懂。以下是大致几个要注意的地方:

  1. 代码的开头部分是用ver命令获取系统的版本号,并且存放到%winver%变量中,比如我的ver命令返回就是“Microsoft Windows [版本 6.0.6002]”,为了获取这个“6.0.6002”,所以要做一些处理,另外,%ver_prefix%中存放的是类似“6.0.600”,为了比较旧版本号用途。
  2. 因为批处理无法实现嵌套嵌入功能,比如我想把从目录中分解出来的6.0.6000.16386和%ver_prefix%进行比较,就无法实现了,只好用代码生成大法来处理,在18~24行就是生成代码,该代码在63行和69行调用。26行负责把控制转移到新生成的文件中执行。
  3. 因为winsxs目录是有特殊权限的,所以先用takeown命令设置当前用户为拥有者,然后用cacls修改目录权限,最后用move指令将目录转移到winsxs_del目录中。如果出现程序无法运行的情况,请手工移动回去即可。

转载请注明本文地址: 清理winsxs的小工具



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210811.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:52
下一篇 2026年3月18日 下午11:52


相关推荐

  • python中 列表(List)转换为字符串(Str)的方法

    python中 列表(List)转换为字符串(Str)的方法1、List列表转为Str字符串List中存的是字符串的时候,一般是通过.join()函数去转换:例:dataList=[‘1′,’2′,’3′,’4’]str1=“,”+join(dataList)print(dataList)…

    2022年6月2日
    51
  • 常见逻辑漏洞[通俗易懂]

    常见逻辑漏洞[通俗易懂] 支付逻辑漏洞检测方法与案列支付漏洞一般分为三类,支付过程可直接修改数据包中的支付金额开发人员为了方便,导致支付的关键数据,能直接截包查看而重要的金额数据,在后端没有做校验,传递过程中也没有做签名,导致可以随意篡改金额.  没有对购买数量进行负数限制产生的原因是开发人员没有对购买的数量参数进行严格的限制,传输过程没有做签名,导致可随意修改,经典的修改方式就是…

    2022年5月4日
    45
  • java什么是重写什么是重载_方法的重写和重载

    java什么是重写什么是重载_方法的重写和重载重写和重载的区别一.重写1.重写概念重写是父类与子类中的多态性,子类可以继承父类中的方法并进行重写,但是要保证几点没有变1)方法返回值类型不变2)参数列表不变3)方法名不变满足了这三点之后,子类中父类的方法就被覆盖了,如果想要调用父类的方法,用super关键字2.重写规则重写也是有一定的规则的,否则会报错重写规则:1)参数列表必须完全与被重写的方法相同;2)返回类型必须一直与被重写的方法相同;3)访问修饰符的权限一定要大于等于父类方法的访问修饰符;4)重写方法一定不能抛出

    2025年10月11日
    6
  • sql常用函数大全

    sql常用函数大全转载自:https://blog.csdn.net/mrtwofly/article/details/53939400一、数学函数ABS(x)  返回x的绝对值BIN(x)  返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x)  返回大于x的最小整数值EXP(x)  返回值e(自然对数的底)的x次方FLOOR(x)  返回小于x的最大整数值GREATEST(x1,…

    2022年6月22日
    28
  • 指纹图像预处理

    指纹图像预处理指纹图像预处理是指纹识别的前提 它的好坏直接影响到指纹识别的成败 但由于指纹图像降质带来的困难 并根据指纹图像的特征提出了合理的假设 再根据假设提出了增强指纹图像对比度的算法 提取指纹有效区域的算法 根据方向信息分割图像的算法以及去除图像中气泡噪声的算法 这些算法处理效果好 能有效地解决指纹图像的预处理问题 用 Matlab 实现这种方法 既能分步对指纹图像预处理算法进行仿真测试 又可以很直观地看到图像预处理算法的效果 实验证明 用 Matlab 实现的处理结果比较理想 满足识别的应用性 本文介

    2026年3月19日
    2
  • Python——求平均值

    Python——求平均值方法一 scores 91 95 97 99 92 93 96 98 scores2 avg sum scores len scores print 平均成绩是 format avg foriinscores ifi

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号