[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] 优化winsxs目录的BAT如何避免文件名或扩展名太长的错误

本帖最后由 CrLf 于 2011-12-2 15:34 编辑

求达人修改优化winsxs目录的BAT
代码如下:
  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. set ver_prefix=%winver:~0,-1%
  11. echo list winsxs finished! now ready to clear duplicated files
  12. echo dir /ad %SystemRoot%\winsxs\*_%ver_prefix%*
  13. if "%1" == "run-winsxs-generated" goto :lSkipGen
  14. rem 准备生成代码
  15. copy /y "%~f0" "%temp%\%~nx0" > nul
  16. echo rem genereted code here >> "%temp%\%~nx0"
  17. echo :ldcdStat1 >> "%temp%\%~nx0"
  18. echo set end4=%%arg:%ver_prefix%=%%>> "%temp%\%~nx0"
  19. echo goto ldcdStat2 >> "%temp%\%~nx0"
  20. echo :ldcdStat3 >> "%temp%\%~nx0"
  21. echo set end4a=%%arg:%winver%=%%>> "%temp%\%~nx0"
  22. echo goto ldcdStat4 >> "%temp%\%~nx0"
  23. rem notepad "%temp%\%~nx0"
  24. "%temp%\%~nx0" run-winsxs-generated
  25. goto :EOF
  26. :lSkipGen
  27. FOR /F "eol=; tokens=1-4 delims= " %%a in ('dir /ad %SystemRoot%\winsxs\*_%ver_prefix%*') do (
  28.     if "%%c" == "<DIR>" call:fnDoClear %%d
  29. )
  30. echo clear OK!
  31. goto :EOF
  32. :enover
  33. echo could not get windows version, abort!
  34. goto :EOF
  35. :enosxs
  36. echo not found %SystemRoot%\winsxs! maybe no privilege or lower windows!
  37. echo only support windows XP and later!
  38. goto :EOF
  39. :fnDoClear
  40. rem arg: dir_name
  41. 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
  42. goto :EOF
  43. :fnDoClearDir
  44. rem arg: dir_name dir_parts
  45. set d_name=%1
  46. rem 检查参数是否匹配 %winver%, 先跳过前两个.同时准备组合新版本匹配名称,nv1存当前版本,nv2存当前的前一个版本
  47. set nv1=%2_%3_
  48. set nv2=%2_%3_
  49. :ldcdCycle
  50. if "%4" == "" goto :EOF
  51. rem 检查是否 ver_prefix 开头,如果是则继续检查是否winver,如果不是winver则表示目标存在
  52. set arg=%4
  53. rem set line=set end4=%%arg:%ver_prefix%=%%
  54. rem %line%
  55. goto ldcdStat1
  56. :ldcdStat2
  57. if "%arg%" == "%end4%" goto ldcdNext
  58. rem 检查是否 winver 开头
  59. rem set line=set end4a=%%arg:%winver%=%%
  60. rem %line%
  61. goto ldcdStat3
  62. :ldcdStat4
  63. if not "%arg%" == "%end4a%" goto :EOF
  64. rem 至此则为 ver_prefix 开头 且 不等于 winver 的目录名,检查最新版本是否存在,存在则可删除旧的
  65. set newfound=false
  66. for /d %%v in ("%SystemRoot%\winsxs\%nv1%%winver%.*_%5_*") do (
  67.     if exist %%v\nul set newfound=true
  68. )   
  69. if "%newfound%" == "true" call:fnDelDir %d_name%
  70. goto :EOF
  71. :ldcdNext
  72. set nv2=%nv1%
  73. set nv1=%nv2%%4_
  74. shift
  75. goto ldcdCycle
  76. :fnDelDir
  77. rem arg: dir
  78. echo del %SystemRoot%\winsxs\%1
  79. takeown /r /f "%SystemRoot%\winsxs\%1"
  80. cacls "%SystemRoot%\winsxs\%1" /t /e /g everyone:f
  81. move "%SystemRoot%\winsxs\%1" "%move_dir%\%1"
  82. goto :EOF
复制代码
问题:
有不少这样的错误:
处理的目录: C:\Windows\winsxs\msil_system.web.security..glesignon.resources_31bf
3856ad364e35_6.0.6001.18000_zh-cn_0a8560c79d0de78e
处理的文件: C:\Windows\winsxs\msil_system.web.security..glesignon.resources_31bf
3856ad364e35_6.0.6001.18000_zh-cn_0a8560c79d0de78e\System.Web.Security.SingleSig
nOn.Resources.dll
文件名或扩展名太长。
移动了  0 个目录。

用dir /x命令获取短名,这样可以吗?

TOP

用dir /x命令获取短名,这样可以吗?
awk 发表于 2011-12-2 23:44

代码是网络上找的,本人不会命令呀,只是报下错。可否帮改下我可以帮测试,谢谢

TOP

返回列表