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

第一题:
(没有考虑特殊文件夹或者权限限制的情况)

修改时间:2013-08-08
改善问题:1、遇到含有%、! 的符号出错
             2、for /f + 'dir'效率低,改为了for /D
  1. @echo off
  2. set target=x:\bathome
  3. if exist %target% (
  4.     cd /d %target%\
  5.     call :subfolder
  6.     cd ..
  7.     rd %target%
  8. ) else (
  9.     echo %target% 目录不存在
  10. )
  11. pause
  12. exit
  13. :subfolder
  14.   echo %cd%
  15.   del *.* /a /f /q
  16.   for /D %%i in (*.*) do (
  17.       cd "%%~fi"
  18.       call :subfolder
  19.       cd ..
  20.       rd "%%~fi"
  21.   )
  22.   goto :eof
  23.   
复制代码
第三题,
修改时间:2013-07-27
改善问题:1、支持%、! 等字符
             2、减少call,提速
             3、net user 在遇到 " 时需要用\"转义。

每一组出现的次数是随机的(在至少出现一次的基础上),每一组出现的位置是随机的。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set t=%time%
  4. set S1=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  5. set S2=abcdefghijklmnopqrstuvwxyz
  6. set S3=0123456789
  7. rem       V    V V V              V    V V
  8. set "S4=~`^!@#$%%^^^&*()_+-={}[]|\:^";'^<^>,.?/"
  9. set /a N1=26,N2=26,N3=10,N4=32
  10. set /a i=0
  11. :LP
  12.     set "Series="
  13.     set "Code="
  14.     rem [1-4]是4个必须的组元素,4以上随机选组
  15.     for /l %%i in (1,1,8) do (
  16.         if %%i leq 4 (
  17.             set /a Who=%%i, R=!random! %% N%%i
  18.         ) else (
  19.             set /a Who=!random! %% 4 + 1
  20.             set /a R=!random! %% N!Who!
  21.         )
  22.         set Code[%%i]=!Who!_!R!
  23.     )
  24.     rem 从数组中随机提取元素,装载到SRand
  25.     rem 根据提取的个数,逐步缩小提取范围
  26.     set "SRand="
  27.     for /l %%a in (8,-1,1) do (
  28.         set /a R=!random! %% %%a + 1
  29.         for %%b in (!R!) do set SRand=!SRand! !Code[%%b]!
  30.         set Code[!R!]=!Code[%%a]!
  31.     )
  32.     if not defined EVER_%SRand: =% (
  33.         set EVER_%SRand: =%=exist
  34.         set /a i+=1
  35.         rem 编号转字符
  36.         for %%n in (%SRand%) do (
  37.             for /f "tokens=1,2 delims=_" %%a in ("%%n") do (
  38.                 set Series=!Series!!S%%a:~%%b,1!
  39.             )
  40.         )
  41.         set nnn=00!i!
  42.         set nnn=!nnn:~-3!
  43.         rem 设置密码如果出现双引号, 需要用\进行转义
  44.         rem net user Bathome!nnn! "!Series:"=\"!" /add 1>nul
  45.         echo 编号和密码:!nnn! !Series!
  46.     ) else (
  47.         rem  其实很少重复,走个过场。
  48.         echo 出现重复密码
  49.         goto :LP
  50.     )
  51.     if %i% lss 100 (
  52.         goto :LP
  53.     )
  54. echo %t% %time%
  55. pause
  56. exit
复制代码
编号和密码:090 Mb1BN49}
编号和密码:091 i9A8^2DU
编号和密码:092 bm6=:I1V
编号和密码:093 1G+iY2i3
编号和密码:094 nq"s|8rI
编号和密码:095 2[|8SmL1
编号和密码:096 kZf:6ST:
编号和密码:097 W&6?*b8f
编号和密码:098 6&4t_1P2
编号和密码:099 9e^7K>EV
编号和密码:100 C>%Qz1Q4



第八题   很长……
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a n=1, m=10
  4. for %%i in (壹 贰 叁 肆 伍 陆 柒 捌 玖 分 角 圆 拾 佰 仟 万) do (
  5.     if !n! leq 9 (
  6.         set /a C_%%i=n,n+=1
  7.     ) else (
  8.         set /a P_%%i=m,m-=1
  9.     )
  10. )
  11. set /a Code=0, Begin=0
  12. rem 读取文本/调用Deal转换数字
  13. for /f "tokens=*" %%a in ('type %0') do (
  14.     if !Begin! equ 1 (call :Deal %%a)
  15.     if "%%a"=="::Data" (set /a Begin=1)
  16. )
  17. rem 选择排序
  18. for /l %%a in (%Code%,-1,1) do (
  19.     set Ever=0000000000_000
  20.     for /l %%b in (1,1,%%a) do (
  21.        if !Ser[%%b]! gtr !Ever! (
  22.            set Ever=!Ser[%%b]!
  23.            set Num=%%b
  24.        )
  25.     )
  26.     set Ser[!Num!]=!Ser[%%a]!
  27.     set Ser[%%a]=!Ever!
  28. )
  29. for /l %%a in (1,1,%Code%) do (
  30.     for %%b in (!Ser[%%a]!) do echo !SRC_%%b!
  31. )
  32. pause
  33. exit
  34. :Deal
  35.     set Say=%1
  36.     set Ser=0000000000
  37.     set Say=%Say:整=%
  38.     set Say=%Say:零=%
  39.     set /a i=0,Cut=0,Code+=1
  40.     for /l %%a in (0,1,25) do (
  41.         set z=!Say:~-1,1!
  42.         set Say=!Say:~,-1!
  43.         if defined P_!z! (
  44.             set /a Site=P_!z!-Cut
  45.             if "!z!"=="万" (set Cut=4)
  46.         ) else (
  47.             set /a Num=C_!z!,SiteA=Site-1
  48.             for /f "tokens=1,2" %%i in ("!Site! !SiteA!") do (
  49.                 set Ser=!Ser:~0,%%j!!Num!!Ser:~%%i!
  50.             )
  51.         )
  52.         if "!Say!"=="" (goto :next)
  53.     )
  54.     :next
  55.     set NNN=000%Code%
  56.     rem NNN后缀用来确保相同的数额能够在排序中保留
  57.     set Ser[%Code%]=%Ser%_!NNN:~-3!
  58.     set SRC_%Ser%_!NNN:~-3!=%1
  59.     goto :eof
  60. ::Data
  61. 陆拾叁万贰仟伍佰肆拾叁圆叁角整
  62. 伍万圆整
  63. 捌万零肆佰圆伍角叁分
  64. 壹佰圆整
  65. 贰佰万叁仟贰佰陆拾陆圆零叁分
  66. 柒佰柒拾万零捌拾叁圆整
  67. 叁万圆肆角肆分
  68. 壹圆整
复制代码
第九题
最后修改: 8月19日
基本上在遇到含有%%!! () & 符号的文件、文件夹时不会出错。不过效率很低。
如果多个目录相同,比如,A=B=C  可以并排列出。而不是A=B,B=C,A=C分别列出。
  1. ::Find the same directory
  2. ::     by 523066680
  3. ::2013-08-19
  4. @echo off
  5. :init
  6.     set MainDir=%cd%\
  7.     set MainDir=%MainDir:\\=\%
  8.     set text="%MainDir%F_Record.txt"
  9.     set Ra="%MainDir%FileRa.txt"
  10.     set Rb="%MainDir%FileRb.txt"
  11.     type nul>%text%
  12.     set t=%time%
  13.     set /a rept=1
  14.     rem list = 0 输出结果不列出文件列表
  15.     rem list = 1 列出文件数量、大小
  16.     rem list = 2 列出文件列表和数量、大小
  17.     set list=1
  18.     rem confrim = 1 or 0 : 决定是否核对文件大小
  19.     set confirm=1
  20.     echo Current Directory: "%MainDir%"
  21.     if %confirm% equ 0 (
  22.         set "ext="
  23.         set "arg=/b"
  24.         set "filter="
  25.         set filt2="字节"
  26.     ) else (
  27.         set "ext=%%~za"
  28.         set "arg=/w"
  29.         set "filter=|more +5 |find /v " 可用字节""
  30.         set filt2=" 可用字节"
  31.     )
  32. :deal
  33.     for /r "%MainDir%" %%a in (.) do (
  34.         if "%%a"=="%MainDir%%%~nxa\." echo "%%a"
  35.         cd "%%a"
  36.         call :next
  37.     )
  38.     echo 处理结果:
  39.     rem 对搜集的数据汇总输出
  40.     set /a rept-=1
  41.     if %rept% equ 0 (
  42.         set /p inp=没有找到重复文件夹<nul
  43.         pause >nul
  44.         exit
  45.     )
  46.     for /l %%a in (1,1,%rept%) do (
  47.         for /f "tokens=2 delims=?" %%b in ('set SAME_[%%a]') do (
  48.             echo %%b
  49.             echo %%b >>%text%
  50.             set "last=%%b"
  51.             if "%confirm%%list%"=="01" (dir /w %%b |find " 个文件" >>%text%)
  52.             if "%confirm%%list%"=="02" (
  53.                 dir /w %%b |more +5 |find /v " 个目录" >>%text%
  54.             )
  55.         )
  56.         if "%confirm%%list%"=="11" (
  57.             call dir /w %%last%% |find " 个文件" >>%text%
  58.         )
  59.         if "%confirm%%list%"=="12" (
  60.             call dir /w %%last%% |more +5 |find /v " 个目录" >>%text%
  61.         )
  62.         echo,>>%text%
  63.     )
  64.     cd %MainDir%
  65.     echo 清理临时文件FileRa.txt FileRb.txt
  66.     if exist %Ra% del %Ra% %Rb%
  67.     echo 前后时间: %t% %time%
  68.     pause
  69.     exit
  70. :next
  71.     set str=_
  72.     rem 文件名单
  73.     rem 有短名则使用短名,避免"="造成的变量赋值、判断问题
  74.     for /f "tokens=4" %%a in ('dir /a /x ^|more +7 ^|find "-"') do (
  75.         (
  76.           call set "str=%%str%%_%%a_%ext%" 2>nul
  77.         ) || (
  78.           goto :out
  79.         )
  80.     )
  81.     rem 空目录跳过
  82.     if "%str%"=="_" (goto :eof)
  83.     :out
  84.     rem 不管字符串是否超载,都进行截取。
  85.     set "str=%str:~0,3000%"
  86.     set "str=%str: =#%"
  87.     set "str=%str:,=#%"
  88.     set "str=%str:&=#%"
  89.     if not defined Def_%str% (
  90.         call set "Def_%%str%%=%%cd%%"
  91.     ) else (
  92.         rem 做进一步确认:
  93.         rem 原因1、变量记录的有限数据,作为初步判断
  94.         rem 原因2、相似的文件名可以产生相同的短名
  95.         call dir %arg% "%%Def_%str%%%" %filter% >%Ra%
  96.         dir %arg% "%cd%" %filter% >%Rb%
  97.         (
  98.           fc %Ra% %Rb% >nul && (
  99.               rem Same Folder
  100.               call :record
  101.           )
  102.         ) || (
  103.           rem echo 在疑似重复的目录中找到异同
  104.         )
  105.     )
  106.     goto :eof
  107. :record
  108.     if not defined REPT_%str% (
  109.         set "REPT_%str%=%rept%"
  110.         set "COF_%str%=2"
  111.         call set SAME_[%rept%][1]=?"%%Def_%str%%%"
  112.         set SAME_[%rept%][2]=?"%cd%"
  113.         set /a rept+=1
  114.     ) else (
  115.         call set /a "COF=%%COF_%str%%%+1"
  116.         call set "COF_%str%=%%COF%%"
  117.         call set "SAME_[%%REPT_%str%%%][%%COF_%str%%%]=?"%%cd%%""
  118.     )
  119.     goto :eof
复制代码
检查D盘耗时差不多1小时。

confirm=1  list=1  详细对比并列出文件数量大小

"D:\me\IF_Batch\目录、文件操作\FindSameFolder\错误实例\复件 (2) a"
"D:\me\IF_Batch\目录、文件操作\FindSameFolder\错误实例\复件 a"
               2 个文件          1,404 字节

"D:\me\IF_Batch\目录、文件操作\FindSameFolder\错误实例\ftest"
"D:\me\IF_Batch\目录、文件操作\FindSameFolder\错误实例\复件 ftest"
               1 个文件              0 字节



confirm=0  list=1   仅对比文件名、列出文件大小
(这个时候是分开列出文件大小的,增加了一个文件夹做测试)

"D:\me\IF_Batch\目录、文件操作\FindSameFolder\大小不同的例子\CA"
               1 个文件              6 字节
"D:\me\IF_Batch\目录、文件操作\FindSameFolder\大小不同的例子\CB"
               1 个文件              3 字节

"D:\me\IF_Batch\目录、文件操作\FindSameFolder\错误实例\复件 (2) a"
               2 个文件          1,404 字节
"D:\me\IF_Batch\目录、文件操作\FindSameFolder\错误实例\复件 a"
               2 个文件          1,404 字节

"D:\me\IF_Batch\目录、文件操作\FindSameFolder\错误实例\ftest"
               1 个文件              0 字节
"D:\me\IF_Batch\目录、文件操作\FindSameFolder\错误实例\复件 ftest"
               1 个文件              0 字节


虽然不想用批处理做第九题。
没有以前那么能折腾了,做出来还是效率又低问题依旧。。。
附件,内有备注明一些错误情况。
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

总感觉第五的位置公示一周是很郁闷的事情
4 和6 你们怎么看?

TOP

返回列表