zoukankan      html  css  js  c++  java
  • win7 winsxs精简 cmd 脚本之 再次 改进版

    dos时代菜鸟发表于 2012-7-24
    http://bbs.wuyou.net/forum.php?mod=viewthread&tid=255200&highlight=win7%2B%BE%AB%BC%F2
    网上传播 的 所谓  用于 win7 winsxs精简的  cmd 脚本,我 进行了 改进 。大家帮忙 测试 下 吧 。


    @echo off
    SETLOCAL ENABLEDELAYEDEXPANSION
    title 清理WIN7 WINSXS重复文件 ver.5.3
    COLOR 0A
    set startT=%TIME%
    set move_dir=%SystemRoot%winsxs_del
    set df=0&& set df1=0&& set nf=0
    if not exist %move_dir% ul md %move_dir%
    set log=%temp%winsxs-clear.log
    pushd "%SystemRoot%winsxs"
    echo ===================== Start... %startT% ============================ >> "%log%"
    FOR /F "delims=" %%a in ('dir /ad /b /o-n %SystemRoot%winsxs*.*') do (
    set /a nf+=1
    if exist "%SystemRoot%winsxs\%%a" call:fnDoClear "%%a"
    )
    echo ===================== OK... %DATE% %TIME% (%df1%/%df%/%nf%)================= >> "%log%"
    echo 清理完毕. %startT% - %TIME%. %log%.
    echo 文件已经被移至 %move_dir%. (%df1%/%df%/%nf%)
    for %%c in (startt move_dir log df df1 nf) do set %%c=
    popd
    pause>nul
    goto :EOF

    :fnDoClear
    call:fnSplitName %1
    if not "%f_name%"=="" call:fnDoClearDir %1 !f_type! !f_name! !f_id! !f_rev! !f_lang! !f_sign!
    goto :EOF

    :fnSplitName
    for %%c in (f_type f_name f_id f_rev f_lang f_sign) do set %%c=
    SET L=%~1
    SET /A M=0
    :LOOP1
    SET L2=%L:~-1,1%
    SET L=%L:~0,-1%
    IF "%L2%"=="_" (
    SET /A M+=1
    IF "%M%"=="3" (
    FOR /F "delims=_ tokens=1*" %%C IN ("%L%") DO (
    SET f_name=%%D
    set f_type=%%C)
    set f_id=%l1%)
    if "%m%"=="0" set f_sign=%l1%
    if "%m%"=="1" set f_lang=%l1%
    if "%m%"=="2" set f_rev=%l1%
    set l1=
    ) else ( set l1=%L2%%l1%)
    IF "%L%"=="" GOTO END1
    GOTO LOOP1
    :END1
    for %%c in (l l1 l2) do set %%c=
    if %m% lss 5 set f_name=
    goto :EOF
    :fnDoClearDir
    call:fnStdVer %5
    set curorgver=%5
    set curver=%R_STDVER%
    set cursign=%7
    set R_STDVER=
    set newver=
    set neworgver=
    set newsign=
    FOR /F "delims=" %%a in ('dir /ad /o-n /b %2_%3_%4_*_%6_*') do (
    call:fnSplitName %%a
    if not "%f_name%"=="" call:fnCompVer "!newver!" !f_rev! !f_sign!
    )
    if "%newver%"=="" goto :EOF
    echo ------%nf%# !f_type! !f_name! !neworgver! !newsign! ---
    echo ------%nf%# !f_type! !f_name! !neworgver! !newsign! --->>"%log%"
    FOR /F "delims=" %%a in ('dir /ad /o-n /b %2_%3_%4_*_%6_*') do (
    call:fnSplitName %%a
    if not "!f_name!"=="" (
    if "!neworgver!"=="!f_rev!" (
    if "!newsign!"=="!f_sign!" (
    echo 保留 %%a
    echo 保留 %%a >> "%log%"
    ) else ( call:fnDelDir "%%a")
    ) else ( call:fnDelDir "%%a")
    )
    )
    echo ============================================================================
    echo ============================================================================>>"%log%"
    goto :EOF

    :fnCompVer
    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
    FOR /F "eol=; tokens=1-10 delims=." %%v in ("%~1") do call:fnStdVerImpl %%v %%w %%x %%y %%z
    goto :EOF

    :fnStdVerImpl
    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
    set /a df+=1
    takeown /r /f "%SystemRoot%winsxs\%~1" >nul 2>nul
    cacls "%SystemRoot%winsxs\%~1" /t /e /g everyone:f >nul 2>nul
    move "%SystemRoot%winsxs\%~1" "%move_dir%\%~1" >nul 2>nul
    if not ERRORLEVEL 1 (
    echo ...%df%# 成功移除 %1
    echo ...%df%# 成功移除 %1>> "%log%"
    set /a df1+=1
    ) else (
    echo ...%df%# 未能移除 %1
    echo ...%df%# 未能移除 %1>> "%log%"
    )
    goto :EOF

    主要  改进 :
    1、用  dir /ad /b /o-n 代替 dir /ad /o-n 可以节省 判断 <DIR> 的语句条目
    2、改进 名称  split 段 内容,适合 更多情况
    3、改进 删除文件 的 条件判断 ,使其 更合理。
         当确定 一个文件的 文件名 版本 签名 以后 , 原有 判断条件 是版本+签名同时与 要保留的 文件 不同的时候 才 删除。
         改进为  版本 或 签名 其一不同就 删掉。
    4、增加 项目计数


    另外 原版本中如下语句不明 何意
    set mxms=a   
    if not "!mxms!" == "a" set mxms=&&%comspec% /V:ON /C %0 %* && goto :EOF   
    set mxms=

  • 相关阅读:
    CodeForces
    CodeForces
    CodeForces
    【模板】POJ-1511(dijkstra堆优化+链式前向星)
    【模板】POJ-1502(dijkstra)
    P2862 [USACO06JAN]Corral the Cows G
    P2495 [SDOI2011]消耗战
    CF613D Kingdom and its Cities
    P4655 [CEOI2017]Building Bridges
    P3917 异或序列
  • 原文地址:https://www.cnblogs.com/liuzhaoyzz/p/6136250.html
Copyright © 2011-2022 走看看