我的Winsxs目录清理脚本
最近两天我的C盘空间不够了,竟然只剩几K,真的很晕菜,而且即使使用CCleaner清理也没用,第二天又满了。所以下决心要清理Winsxs目录。之前我的winsxs清理脚本编写过一个版本,发布在我cnblogs的博客中,但是有些bug,在win7下不太好使,今天花了半天重新编制了一下。在上代码之前,先把算法逻辑说一下:
c:\windows\winsxs是系统目录,主要是防止臭名昭著的“dll hell”问题而设计的,原先windows升级之后,应用程序常常因为dll被升级了,导致无法正常运行,后来M$启用 winsxs 目录,保存每一个被升级的dll版本,每当应用程序需要使用dll的时候,就把与之对应版本的dll给它用,保证兼容性。
winsxs目录中所有的dll版本都存放在特殊格式的目录中,该目录名由以下的几个部分构成(我自己猜的,不一定解释准确),每个部分之间使用下划线连接:
- 子系统名称,取值一般有x86,amd64,msil等
- 库的全称,名称是全称,包含命名空间和库的名称,其中需要注意的是名称中可能会包含下划线,如果名字太长,会用...缩略
- 库的id,用于唯一标识库的id,因为简单的库的名称可能会有重复,所以分配一个唯一库id
- 版本,库的版本号,包含主版本,次版本,补丁版本和构建号
- 语言,如果没有语言则为none
- dll的id,也可能是校验码,反正我发现可以用来标识唯一的dll
@echo off set mxms=a if not "!mxms!" == "a" set mxms=&&%comspec% /V:ON /C %0 %* && goto :EOF set mxms= rem 算法描述: rem windows的winsxs目录中文件夹的格式都是:"类型_名字_库id_版本号_语言_签名" rem 检查所有的文件夹,如果发现有版本不同的文件存在,则删除所有旧版本的文件夹 rem 需要注意:名字部分可能也会包含多个下划线 rem 创建目录 set startT=%TIME% set move_dir=%SystemRoot%\winsxs_del if not exist %move_dir%\nul md %move_dir% set log=%temp%\winsxs-clear.log pushd "%SystemRoot%\winsxs" echo ===================== start %DATE% %TIME% ============================ >> "%log%" rem 遍历winsxs文件夹的所有目录 FOR /F "eol=; tokens=1-4 delims= " %%a in ('dir /ad /o-n %SystemRoot%\winsxs\*.*') do (if "%%c" == "<DIR>" if exist "%SystemRoot%\winsxs\%%d" call:fnDoClear %%d )echo ===================== OK! %DATE% %TIME% ============================ >> "%log%" echo clear OK! echo from %startT% to %TIME%. Check your '%move_dir%' please. echo view log from %log% set startT= set move_dir= popd goto :EOF:fnDoClear rem arg: dir_name rem 分解目录名 FOR /F "eol=; tokens=1-14 delims=_" %%g in ("%1") do (call:fnSplitName %1if not "%f_type%" == "" call:fnDoClearDir %1 !f_type! !f_name! !f_id! !f_rev! !f_lang! !f_sign! ) goto :EOF:fnSplitName rem arg: dir_name rem return f_xxx vars set f_type= set f_name= set f_id= set f_rev= set f_lang= set f_sign= FOR /F "eol=; tokens=1-14 delims=_" %%g in ("%1") do (if "%%m" == "" (set f_type=%%gset f_name=%%hset f_id=%%iset f_rev=%%jset f_lang=%%kset f_sign=%%l) else ( if "%%n" == "" (set f_type=%%gset f_name=%%h_%%iset f_id=%%jset f_rev=%%kset f_lang=%%lset f_sign=%%m) else ( if "%%o" == "" (set f_type=%%gset f_name=%%h_%%i_%%jset f_id=%%kset f_rev=%%lset f_lang=%%mset f_sign=%%n) else ( if "%%p" == "" (set f_type=%%gset f_name=%%h_%%i_%%j_%%kset f_id=%%lset f_rev=%%mset f_lang=%%nset f_sign=%%o) else ( if "%%q" == "" (set f_type=%%gset f_name=%%h_%%i_%%j_%%k_%%lset f_id=%%mset f_rev=%%nset f_lang=%%oset f_sign=%%p) else ( if "%%r" == "" (set f_type=%%gset f_name=%%h_%%i_%%j_%%k_%%l_%%mset f_id=%%nset f_rev=%%oset f_lang=%%pset f_sign=%%q) else ( if "%%s" == "" (set f_type=%%gset f_name=%%h_%%i_%%j_%%k_%%l_%%m_%%nset f_id=%%oset f_rev=%%pset f_lang=%%qset f_sign=%%r) else ( if "%%t" == "" (set f_type=%%gset f_name=%%h_%%i_%%j_%%k_%%l_%%m_%%n_%%oset f_id=%%pset f_rev=%%qset f_lang=%%rset f_sign=%%s) else ( if "%%u" == "" (set f_type=%%gset f_name=%%h_%%i_%%j_%%k_%%l_%%m_%%n_%%o_%%pset f_id=%%qset f_rev=%%rset f_lang=%%sset f_sign=%%t) else ( if "%%v" == "" (set f_type=%%gset f_name=%%h_%%i_%%j_%%k_%%l_%%m_%%n_%%o_%%p_%%qset f_id=%%rset f_rev=%%sset f_lang=%%tset f_sign=%%u) else (echo ERROR: can not split "%1")))))))))) )goto :EOF:fnDoClearDir rem arg: dir_name type namespace id revision lang sign rem 找到最新版本的目录名 call:fnStdVer %5 set curorgver=%5 set curver=%R_STDVER% set cursign=%7 set R_STDVER= set newver= set neworgver= set newsign= FOR /F "eol=; tokens=1-4 delims= " %%a in ('dir /ad /o-n %2_%3_%4_*_%6_*') do (if "%%c" == "<DIR>" (call:fnSplitName %%dif not "%f_type%" == "" call:fnCompVer "!newver!" !f_rev! !f_sign!) ) rem 如果没找到则返回 if "%newver%" == "" goto :EOF rem 如果找到,则将所有旧版本的清除 echo keep %2_%3_%4 %6 version %neworgver% echo keep %2_%3_%4 %6 version %neworgver% >> "%log%"FOR /F "eol=; tokens=1-4 delims= " %%a in ('dir /ad /o-n %2_%3_%4_*_%6_*') do (if "%%c" == "<DIR>" (call:fnSplitName %%dif not "!f_type!" == "" (if not "!neworgver!" == "!f_rev!" if not "!newsign!" == "!f_sign!" (echo ... clear %2_%3_%4 %6 version !f_rev!echo ... clear %2_%3_%4 %6 version !f_rev! >> "%log%"call:fnDelDir "%%d"))) )goto :EOF:fnCompVer rem oldver newver newsign rem result set var newver rem 分解ver的每一个部分,左侧填充0之后再比较 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 rem arg: ver FOR /F "eol=; tokens=1-10 delims=." %%v in ("%1") do call:fnStdVerImpl %%v %%w %%x %%y %%z goto :EOF:fnStdVerImpl rem major, minor, revision, build rem result set in R_STDVER 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 rem arg: dir echo deleting %SystemRoot%\winsxs\%~1 >> "%log%" echo --- takeown >> "%log%" takeown /r /f "%SystemRoot%\winsxs\%~1" >> "%log%" echo --- takeown = %ERRORLEVEL% >> "%log%"echo --- cacls >> "%log%" cacls "%SystemRoot%\winsxs\%~1" /t /e /g everyone:f >> "%log%" echo --- cacls = %ERRORLEVEL% >> "%log%"echo --- move >> "%log%" move "%SystemRoot%\winsxs\%~1" "%move_dir%\%~1" >> "%log%" echo --- move = %ERRORLEVEL% >> "%log%" goto :EOF
我的Winsxs目录清理脚本相关推荐
- Linux磁盘空间爆满怎么办?定时文件清理脚本配置实现
在Linux系统上跑任务会遇到系统磁盘空间爆满的情况,表现出来的现象是程序运行报错,或执行缓慢.记录下Linux磁盘空间占用的查看方法和文件清理脚本定时触发配置的实现. 一.Linux磁盘空间占用分析 ...
- 随笔 - 141 文章 - 0 评论 - 214 IIS7 禁止目录运行脚本
早晨看博客说有人被黑了:http://www.cnblogs.com/sanshi/p/3150639.html 看回复建议禁用上传目录的脚本运行权限 在IIS6上还是比较容易的,直接右键--属性,把 ...
- C:\WINDOWS\WinSxS目录介绍,来自百度词条
C:\WINDOWS\WinSxS目录介绍,来自百度词条 来源:重庆沙坪坝区网吧联盟 发表时间:2010-08-16 03:22 查看:9次 WinSxS是Windows目录下一个 ...
- 我的一个学生在运维工作中写的自动日志清理脚本程序
本文是我的一个学生在运维工作中写的自动日志清理脚本程序,我这里不评价该shell脚本写的好与坏,只是发出来,和大家做一个分享,如果能给大家带来一点点思路上的参考就够了. 自动日志清理脚本程序 #!/b ...
- Centos7搭建Java环境,并设置项目自启动脚本、定时数据库备份/日志清理脚本
开发环境下载,提供nginx-1.12.2.jdk-8u162.Jenkins下载 建个文件夹,作为开发环境存放路径 cd /usr mkdir developmentEnvironment cd / ...
- ES索引清理脚本-总结
ES索引清理脚本-总结 之前写过一个日格式的索引清理脚本,目前所在公司用的是「周」格式清理,所以再更新一下 前言 脚本流程:通过时间匹配历史索引 -> 记录到文件 -> 按照记录文件清理 ...
- linux脚本遍历目录,shell脚本递归遍历目录及子目录的例子分享
用shell写的递归遍历目录的脚本,脚本实现递归遍历指定目录,打印目录下的文件名. 实例1: 复制代码 代码如下: #!/bin/sh function scandir() { local cur_d ...
- linux下清理脚本,linux通用清理脚本
下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. #!/bin/sh ########################### #delete ...
- Cadence文件结构及清理脚本
Cadence文件结构及清理脚本 Cadence文件结构 硬件文件夹 PRO_NAME_HW_LOG HW_REV0.0.0 Cadence文件清理脚本 脚本使用 注意事项 Cadence文件结构 P ...
最新文章
- 【redis】c/c++操作redis(对于hiredis的封装)
- 植物大战僵尸食人花无cd逆向分析
- 数据结构(二)之算法基础
- leetcode数组汇总_LeetCode刷题实战43:字符串相乘
- idea 父文件_在ideal创建新的模块(子项目,同时依赖父模块)
- 减去字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)
- mysql not in优化_98%的人不知道的MySQL优化器原理
- 积分墙为什么要做反作弊
- cad等比例缩放快捷键_终于领会CAD缩放(放大与缩小)快捷键
- python讲师陈越_浙大陈越老师数据结构课件
- 微信小程序的wx:for和vue的v-for
- 微信公众号开发【一】 菜单获取与设置
- 虚拟直播需要哪些设备?如何搭建虚拟直播团队?
- 《小目标目标检测的解决方法及方式》
- https://vkceyugu.cdn.bspapp.com/VKCEYUGU-5e444e88-b038-4060-8096-b66a1ee2f304/e7274947-16bb-444a-ae8
- Win10安装Selenium+Chrome+ChromeDriver(应用代码无需设置路径)
- CC2530基础实验:(1)按键控制LED跑马灯
- 我心中的计算机作文500,我眼中的作文500字
- 【笔记】什么是质数?
- SEO 优化,网站推广优化教程100条(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)...
热门文章
- 百度地图JavaScript API 学习之浏览器定位
- 调用百度地图出现的自动创建完成对象会清空输入框值的问题
- npm run serve命令出错:semi错误: 6:35 error Extra semicolon semi 7:46 error Extra semicolon semi
- 什么是域(domain)
- mysql查询面试_mysql查询面试一
- 新 Mac 到手,程序员应当做的配置
- 区块链的性能该如何衡量?
- 强力推荐Linux下的五大BT下载工具
- 机器人植入情感芯片利与弊_专家警告:机器人应该植入芯片以防谋杀人类
- 使用阿里云搭建WordPress博客