标题: [其他] 2013年度批处理之家BAT编程比赛 [打印本页]
作者: Batcher 时间: 2013-7-19 10:39 标题: 2013年度批处理之家BAT编程比赛
用户ID | 排名 | 奖励 | 发奖 |
apang | 1 | 赠送价值200元的礼品 | 2013-09-15 已经发奖 |
terse | 2 | 赠送价值100元的礼品 | 2013-09-15 已经发奖 |
wankoilz | 3 | 赠送价值100元的礼品 | 2013-09-15 已经发奖 |
xxpinqz | 4 | 赠送价值50元的礼品 | |
523066680 | 5 | 赠送价值50元的礼品 | |
ShadowFiend | 6 | 赠送价值50元的礼品 | 2013-09-17 已经发奖 |
本次比赛只允许使用BAT和XP系统自带的命令行工具,不允许调用 mshta、VBS、PowerShell、JS 等其它脚本和第三方命令行工具(特别注明的个别题目除外)。
参赛时间:
2013-07-19 ~ 2013-08-19
奖项设置:
一等奖:1名,赠送价值200元的礼品
二等奖:2名,赠送价值100元的礼品
三等奖:3名,赠送价值50元的礼品
评分规则:
每个题目30分,其中功能性能占20分,代码规范占10分。
对于总得分相同的用户,以提交答案的时间先后顺序排名。
比赛题目:
1、删除文件夹 D:\BatHome
注意:
(1)该文件夹下面包含文件和子文件夹
(2)可以使用 rd 或 rmdir 命令,但是不允许使用它们的 /s 选项
(3)需要在程序中模拟 rd /s 的递归删除功能
2、检查系统里面是否有非法增加和减少的用户账号
注意:
(1)假设文件 D:\BatHome_User_List.txt 里面保存着所有的合法用户的列表
(2)需要分别找出当前系统里面非法增加的账号和减少的账号
3、批量创建100个系统账号 BatHome001 ~ BatHome100
注意:
(1)每个密码都是一个8位随机字符串,只要包含一个大写字母、一个小写字母、一个数字、一个特殊字符
(2)特殊字符是指除了数字和大小写字母之外的其它字符
(3)不能有重复的密码
4、把系统目前运行的情况记录到文件 D:\BatHome_OS.txt
包括:
(1)物理内存总量是多少(以GB为单位)?目前使用率是多少?
(2)硬盘每个分区的总容量和使用率分别是多少(以GB为单位)?
(3)最近一次开机之后系统已连续运行多长时间(以秒为单位)?
5、把文件夹 D:\www.bathome 下面的文件和子文件夹备份到 D:\bbs.bathome 下面
注意:
(1)备份的时候跳过以下子文件夹:
logs
img
(2)备份的时候跳过以下文件:
*.zip
*.bak
(3)周一到周六执行增量备份,周日执行完整备份。
6、计算任意两数值的商,要求精确到小数点后100位(没有100位的补足100位)。
7、批量下载壁纸
注意:
(1)下载桌酷网站(http://www.zhuoku.com/)的壁纸,输入一个系列图片的网址,然后自动把这个系列的图片全部下载下来。
(2)能使用常用的几个第三方下载工具
8、将大写的中文数字金额排序
注意:
(1)数值小于一千万元,最小单位为分
(2)中文数字与阿拉伯数字的对应规则参考:http://baike.baidu.com/view/1624026.htm
(3)大写的中文数字金额可以用下表做测试:
陆拾叁万贰仟伍佰肆拾叁圆叁角整
伍万圆整
捌万零肆佰圆伍角叁分
壹佰圆整
贰佰万叁仟贰佰陆拾陆圆零叁分
柒佰柒拾万零捌拾叁圆整
叁万圆肆角肆分
壹圆整
9、把F盘中存在重复情况的目录列举出来
注意:
(1)只要文件夹中的文件列表相同,就认为是重复的文件夹,不需要判断大小、日期、md5等。例如:
F:\PIC\SELECT\ANDROID
001.jpg
002.jpg
003.jpg
004.jpg
005.jpg
LOGO.jpg
F:\Backup\picture\2013-03-03\ANDROID
001.jpg
002.jpg
003.jpg
004.jpg
005.jpg
LOGO.jpg
F:\Rogar\Userfiles\temp\picture
001.jpg
002.jpg
003.jpg
004.jpg
005.jpg
LOGO.jpg
10、将网上下载的txt文本转成html文件以便阅读
注意:
(1)保留txt中的换行格式(在html中加入</br>单标签来实现)
(2)因txt文本中每行前没有空格,请在转化时在行前加入四个半角空格(在html中 为一个半角空格)
(3)遇文本中形如“第一章 我们的宇宙图像”的单行即为段落分隔处,请在前面加入一空行(请考虑尽可能多的章节的书写情况)
(4)抛弃文本中形如“图1.2”的单行(请考虑.前后数值不仅仅为个位的情况)
(5)因为文本可能会含有特殊字符,代码应做特殊字符处理
(6)提示:请注意html文件的基本元素<html><body>标签的加入
(7)附件中的文件仅供测试
[attach]6578[/attach]
作者: terse 时间: 2013-7-19 12:05
本帖最后由 terse 于 2013-9-18 19:03 编辑
第一题 不知道符合不- @echo off
- del /f /s /q "D:\BatHome" >nul
- for /f "delims=" %%i in ('dir /ad /b /s "D:\BatHome" ^|sort /r') do rd "%%i"
- rd "D:\BatHome"
- pause
复制代码
第二题 比较一下 wmic wmic 虽然取名方便 对比效率还是不行 所以还是这样处理了- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (D:\BatHome_User_List.txt) do set "$%%a=a"
- (for /f "skip=4 delims=" %%i in ('net user') do (
- if defined str (
- for /l %%j in (0 25 50) do (
- for /f "tokens=*" %%a in ("!str:~%%j,25!") do (
- if not defined $%%~nxa echo %%~nxa
- set #%%~nxa=a
- )
- )
- )
- set "str=%%i"
- ))>增加的用户.txt
- (for /f "tokens=*" %%a in (D:\BatHome_User_List.txt) do if not defined #%%~nxa echo %%~nxa)>减少的用户.txt
- pause
复制代码
上面账户名不含空格和特殊字符的 可以简化下- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (D:\BatHome_User_List.txt) do set "$%%a=a"
- (for /f "skip=4 delims=" %%i in ('net user') do (
- for %%j in (!str!) do (
- if not defined $%%~nxj echo %%~nxj
- set #%%~nxj=a
- )
- set "str=%%i"
- ))>增加的用户.txt
- (for /f "tokens=*" %%a in (D:\BatHome_User_List.txt) do if not defined #%%~nxa echo %%~nxa)>减少的用户.txt
- pause
复制代码
第三题 偷点懒了 写着写着 代码怎么这么长 总想着在一个FOR里完成 不过效率还好 还应该算随机了
发现还是有重复 现在还没时间修改
换个随机性强点- @echo off
- set "code1=0123456789"
- set "code2=abcdefghijklmnopqrstuvwxyz"
- set "code3=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- set "code4=`~!@$^&*()-\+|{}[];'<>,.?/"
- set /a num=1000
- setlocal enabledelayedexpansion
- for /L %%i in (0,1,9) do set #%%i=!code1:~%%i,1!&set #####%%i#=1&set "arr=!arr!#####%%i#"
- for /L %%i in (2,1,5) do (
- set s%%i=
- for /L %%j in (1,1,%%i) do set s%%i=1!s%%i!
- for /L %%j in (%%i,1,9) do set s%%i=!s%%i!0
- set s%%i=!s%%i!
- set /a n=10,i=j=1
- for /L %%j in (1,1,%%i) do set /a i*=n,j*=%%j,n-=1
- set /a lena_%%i=i/j,lenb_%%i=lena_%%i-22
- )
- for /L %%i in (2,1,5) do (
- set var=
- for /L %%a in (1,1,!lena_%%i!) do (
- set "s=#####"
- for /l %%b in (0 1 9) do if "!s%%i:~%%b,1!" == "1" set "s=!s!!#%%b!"
- for /f %%b in ("0!s%%i:10= !") do set "t=%%b"
- set "s%%i=!t:0=!!t:1=!1!s%%i:*10=!"
- set var=!var!!s:~-6!#
- )
-
- for /L %%a in (!lena_%%i!,-1,!lenb_%%i!) do (
- set /a "n=!random!%%%%a*7"
- for %%b in (!n!) do set "s=!var:~%%b,7!"
- for %%b in (!s!) do set var=!var:%%b=!
- set "arr=!arr!!s!"
- set "!s!=%%i"
- )
- )
- for /L %%i in (102,-1,3) do (
- set /a "n=!random!%%%%i*7,num+=1"
- for %%j in (!n!) do set "s=!arr:~%%j,7!"
- for %%j in (!s!) do set arr=!arr:%%j=!&set n1=!%%j!
- set /a "n2=!random!%%(6-n1)+1,n3=!random!%%(7-n1-n2)+1,n4=8-n1-n2-n3"
- set s=!s:#=!
- for /L %%a in (2,1,4) do (
- for /L %%b in (1,1,!n%%a!) do (
- set /a m=!random!%%26,r=!random!%%n1,n1+=1
- for /f "tokens=1,2" %%c in ("!m! !r!") do set s=!s:~%%d!!code%%a:~%%c,1!!s:~,%%d!
- )
- )
- net user BatHome!num:~1! !s! /add 2>nul
- )
- pause
复制代码
第四题 这里处理成百分比吗- @echo off&setlocal enabledelayedexpansion
- set "wmi=LastBootUpTime,LocalDateTime,TotalVisibleMemorySize,FreePhysicalMemory"
- for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
- (
- for /f "skip=1 tokens=1-4" %%i in ('"wmic os get %wmi%"') do for %%j in (%%j) do (
- set "ymd=%%j"
- set /a "m=(1!ymd:~4,2!+5)%%12+4,y=!ymd:~,4!-m/14,d=1!ymd:~6,2!-100,h=1!ymd:~8,2!-100"
- set /a "s=1461*y/4+153*m/5+d"
- set /a "s1=h*3600+(1!ymd:~10,2!-100)*60+1!ymd:~12,2!-100"
- set "ymd=%%k"
- set /a "m=(1!ymd:~4,2!+5)%%12+4,y=!ymd:~,4!-m/14,d=1!ymd:~6,2!-100,h=1!ymd:~8,2!-100"
- set /a "s=(1461*y/4+153*m/5+d-s)*86400-s1,s+=h*3600+(1!ymd:~10,2!-100)*60+1!ymd:~12,2!-100"
- set size=%%l
- set /a "useb=%%l-%%i,usebp=useb*100/%%l"
- for %%a in (size useb) do (
- set mod=!%%a!
- for /l %%b in (1 1 3) do (
- set/a "Qent=mod/1048576,mod=mod%%1048576*10"
- set "%%a_g=!%%a_g!!Qent!"
- )
- )
- echo 物理内存: !size_g:~,-2!.!size_g:~-2! [GB]
- echo 已使用 : !useb_g:~,-2!.!useb_g:~-2! [GB]
- echo 使用率 : !usebp!%%
- echo 系统运行时间 : !s! 秒
- )
- echo 盘符%tab%总容量 %tab%已用空间%tab%可用空间%tab%使用率
- set "get=get DeviceID^,FreeSpace^,Size"
- for /f "skip=1 tokens=1-3" %%a in ('wmic logicaldisk where "drivetype='3'" !get!') do (
- for %%b in (%%b) do (
- set $Free=%%b&set "$size=%%c"
- for %%i in (size Free) do (
- set Qent=&set/a "mod=!$%%i:~,9!%%1048576,%%i=!$%%i:~,9!/1048576"
- if "!$%%i:~9!" neq "" (
- set "len=!$%%i:~9!876543210"
- set /a "len=!len:~8,1!,Qent=!mod!!$%%i:~9!/1048576"
- set Qent=00000000!Qent!
- for %%j in (!len!) do set Qent=!Qent:~-%%j!
- )
- set "%%i=!%%i!!Qent!"
- )
- set /a "Tree=Size-Free,Treep=Tree*100/Size"
- for %%i in (Size Tree Free) do (
- set $%%i=&set mod=!%%i!
- for /l %%j in (1 1 3) do (
- set/a "Qent=mod/1024,mod%%=1024"
- set mod=!mod!0
- set "$%%i=!$%%i!!Qent!"
- )
- )
- echo %%a%tab%!$size:~,-2!.!$size:~-2! [GB]%tab%!$Tree:~,-2!.!$Tree:~-2! [GB]%tab%!$Free:~,-2!.!$Free:~-2! [GB]%tab%!Treep! %%
- )
- )
- )>D:\BatHome_OS.txt
- pause
复制代码
第五题 : 此类问题不熟悉 胡凑一个了
今天网友一问题 提醒了我 可能这题遗漏了一个计划任务- @echo off
- for /f "skip=1" %%i in ('"wmic path Win32_LocalTime get DayOfWeek"') do for %%j in (%%i) do set "w=%%i"
- set /a "m=(w+6)%%7"
- set "bak1=D:\bbs.bathome\Week-Bak_%w%"
- for /L %%i in (0,1,%m%) do if exist "D:\bbs.bathome\Week-Bak_%%i\" set "bak2=D:\bbs.bathome\Week-Bak_%%i"
- if not defined bak2 set w=0
- (for %%i in (.zip .bak \logs\ \img\) do echo %%i)>EXCLUDE
- setlocal enabledelayedexpansion
- if %w% equ 0 (
- rd /s /q "!bak1!" 2>NUL
- xcopy "D:\www.bathome" "!bak1!" /E /H /R /I /Y /EXCLUDE:EXCLUDE >nul
- ) else (
- RD /S /Q "!bak1!" 2>NUL
- xcopy "!bak2!" "!bak1!" /E /H /R /I /Y >NUL
- (xcopy "D:\www.bathome" "!bak1!" /E /H /R /Y /I /D /EXCLUDE:EXCLUDE)>"!bak1!.log"
- )
- del EXCLUDE 2>NUL
- pause
复制代码
第六题
正好原来有个处理大数的 但不处理小数和负数
修改一下 一般测试过
第7行的 set "d=" 应该为 set "d=0" 唉 初始代码就这样 不知怎的改成空值了
修正- @echo off&setlocal enabledelayedexpansion
- REM 被除数 和 除数
- set str1=123.01
- set str2=-33.47
- rem 小数点后位数
- set u=100
- set "d=0"
- for %%i in (str1 str2) do if "!%%i:~,1!" == "-" set /a d+=1
- if %d% equ 1 (set "d=-") else set "d="
- set l=00000000&for /l %%i in (1 1 7) do set "l=!l!!l!"
- set "var=4096 2048 1024 512 256 128 64 32 16 8 4 2 1"
- for /l %%i in (1 1 2) do (
- set "s%%i=!str%%i:-=!"
- set "len%%i=0"
- for /F "tokens=2 delims=." %%a in ("!s%%i!") do (
- set s=%%a&set len%%i=1
- for %%b in (%var%) do if "!S:~%%b!" neq "" set/a len%%i+=%%b&set "S=!S:~%%b!"
- )
- set s%%i=!s%%i:.=!
- )
- set /a len=len1-len2
- if !len1! gtr !len2! (set "s2=!s2!!l:~,%len:-=%!") else set "s1=!s1!!l:~,%len:-=%!"
- for /l %%a in (1 1 2) do (
- for /f "tokens=* delims=0" %%i in ("!s%%a!") do set s=%%i&set "s%%a=0%%i"
- set len%%a=1
- for %%j in (%var%) do if "!S:~%%j!" neq "" set/a len%%a+=%%j&set "S=!S:~%%j!"
- )
- set sun=!l:~-%len2%,-%len1%!
- set /a len=len2+1
- if "!s1!" Lss "!s2!" (
- set s1=!s1:~1!
- if !len1! leq !len2! set sun=!sun!0
- set /a Len1-=1
- )
- set "s1=!s1!!l:~,%u%!"
- set "s=!s1:~,%len2%!"
- set "i=!l:~,7!!s2!"
- set /a Len_i=Len2+7,len1+=u
- if %u% leq 0 set "u="
- if !len1! geq !len2! (
- for /l %%i in (1 1 9) do (
- set "T=0"
- for /l %%j in (8 8 !Len_i!) do (
- set /a "T=1!i:~-%%j,8!*%%i+T"
- set Num%%i=!T:~-8!!Num%%i!&set /a "T=!T:~,-8!-%%i"
- )
- set "Num%%i=!T!!Num%%i!"
- set "Num%%i=!l:~,7!!Num%%i:~-%Len%!"
- )
- for /L %%a in (!len2! 1 !Len1!) do (
- set "s=!L!!s!!s1:~%%a,1!"
- set "s=!s:~-%Len%!"
- if "!s!" geq "!s2!" (
- set M=5&set "i=!l:~,7!!s!"
- if "!i!" geq "!Num5!" (
- for /l %%i in (6 1 9) do if "!i!" geq "!Num%%i!" set "M=%%i"
- ) else for /l %%i in (1 1 4) do if "!i!" geq "!Num%%i!" set "M=%%i"
- set sun=!sun!!M!&set s=&set T=0
- for %%i in (!M!) do (
- for /l %%j in (8 8 !Len_i!) do (
- set /a "T=3!i:~-%%j,8!-1!Num%%i:~-%%j,8!-!T:~,1!%%2"
- set "s=!T:~1!!s!"
- )
- )
- ) else set sun=!sun!0
- )
- if defined u (set "sun=%d%!sun:~,-%u%!.!sun:~-%u%!")else set sun=%d%!sun!
- ) else if defined u (set "sun=%d%0.!l:~,%u%!") else set sun=%d%0
- echo !str1! / !str2! = !sun!
- pause>nul
复制代码
第七题
不确定总系列 还是分类系列 增加个判断吧- @echo off
- Rem set /p "url=请输入地址:"
- Rem 测试地址1 风景壁纸
- Rem set "url=http://www.zhuoku.com/zhuomianbizhi/show/index-1.htm"
- Rem 测试地址2 风景壁纸之一 托斯卡纳草原 风光风景宽屏壁纸
- set "url=http://www.zhuoku.com/zhuomianbizhi/show-fengjingou/20130731145032.htm"
-
- set "seda=/value=index-/s/.* value=index-([0-9]+).*/\1/p"
- set "sedb=s#href=\x22| *class=#\nhttp://www.zhuoku.com#gp"
- set "sedc=/\"yema\"/s/.*>\[*([0-9]+)\]*<.*/\1/gp"
- set "sedd=/thunder_url/s#.*= *\"(http://.*\.jpg)\";.*#\1#p"
- set "wu=http://www.zhuoku.com"
- setlocal enabledelayedexpansion
- if "!url:/index-=!" neq "!url!" (
- for %%i in ("!url!") do set "wurl=!url:%%~nxi=!"
- for /f %%j in ('wget -q -O- !url! ^| sed -nr "!seda!"') do (
- (for /l %%j in (1 1 %%j) do echo !wurl:\=/!index-%%j.htm)>url.x
- wget -q -O- -i url.x | sed -nr "!sedb!" |sed -nr "s/\.htm\x22$//p" >url.y
- )
- ) else echo !url!|sed -nr "s/\.htm//p" >url.y
-
- (for /f "tokens=*" %%i in (url.y) do (
- for /f %%j in ('wget -q -O- "%%i(1).htm" ^| sed -nr "!sedc!"') do (
- for /l %%k in (1 1 %%j) do echo %%i(%%k^).htm
- )
- ))>url.x
-
- wget -q -O- -i url.x |sed -nr "!sedd!" >url.y
- wget -m -q -nH -np --referer="http://www.zhuoku.com" -i url.y
- del url.x url.y
- pause
复制代码
第八题 修改下 还是去掉临时文件了 效率相差不大- @echo off&setlocal enabledelayedexpansion
- %1(for /f "tokens=2" %%i in ('%~s0 Rem ^|sort') do echo %%i)&pause&exit
- set "t=零壹贰叁肆伍陆柒捌玖"
- set 仟=10&for %%i in (拾 佰) do set %%i=!仟!&set "仟=!仟!0"
- set 分=1&set "角=10"
- for /f %%a in (a.txt) do (
- set str=%%a
- for /l %%i in (1 1 9) do (
- for %%j in (!t:~%%i^,1!) do set "str=!str:%%j=%%i!"
- )
- for /f "tokens=1* delims=圆" %%i in ("!str:零=!") do (
- if "%%j" neq "" (
- set $a=%%i&set "$b=%%j"
- ) else set $a=0&set "$b=%%i"
- )
- for %%j in (角 分) do set "$b=!$b:%%j=*%%j+!"
- set /a $b=!$b!+100,$=0
- if "!$a!" == "!$a:万=!" (set i=1) else set i=10000
- for %%i in (!$a:万^= !) do (
- set "$a=%%i"
- for %%j in (拾 佰 仟) do set "$a=!$a:%%j=*%%j+!+0"
- set /a "$+=(!$a!)*i"
- set i=1
- )
- set $=00000000!$!.!$b:~-2!
- echo !$:~-11! %%a
- )
-
复制代码
第九题
最终用了 FC 比较 方案
这里取一个文件比较 多几个文件做比较 也许效率看提升点- @echo off
- SET PH=f:
- dir /s /a-d /o:n %PH% >dir_a.t
- (for /f "skip=2 tokens=*" %%i in (dir_a.t) do (
- set "str=%%i"
- setlocal enabledelayedexpansion
- if exist "!str:~,-4!\" (
- for /f "tokens=*" %%j in ("!str:~,-4!") do endlocal&set "files=%%j"
- ) else endlocal&for /f "tokens=1-3*" %%a in ("%%i") do if "%%b%%d" == "个文件字节" (
- setlocal enabledelayedexpansion
- for /f "tokens=1-3*" %%a in ("%%i") do echo !file!:%%a:!files!
- endlocal
- ) else set "file=%%d"
- ))>dir_b.t
- findstr /ibv ":" dir_b.t|sort >dir_a.t
- set /a i=n=1
- for /f "tokens=1-2* delims=:" %%a in (dir_a.t) do (
- set "str=%%a:%%b"
- setlocal enabledelayedexpansion
- if /i "!s!" neq "!str!" (
- if !i! gtr 1 set /a n+=1
- set i=1
- ) else set /a "i+=1"
- for /f "tokens=1,2" %%i in ("!n! !i!") do endlocal&set n=%%i&set i=%%j&set _%%i=%%j&set "%%i_%%j=%%c"
- set "s=%%a:%%b"
- )
- setlocal enabledelayedexpansion
- (for /l %%i in (1 1 %N%) do (
- for /l %%a in (1 1 !_%%i!) do (
- for /f "tokens=*" %%m in ("!%%i_%%a!") do (
- set /a i=%%a+1
- dir /b /a-d /on "!%%i_%%a!" >dir_a.t
- for /l %%b in (!i! 1 !_%%i!) do (
- for /f "tokens=*" %%n in ("!%%i_%%b!") do (
- dir /b /a-d /on "!%%i_%%b!" >dir_b.t
- fc /c dir_a.t dir_b.t>nul&&(
- for /f "tokens=*" %%o in ("!%%i_%%a!") do (
- echo !%%i_%%a!&type dir_a.t&echo;
- set %%i_%%a=
- )
- echo !%%i_%%b!&type dir_b.t&echo;
- set %%i_%%b=
- )
- )
- )
- )
- )
- ))>dir_list.txt
- del dir_a.t dir_b.t
- start "" dir_list.txt
- pause
复制代码
findstr 搜索 方案
相对FCf方案来说 FINDSTR 搜索字符有限制外 还有FINDSTR还有字符串搜索问题
用FIND 替换 FINDSTR 可以解决 但效率- @echo off
- SET PH=f:
- dir /s /a-d /o:n %PH% >dir_a.t
- (for /f "skip=2 tokens=*" %%i in (dir_a.t) do (
- set "str=%%i"
- setlocal enabledelayedexpansion
- if exist "!str:~,-4!\" (
- for /f "tokens=*" %%j in ("!str:~,-4!") do endlocal&set "files=%%j"
- ) else endlocal&for /f "tokens=1-3*" %%a in ("%%i") do if "%%b%%d" == "个文件字节" (
- setlocal enabledelayedexpansion
- for /f "tokens=1-3*" %%a in ("%%i") do echo !file!:%%a:!files!
- endlocal
- ) else set "file=%%d"
- ))>dir_b.t
- findstr /ibv ":" dir_b.t|sort >dir_a.t
- set /a i=n=1
- for /f "tokens=1-2* delims=:" %%a in (dir_a.t) do (
- set "str=%%a:%%b"
- setlocal enabledelayedexpansion
- if /i "!s!" neq "!str!" (
- if !i! gtr 1 set /a n+=1
- set i=1
- ) else set /a "i+=1"
- for /f "tokens=1,2" %%i in ("!n! !i!") do endlocal&set n=%%i&set i=%%j&set _%%i=%%j&set "%%i_%%j=%%c"
- set "s=%%a:%%b"
- )
- setlocal enabledelayedexpansion
- (for /l %%i in (1 1 %N%) do (
- for /l %%a in (1 1 !_%%i!) do (
- for /f "tokens=*" %%m in ("!%%i_%%a!") do (
- set /a i=%%a+1
- dir /b /a-d "!%%i_%%a!" >dir_a.t
- for /l %%b in (!i! 1 !_%%i!) do (
- for /f "tokens=*" %%n in ("!%%i_%%b!") do (
- dir /b /a-d "!%%i_%%b!" >dir_b.t
- findstr /ivxg:dir_a.t dir_b.t>dir_c.t>nul||findstr /ivxg:dir_b.t dir_a.t>nul||(
- for /f "tokens=*" %%o in ("!%%i_%%a!") do (
- echo !%%i_%%a!&type dir_a.t&echo;
- set %%i_%%a=
- )
- echo !%%i_%%b!&type dir_b.t&echo;
- set %%i_%%b=
- )
- )
- )
- )
- )
- ))>dir_list.txt
- del dir_a.t dir_b.t
- start "" dir_list.txt
- pause
复制代码
第九题 增加一个临时文件方案3 如文件夹数量大的情况 增加个临时文件- @echo off
- SET PH=f:
- dir /s /a-d /o:n %PH% >dir_a.t
- (for /f "skip=2 tokens=*" %%i in (dir_a.t) do (
- set "str=%%i"
- setlocal enabledelayedexpansion
- if exist "!str:~,-4!\" (
- for /f "tokens=*" %%j in ("!str:~,-4!") do endlocal&set "files=%%j"
- ) else endlocal&for /f "tokens=1-3*" %%a in ("%%i") do if "%%b%%d" == "个文件字节" (
- setlocal enabledelayedexpansion
- for /f "tokens=1-3*" %%a in ("%%i") do echo !file!:%%a:!files!
- endlocal
- ) else set "file=%%d"
- ))>dir_b.t
- findstr /inbv ":" dir_b.t >dir_a.t
- (for /f "tokens=1-3* delims=:" %%a in (dir_a.t) do (
- if not defined $%%a (
- dir /b /a-d /on "%%d" >dir_b.t
- set flag=a
- findstr /ic:":%%b:%%c:" dir_a.t>$
- for /f "tokens=1-3* delims=:" %%A in ($) do (
- if %%A gtr %%a (
- if not defined $%%A (
- dir /b /a-d /on "%%D" >dir_c.t
- fc /c /L dir_b.t dir_c.t>nul&&(
- if defined flag set flag=&echo %%d&type dir_b.t&echo;
- echo %%D&type dir_c.t&echo;
- set $%%A=a
- )
- )
- )
- )
- )
- ))>dir_list.txt
- del $ dir_a.t dir_b.t dir_c.t 2>nul
- start "" dir_list.txt
- pause
复制代码
第十题- @echo off
- findstr /ivx "图[0-9]*\.[0-9]*" a.txt>_temp.t
- findstr /ivx "图[0-9]*\.[0-9]*、.*图[0-9]*\.[0-9]*" _temp.t>html.txt
- set "sp= "
- set "br=<br />"
- set "ims=一二三四五六七八九十百 "
- (findstr /ib "<[^/]" %~s0
- for /f "delims=" %%i in ('findstr /in .* html.txt') do (
- set "str=%%i"
- setlocal enabledelayedexpansion
- set "str=!str:*:=!"
- if defined str (
- for /f "tokens=1,2 delims=%ims%" %%a in ("!str!") do (
- if "%%a%%b" == "第章" (
- if "!str:~,2!" == "第章" (
- echo;!br!!sp!!str!!br!
- ) else echo;!sp!!str!!br!
- ) else echo;!sp!!str!!br!
- )
- ) else echo !br!
- endlocal
-
- )
- findstr /ib "</" %~s0
- )>a.html
- del html.txt _temp.t
- exit
- <html>
- <body>
- </body>
- </html>
复制代码
作者: 523066680 时间: 2013-7-19 15:15
本帖最后由 523066680 于 2013-8-19 19:30 编辑
第一题:
(没有考虑特殊文件夹或者权限限制的情况)
修改时间:2013-08-08
改善问题:1、遇到含有%、! 的符号出错
2、for /f + 'dir'效率低,改为了for /D- @echo off
- set target=x:\bathome
- if exist %target% (
- cd /d %target%\
- call :subfolder
- cd ..
- rd %target%
- ) else (
- echo %target% 目录不存在
- )
- pause
- exit
-
-
- :subfolder
- echo %cd%
- del *.* /a /f /q
- for /D %%i in (*.*) do (
- cd "%%~fi"
- call :subfolder
- cd ..
- rd "%%~fi"
- )
- goto :eof
-
复制代码
第三题,
修改时间:2013-07-27
改善问题:1、支持%、! 等字符
2、减少call,提速
3、net user 在遇到 " 时需要用\"转义。
每一组出现的次数是随机的(在至少出现一次的基础上),每一组出现的位置是随机的。- @echo off
- setlocal enabledelayedexpansion
- set t=%time%
- set S1=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- set S2=abcdefghijklmnopqrstuvwxyz
- set S3=0123456789
- rem V V V V V V V
- set "S4=~`^!@#$%%^^^&*()_+-={}[]|\:^";'^<^>,.?/"
- set /a N1=26,N2=26,N3=10,N4=32
- set /a i=0
-
- :LP
- set "Series="
- set "Code="
- rem [1-4]是4个必须的组元素,4以上随机选组
- for /l %%i in (1,1,8) do (
- if %%i leq 4 (
- set /a Who=%%i, R=!random! %% N%%i
- ) else (
- set /a Who=!random! %% 4 + 1
- set /a R=!random! %% N!Who!
- )
- set Code[%%i]=!Who!_!R!
- )
-
- rem 从数组中随机提取元素,装载到SRand
- rem 根据提取的个数,逐步缩小提取范围
- set "SRand="
- for /l %%a in (8,-1,1) do (
- set /a R=!random! %% %%a + 1
- for %%b in (!R!) do set SRand=!SRand! !Code[%%b]!
- set Code[!R!]=!Code[%%a]!
- )
-
- if not defined EVER_%SRand: =% (
- set EVER_%SRand: =%=exist
- set /a i+=1
- rem 编号转字符
- for %%n in (%SRand%) do (
- for /f "tokens=1,2 delims=_" %%a in ("%%n") do (
- set Series=!Series!!S%%a:~%%b,1!
- )
- )
- set nnn=00!i!
- set nnn=!nnn:~-3!
- rem 设置密码如果出现双引号, 需要用\进行转义
- rem net user Bathome!nnn! "!Series:"=\"!" /add 1>nul
- echo 编号和密码:!nnn! !Series!
- ) else (
- rem 其实很少重复,走个过场。
- echo 出现重复密码
- goto :LP
- )
- if %i% lss 100 (
- goto :LP
- )
-
- echo %t% %time%
- pause
- 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
第八题 很长……- @echo off
- setlocal enabledelayedexpansion
- set /a n=1, m=10
- for %%i in (壹 贰 叁 肆 伍 陆 柒 捌 玖 分 角 圆 拾 佰 仟 万) do (
- if !n! leq 9 (
- set /a C_%%i=n,n+=1
- ) else (
- set /a P_%%i=m,m-=1
- )
- )
-
- set /a Code=0, Begin=0
- rem 读取文本/调用Deal转换数字
- for /f "tokens=*" %%a in ('type %0') do (
- if !Begin! equ 1 (call :Deal %%a)
- if "%%a"=="::Data" (set /a Begin=1)
- )
-
- rem 选择排序
- for /l %%a in (%Code%,-1,1) do (
- set Ever=0000000000_000
- for /l %%b in (1,1,%%a) do (
- if !Ser[%%b]! gtr !Ever! (
- set Ever=!Ser[%%b]!
- set Num=%%b
- )
- )
- set Ser[!Num!]=!Ser[%%a]!
- set Ser[%%a]=!Ever!
- )
-
- for /l %%a in (1,1,%Code%) do (
- for %%b in (!Ser[%%a]!) do echo !SRC_%%b!
- )
- pause
- exit
-
- :Deal
- set Say=%1
- set Ser=0000000000
- set Say=%Say:整=%
- set Say=%Say:零=%
- set /a i=0,Cut=0,Code+=1
- for /l %%a in (0,1,25) do (
- set z=!Say:~-1,1!
- set Say=!Say:~,-1!
- if defined P_!z! (
- set /a Site=P_!z!-Cut
- if "!z!"=="万" (set Cut=4)
- ) else (
- set /a Num=C_!z!,SiteA=Site-1
- for /f "tokens=1,2" %%i in ("!Site! !SiteA!") do (
- set Ser=!Ser:~0,%%j!!Num!!Ser:~%%i!
- )
- )
- if "!Say!"=="" (goto :next)
- )
- :next
- set NNN=000%Code%
- rem NNN后缀用来确保相同的数额能够在排序中保留
- set Ser[%Code%]=%Ser%_!NNN:~-3!
- set SRC_%Ser%_!NNN:~-3!=%1
- goto :eof
-
- ::Data
- 陆拾叁万贰仟伍佰肆拾叁圆叁角整
- 伍万圆整
- 捌万零肆佰圆伍角叁分
- 壹佰圆整
- 贰佰万叁仟贰佰陆拾陆圆零叁分
- 柒佰柒拾万零捌拾叁圆整
- 叁万圆肆角肆分
- 壹圆整
复制代码
第九题
最后修改: 8月19日
基本上在遇到含有%%!! () & 符号的文件、文件夹时不会出错。不过效率很低。
如果多个目录相同,比如,A=B=C 可以并排列出。而不是A=B,B=C,A=C分别列出。复制代码
检查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 字节
虽然不想用批处理做第九题。
没有以前那么能折腾了,做出来还是效率又低问题依旧。。。
附件,内有备注明一些错误情况。
[attach]6692[/attach]
作者: cutebe 时间: 2013-7-19 20:35
好多题,也好诱惑!
作者: xxpinqz 时间: 2013-7-19 22:51
本帖最后由 xxpinqz 于 2013-7-22 18:36 编辑
vbs用来计算惯了,表示计算类都没写过。第三方更少接触,附上几个。表示纯支持,纯参与。
第一题:- @echo off
- rem 能del /a/s/f/q *.*吗
- set "dst=d:\bathome"
- (for /f "delims=" %%a in ('dir /b/s/a "%dst%"^|sort /r') do (
- del /a/q/f "%%a"
- rd "%%a"
- ))>nul 2>nul
- rd "%dst%"
复制代码
第二题:郁闷的这题,有人考虑含空格的用户名吗,表示没招,查找目录也不一定准确。或者多虑了- @echo off&setlocal enabledelayedexpansion
- for /f "skip=4 delims=" %%a in ('net user^|findstr /iv "命令成功完成"') do (
- for %%i in (%%a) do set "#%%i=1"
- )
- for /f "delims=" %%a in (d:\BatHome_User_List.txt) do set "#%%a=!#%%a!2"
- for /f "tokens=1,2 delims=#=" %%a in ('set #') do (
- if %%b equ 1 (
- set "strz=!strz!%%a "
- ) else (
- if %%b equ 2 set "strj=!strj!%%a "
- )
- )
- echo 非法增加用户:!strz!
- echo 非法减少用户:!strj!
- pause
复制代码
第三题:- @echo off
- set "dx=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- set "xx=abcdefghijklmnopqrstuvwxyz"
- set "sz=0123456789"
- set "zf=$#@~_+{}|;'<>?,./\][=-)(*:"
- set l=1000
- setlocal enabledelayedexpansion
- :loop
- set/a r1=!random!%%26,r2=!random!%%10,r3=!random!%%26,r4=!random!%%10
- if not defined #!r1!-!r2!-!r3!-!r4! (
- set /a l+=1
- set #!r1!-!r2!-!r3!-!r4!=!l!
- )
- if %l% lss 1100 goto :loop
- for /f "tokens=1,2 delims=#=" %%a in ('set #') do (
- set "id=%%b"
- for /f "tokens=1-4 delims=-" %%i in ("%%a") do (
- set "pw=!dx:~%%i,1!!xx:~%%i,1!!zf:~%%i,1!!sz:~%%j,1!!dx:~%%k,1!!xx:~%%k,1!!zf:~%%k,1!!sz:~%%l,1!"
- echo net user Bathome!id:~-3! !pw! /add
- )
- )
- pause
复制代码
第四题:
浮点啊,不会。。。。
第五题:
算日期,也不会,只好走个捷径- @echo off
- rem 不会计算日期,只好这么写了,win7测试,XP默认是周还是星期?
- more +6 <%~fs0>autobak.bat
- schtasks /create /tn autobak /sc daily /ru system /tr "%~dp0autobak.bat" /f
- goto :eof
-
- @echo off
- cd /d "%~dp0"
- for /f "tokens=1-4 delims=-/ " %%a in ("%date%") do (
- set "today=%%b-%%c-%%a"
- set "week=%%d"
- )
- if not exist "*.lst" (
- (echo logs\
- echo img\
- echo .zip
- echo .bak
- )>"%today%.lst"
- )
- for %%a in (*.lst) do set "day=%%~na"
- ren "%day%.lst" "%today%.lst"
- if "%week:周=星期%"=="星期日" (
- xcopy "d:\www.bathome\*.*" "d:\bbs.bathome\%week%\" /yshr
- ) else (
- xcopy "d:\www.bathome\*.*" "d:\bbs.bathome\%week%\" /yshr /d:%day% /exclude:%today%.lst
- )
复制代码
第六题:
计算的略过
第七题:
curl,纯欣赏。
第八题:- @echo off&setlocal enabledelayedexpansion
- more +20<%~s0>tmp
- set "c=零-+0# 壹-+1# 贰-+2# 叁-+3# 肆-+4# 伍-+5# 陆-+6# 柒-+7# 捌-+8# 玖-+9# 拾-0 佰-00 仟-000 万-^)#0000+^(0 角-0 分- "
- for /f "delims=" %%z in (tmp)do (
- for /f "tokens=1,2 delims=圆整" %%i in ("%%z")do (
- set "str=(%%i).%%j"
- for %%a in (%c%) do (
- for /f "tokens=1-2 delims=-" %%b in ("%%a")do set "str=!str:%%b=%%c!"
- )
- for /f "tokens=1-2 delims=." %%a in ("!str:#=*1!")do (
- set/a xs=100%%b,num=%%a
- set "num=0000000000!num!.!xs:~-2!"
- set "#!num:~-12!=%%z"
- )
- )
- )
- for /f "tokens=2 delims==" %%a in ('set #')do echo,%%a
- del /f tmp&pause>nul&goto :eof
-
-
- 陆拾叁万贰仟伍佰肆拾叁圆叁角整
- 伍万圆整
- 捌万零肆佰圆伍角叁分
- 壹佰圆整
- 贰佰万叁仟贰佰陆拾陆圆零叁分
- 柒佰柒拾万零捌拾叁圆整
- 叁万圆肆角肆分
- 壹圆整
- 玖仟万零玖圆玖角
复制代码
第玖题:- @echo off&setlocal enabledelayedexpansion
- set "src=%~dp0"
- (for /d /r f: %%a in (*) do (
- pushd "%%a"
- set str=
- for %%b in (*) do set "str=!str!%%b"
- if defined str (
- echo,!str!*%%a
- ) else (
- echo,%%a >>%src%$t
- )
- ))>%src%$f
- cd /d "%src%"
- echo 相同的不含文件的文件夹:
- type $t
- echo 含相同文件的文件夹:
- for /f "tokens=1* delims=*" %%a in ('sort $f') do (
- set "str1=!str2!"
- set "path1=!path2!"
- set "str2=%%a"
- set "path2=%%b"
- if "!str1!"=="!str2!" (
- echo !path1!
- set .=.
- ) else (
- if defined . (
- set.=
- echo,!path1!
- echo ---------------传说的分割线---------------
- )
- )
- )
- if defined . echo,!path2!
- del $?&pause
复制代码
第十题:
没整过html,也不知道对不对.- @echo off
- set "char=一 二 三 四 五 六 七 八 九 十 零"
- (echo ^<HTML^>^<BODY^>
- for /f "delims=" %%a in ('findstr /bivx "图[0-9]*\.[0-9]*$" 时间简史.txt') do (
- for /f "delims=章" %%b in ("%%a") do (
- set "str=%%b"
- setlocal enabledelayedexpansion
- for %%c in (%char%) do set "str=!str:%%c=!"
- if "!str!"=="第" echo ^<br^>
- endlocal
- )
- echo ^<br^>
- echo ^ ^ ^ ^ %%a^<br^>
- )
- echo ^</BODY^>^</HTML^>
- )>时间简史.html
复制代码
作者: apang 时间: 2013-7-21 10:18
本帖最后由 apang 于 2013-8-12 08:28 编辑
1.- @echo off
- %1(for /f "delims=" %%a in ('%~s0 :^|sort /r') do del/a/f/q %%a&rd/q %%a)&exit /b
-
- set "folder=D:\BatHome"
- echo,"%folder%\"
- call :GetSubFolder "%folder%"
- exit /b
-
- :GetSubFolder
- for /f "delims=" %%a in ('dir /ad/b "%~1\"') do (
- echo,"%~1\%%a\"
- call :GetSubFolder "%~1\%%a"
- )
复制代码
2.- @echo off
- set "wmic=wmic useraccount get name /value"
- (for /f "tokens=2delims==" %%a in ('%wmic%^|find "="') do (
- for /f "tokens=*" %%b in ("%%a") do echo,%%b
- ))>$
-
- for /f "delims=" %%a in ('findstr/ixvg:"D:\BatHome_User_List.txt" $') do (
- echo,增加的用户:%%a
- )
- for /f "delims=" %%a in ('findstr/ixvg:$ "D:\BatHome_User_List.txt"') do (
- echo,减少的用户:%%a
- )
- del $
- pause
复制代码
3.- :~!@#$%^&*()+-=<>?/\|
- @echo off&setlocal enabledelayedexpansion
- set "str=QWERTYUIOPASDFGHJKLZXCVBNM qwertyuiopasdfghjklzxcvbnm"
- set "str1=1234567890"
- set /p str2=<%0
- for /l %%a in (1001 1 1100) do (
- set "pwd=" & set "Name=%%a"
- for %%b in (%str%) do (
- set "a=%%b"
- set /a r=!random! %% 26
- for %%c in (!r!) do set "pwd=!pwd!!a:~%%c,1!"
- )
- set /a r1=!random! %% 10,r2=!random! %% 21
- for %%a in (!r1!) do set "pwd=!pwd!!str1:~%%a,1!"
- for %%a in (!r2!) do set "pwd=!pwd!!str2:~%%a,1!"
- Net User "BatHome!Name:~1!" "!pwd!%%a" /add
- echo,用户名:BatHome!Name:~1! 密码:!pwd!%%a>>List.txt
- )
- pause
复制代码
4.- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2*" %%a in ('systeminfo') do (
- if "%%a"=="物理内存总量:" set "mem=%%b"
- if "%%a"=="可用的物理内存:" set "freemem=%%b"
- if "%%a"=="系统启动时间:" (
- for /f "tokens=1-8" %%i in ("%%b %%c") do (
- set /a "st=%%i*24*3600+%%k*3600+%%m*60+%%o"
- )
- )
- )
-
- set /a "mem1=%mem:,=%0/1024,mem2=100*(%mem:,=%-%freemem:,=%)/%mem:,=%"
- >D:\BatHome_OS.txt echo,已运行时间:%st%秒
- >>D:\BatHome_OS.txt echo,物理内存总量:%mem1:~,-1%.%mem1:~-1%GB
- >>D:\BatHome_OS.txt echo,内存使用率:%mem2%%%
-
- set wmic=wmic logicaldisk where "DriveType='3'"
- (for /f "tokens=1-3" %%i in ('%wmic% get freespace^,name^,size^|find ":"') do (
- call :GetSize %%k00
- set /a a=Size/1024
- set /p=%%j容量:!a:~,-1!.!a:~-1!GB <nul
- call :GetSize %%i00
- set /a "b=100*(a-Size/1024)/a"
- set /p=使用率:!b!%%<nul
- echo,
- ))>>D:\BatHome_OS.txt
- pause&goto :eof
-
- :GetSize
- set "num=%1"&set "Size="&set "n="
- for %%a in (16 8 4 2 1) do (
- if not "!num:~%%a!"=="" set /a n+=%%a&set "num=!num:~%%a!"
- )
- set "num=%1"
- set /a n-=6
- for /l %%a in (!n! -1 1) do (
- set "s=!num:~,-%%a!"
- if "!s:~,1!"=="0" set "s=!s:~1!"
- set /a m=s%%1048576,s/=1048576
- set "Size=!Size!!s!"
- set "num=!m!!num:~-%%a!"
- )
- if "!Size:~,1!"=="0" set "Size=!Size:~1!"
复制代码
5.- @echo off
- ::需要更改 Name 和 PWD 为实际的登录用户名和密码
- more +6 "%~0">"%~dp0Back.bat"
- schtasks /create /tn FulBack /tr "cmd /cxcopy /shcy \"D:\www.bathome\*\" \"D:\bbs.bathome\\"" /sc weekly /d sun /ru Name /rp PWD
- schtasks /create /tn IncBack /tr \""%~dp0Back.bat"\" /sc weekly /d mon,tue,wed,thu,fri,sat /ru Name /rp PWD
- pause&goto :eof
-
- pushd "%~dp0"
- (for %%a in ("\logs\" "\img\" ".zip" ".bak") do echo,%%~a)>$
- xcopy /shcdy /exclude:$ "D:\www.bathome\*" "D:\bbs.bathome\"
- del $
复制代码
6.- @echo off&setlocal enabledelayedexpansion
- set /p Num1=输入被除数(正整数):
- set /p Num2=输入除数(小于9位数的正整数):
- set "x=100"
-
- set /a Len1=Len2=0&set "tmp=%Num1%"
- for %%a in (64 32 16 8 4 2 1) do (
- if "!tmp:~%%a!" neq "" set /a Len1+=%%a&set "tmp=!tmp:~%%a!"
- )
-
- set "tmp=%Num2%fedcba9876543210"
- set /a Len2=0x!tmp:~15,1!
-
- for /l %%a in (1 10 %x%) do set "str=!str!0000000000"
- set "str=%Num1%%str%0"
- set /a n = Len1 - Len2 + x + 1
-
- for /l %%a in (!n! -1 1) do (
- set "s=!str:~,-%%a!"
- if "!s:~,1!"=="0" set "s=!s:~1!"
- set /a m=s %% Num2,s/=Num2
- set "Size=!Size!!s!"
- set "str=!m!!str:~-%%a!"
- )
-
- if %Len1% lss %Len2% (
- set "Size=0000000000!Size!" & set "Size=!Size:~-%x%!"
- ) else if "!Size:~,1!"=="0" set "Size=!Size:~1!"
-
- echo,%Num1% ÷ %Num2% = !Size:~,-%x%!.!Size:~-%x%!
- pause
复制代码
7.- @echo off&setlocal enabledelayedexpansion
- ::需要第三方工具 wget 和 geturls
- set "url=http://www.zhuoku.com/zhuomianbizhi/show/index-1.htm"
- set "str=tool.zhuoku.com/tool/dyw_size.php?width=1440&height=900&corp_x=center&corp_y=top&picurl=.."
- wget -O "%tmp%\$1" "%url%" 2>nul
- md show 2>nul
- for /f "delims=" %%a in ('geturls /s:"zhuomianbizhi"^<"%tmp%\$1"^|findstr /i "\/[0-9]*\.htm$"') do (
- if not defined %%~na (
- wget -O "%tmp%\$2" "http://www.zhuoku.com/%%a" 2>nul
- for /f "delims=" %%b in ('geturls^<"%tmp%\$2"^|findstr /i "\.jpg$"')do (
- set "a=%%b"
- set "a=!a:/thumbs/tn_=/!"
- for /f "delims=" %%c in ("!a:img.zhuoku.com=%str%!") do (
- wget -O "show\%%~nxc" "%%c"
- )
- )
- set "%%~na=1"
- )
- )
- del "%tmp%\$*"
复制代码
8.- @echo off&setlocal enabledelayedexpansion
- %1(for /f "tokens=2delims=." %%a in ('%~s0 :^|sort') do echo,%%a)>b.txt&exit /b
-
- for /f "delims=" %%a in (a.txt) do (
- set "a=%%a" & set /a n=0
- for %%b in (整 角 分) do set "a=!a:%%b=!"
- for %%b in (捌 玖 拾) do set "a=!a:零%%b=%%b!"
- set "a=!a:拾=*10+!"
- set "a=!a:佰=*100+!"
- set "a=!a:仟=*1000+!"
- for %%b in (零 壹 贰 叁 肆 伍 陆 柒 捌 玖) do (
- for %%c in (!n!) do set "a=!a:%%b=%%c!"
- set /a n+=1
- )
- set "a=!a:+万=万!" & set "a=!a:+圆=圆!"
- if "!a:万=!" neq "!a!" set "a=(!a:万=)*10000+!"
- if "!a:圆=!"=="!a!" set "a=0圆!a!"
- set "a=!a:+圆=圆!"
- set "b=!a:*圆=!00"
- set "b=!b:~,2!"
- for /f "delims=圆" %%b in ("!a!") do set /a "a=%%b"
- set "str=..........!a!!b!"
- echo,!str:~-11!.%%a
- )
复制代码
9.- @echo off&setlocal enabledelayedexpansion
- md "%tmp%\~tmp\" 2>nul
- for /d /r "f:\" %%a in (*) do (
- set /a n+=1
- set "_!n!=%%a"
- (for %%b in ("%%a\*") do echo,%%~nxb)>"%tmp%\~tmp\!n!.tx"
- )
-
- pushd "%tmp%\~tmp\"
- (for /l %%a in (1 1 !n!) do (
- for /f "delims=" %%b in ('findstr/imxg:%%a.tx *.tx 2^>nul')do (
- if /i not "%%a.tx"=="%%b" (
- fc /c %%a.tx %%b|find /i "FC: 找不到">nul && (
- if not defined #%%a (
- echo,!_%%a!&type %%a.tx&echo,
- set #%%a=1
- )
- if not defined #%%~nb (
- echo,!_%%~nb!&type %%b&echo,
- set #%%~nb=1
- )
- )
- )
- )
- ))>"%~dp0List.txt"
- popd&rd "%tmp%\~tmp\" /s /q
- pause
复制代码
10.- @echo off
- (echo,^<html^>&echo,^<body^>)>a.html
- (for /f "delims=" %%a in ('findstr/ivn "^图[0-9]*\.[0-9]*" a.txt') do (
- set "str=%%a"
- setlocal enabledelayedexpansion
- set "str=!str:*:=!"
- if "!str:~,1!"=="第" if "!str:章=!" neq "!str!" set flag=1
- if defined flag (
- echo,^</br^>
- set "str=<p>!str!</p>"
- ) else (
- if "!str!" neq "" (
- set "str=  !str!</br>"
- ) else set "str=!str!</br>"
- )
- echo,!str!
- endlocal
- ))>>a.html
- (echo,^</body^>&echo,^</html^>)>>a.html
- pause
复制代码
作者: ShadowFiend 时间: 2013-7-23 17:41
本帖最后由 ShadowFiend 于 2013-7-23 17:46 编辑
现在第六题,看有时间再做其他- @rem 第六题
- @echo off
- set ucase=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- set lcase=abcdefghijklmnopqrstuvwxyz
- set num=0123456789
- rem 下面是除了space外的特殊字符,共32个
- set "spec=!#$%%&'()*+,-./:;<=>?@[\]^_`{|}~""
- set "all=%ucase%%lcase%%num%%spec%"
- set /a len=26+26+10+32,count=1
- setlocal enabledelayedexpansion
-
- :start
- set op=&set o=
- rem 先分别在四种类型字符中选一个,保证至少存在四类字符
- for %%i in (%ucase%_26 %lcase%_26 %num%_10) do (
- set "tmp=%%i"
- set /a n=!random!%%!tmp:~-2!
- for %%j in (!n!) do set "op=!op!!tmp:~%%j,1!"
- )
- rem 特殊字符特殊处理
- set /a n=!random!%%32
- for %%i in (!n!) do set "op=!op!!spec:~%%i,1!"
- rem 再从所有字符中选出剩余的四个字符
- for /l %%i in (1 1 4) do (
- set /a n=!random!%%%len%
- for %%j in (!n!) do set "op=!op!!all:~%%j,1!"
- )
- rem 对8个字符做乱序处理,保证随机性
- for /l %%i in (8 -1 1) do (
- set /a n=!random!%%%%i
- for %%j in (!n!) do (
- set "o=!o!!op:~%%j,1!"
- set /a q=!n!+1
- for %%k in (!q!) do (set "op=!op:~0,%%j!!op:~%%k,8!")
- )
- )
- rem 判断是否重复,不重复则输出,出现重复的概率太小,个人认为没必要判断
- if %count% leq 100 (
- set c=%count%
- if %count% lss 100 (
- if %count% lss 10 (
- set c=00%count%
- ) else (
- set c=0%count%
- )
- )
- echo username: Bathome!c! password: !o!
- set /a count+=1
- if %count% lss 100 (goto start)
- )
- pause
复制代码
作者: wankoilz 时间: 2013-8-1 00:19
本帖最后由 wankoilz 于 2013-9-1 13:28 编辑
最近空时间多,来凑个热闹,希望能拿个第三名吧!
所有代码在win7下测试通过。
有什么问题还望Batcher指点。
帖子代码的显示稍微窄了点儿,长一点的句子显示出来不整齐。
总共才300kb,结果附件不能大于50kb,不得不压缩成7个包... ...
1、- @echo off
- call :rd ".\测试文件夹"&exit
-
- :rd
- for /f "delims=" %%a in ('dir/a-d/b %1 2^>nul') do if not "%%a"=="" del "%~1\%%a" /f
- for /f "delims=" %%a in ('dir/ad/b %1 2^>nul') do if not "%%a"=="" call :rd "%~1\%%a"
- rd %1 /q 2>nul
复制代码
2、- @echo off
- for /f "skip=4 delims=" %%i in ('net user') do (
- if not "%%i"=="命令成功完成。" (
- (for %%j in (%%i) do echo %%j)>User_List.txt
- ))
- (findstr /v /g:User_List.txt DBatHome_User_List.txt)>Gone_Users.txt
- (findstr /v /g:DBatHome_User_List.txt User_List.txt)>New_Users.txt
复制代码
3、- @echo off
- set str=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%%^^^&*+
- setlocal enabledelayedexpansion
- for /l %%a in (1001,1,1100) do (
- call :get_rnd
- set password=%%a!rnd!
- set username=%%a&set username=!username:~1!&set username=BatHome!username!
- echo net user !username! !password! /add
- )
- pause&exit
-
- :get_rnd 生成四位带一个大写、一个小写字母、一个数字、一个特殊字符的不重复字符串
- set rnd=
- set /a l=!random!%%26,u=!random!%%26+26,n=!random!%%10+52,t=!random!%%10+62
- for %%a in (!l!,!u!,!n!,!t!) do (
- set rnd=!rnd!!str:~%%a,1!
- )
- if not defined !rnd! (set !rnd!=yes
- ) else (call :get_rnd)
复制代码
4、- @echo off&title DateToSecs函数 BY Batcher Else BY wankoilz
- set "len=for /f "tokens=1-2" %%1 in ("$") do (set ##=!%%1!&set %%2=&(for %%a in (4096,2048,1024,512,256,128,64,32,16,8,4,2,1) do (if not "!%%1:~%%a,1!"=="" (set/a %%2+=%%a&set %%1=!%%1:~%%a!)))&(if not "!%%1!"=="" set/a %%2+=1)&set %%1=!##!)"
- setlocal enabledelayedexpansion
- echo MemoryInfo:
- call :Show_MemoryInfo
- echo;&echo DiskInfo(Wait a moment):
- call :Show_DiskInfo
- echo;&echo SystemRunningTimeDiff:
- call :Show_SystemRunningTimeDiff
- echo;&pause&goto :eof
-
- :Show_MemoryInfo
- for %%a in (物理内存总量 可用的物理内存) do (
- set /a n+=1
- for /f "tokens=2" %%b in ('systeminfo ^| findstr "%%a"') do (
- set mem!n!=%%b
- )
- )
- set rest=!mem2:^,=!&set total=!mem1:^,=!
- set/a used=!total!-!rest!
- set used=!used!0000
- set/a percent=!used!/!total!
- set percent=0000!percent!
- set percent_int=!percent:~0,-2!&set percent_float=!percent:~-2!
- call :trim percent_int !percent_int!
- set percent=!percent_int!.!percent_float!%
- set total=!total!0000
- set/a total=!total!/1024
- set total=0000!total!
- set int_total=!total:~0,-4!&set float_total=!total:~-4!
- call :trim int_total !int_total!
- set total_GB=!int_total!.!float_total!
- echo 总内存:!total_GB!GB
- echo 内存使用率:!percent!
- goto :eof
-
- :Show_DiskInfo
- for /f "skip=1 tokens=1-3" %%a in ('wmic logicaldisk get name^,size^,freespace') do (
- if not "%%c"=="" (
- set quotient=&call :division %%c 1073741824
- set size=!quotient! GB
- set quotient=&call :division %%a %%c
- set quotient=!quotient:^.=!&set quotient=!quotient:~0,5!
- call :trim quotient !quotient!
- set/a used_per=10000-!quotient!
- set used_per=0000!used_per!&set used_per=!used_per:~-4!
- set used_per_int=!used_per:~0,2!&set used_per_float=!used_per:~2!
- call :trim used_per_int !used_per_int!
- set used_per=!used_per_int!.!used_per_float!
- for /l %%a in (1,1,13) do set size= !size!
- echo %%b盘容量!size:~-13! 使用率!used_per!%
- )
- )
- goto :eof
-
-
- :Show_SystemRunningTimeDiff
- for /f "tokens=2-3" %%a in ('net statistics workstation^|findstr "统计数据开始于"') do (
- set StartTime=%%a %%b
- )
- for /f "tokens=1" %%a in ("%date%") do set date=%%a
- set EndTime=%date% %time:~0,-3%
- echo 最近一次开机时间:%starttime%
- echo 当前时间:%endtime%
- call :DateDiff %StartTime% %EndTime%
- echo 系统已运行时间:%Y%年%D%日%H%时%M%分%S%秒
- goto :eof
-
- :DateDiff !StartTime! !EndTime!
- set StartTime=%StartTime:-= %
- set StartTime=%StartTime:/= %
- set StartTime=%StartTime::= %
- set EndTime=%EndTime:-= %
- set EndTime=%EndTime:/= %
- set EndTime=%EndTime::= %
- call :DateToSecs %StartTime% StartSecs
- call :DateToSecs %EndTime% EndSecs
- set /a DiffSecs=EndSecs-StartSecs
- set DiffSecs=%DiffSecs:-= %
- set /a Y=DiffSecs/31536000
- set /a D=(DiffSecs%%31536000)/86400
- set /a H=(DiffSecs%%86400)/3600
- set /a M=(DiffSecs%%3600)/60
- set /a S=DiffSecs%%60
- goto :eof
-
- :DateToSecs %yy% %mm% %dd% %hh% %nn% %ss% secs
- setlocal ENABLEEXTENSIONS
- set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5&set ss=%6
- if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
- set /a dd=100%dd%%%100,mm=100%mm%%%100
- set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
- set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
- if 1%hh% LSS 20 set hh=0%hh%
- if {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
- if {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
- if {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
- set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
- set /a j=j*86400+hh*3600+nn*60+ss
- endlocal&set %7=%j%&goto :eof
-
-
- :division
- setlocal
- set dividend=%1&set divisor=%2
- %len:$=dividend length_dividend%
- %len:$=divisor length_divisor%
- set add=4
- for /l %%a in (1,1,!add!) do set dividend=!dividend!0
- set/a length_dividend+=!add!
- set/a up=!length_dividend!-1
- for /l %%a in (0,1,!up!) do (
- set minuend=!minuend!!dividend:~%%a,1!
- call :trim minuend !minuend!
- call :compare !minuend! !divisor!
- if "!flag_com!"=="geq" (
- set quo=&call :subtraction !minuend! !divisor!
- set quotient=!quotient!!quo!
- set minuend=!D_value!
- ) else (
- set quotient=!quotient!0
- )
- )
- set int=!quotient:~0,-%add%!&set float=!quotient:~-%add%!
- call :trim int !int!
- set quotient=!int!.!float!
- endlocal&set quotient=%quotient%&goto :eof
-
-
- :subtraction 被减数 减数
- setlocal&set a=%1&set b=%2&set/a quo+=1
- %len:$=a length_a%
- set b=0!b!&set b=!b:~-%length_a%!
- set/a p=!length_a!-1
- for /l %%a in (0,1,!p!) do (
- set arrA_%%a=!a:~%%a,1!
- set arrB_%%a=!b:~%%a,1!
- )
- for /l %%a in (!p!,-1,0) do (
- if !arrA_%%a! geq !arrB_%%a! (
- set/a dif=!arrA_%%a!-!arrB_%%a!&set diff=!dif!!diff!
- ) else (
- set/a borrow=%%a-1
- set/a arrA_!borrow!-=1
- set/a dif=!arrA_%%a!+10-!arrB_%%a!
- set diff=!dif!!diff!
- )
- )
- if "!diff:~0,1!"=="0" call :trim diff !diff!
- call :compare !diff! %2
- if "!flag_com!"=="geq" (
- endlocal&set quo=%quo%&set diffr=%diff%&call :subtraction !diffr! %2
- ) else (
- endlocal&set quo=%quo%&set D_value=%diff%&goto :eof
- )
-
-
- :compare 被减数 减数(除数)
- setlocal&set a=%1&set b=%2
- %len:$=a length_a%
- %len:$=b length_b%
- set/a l=!length_a!-1
- if !length_a! gtr !length_b! (endlocal&set flag_com=geq&goto :eof)
- if !length_a! lss !length_b! (endlocal&set flag_com=lss&goto :eof)
- if !length_a! equ !length_b! (
- if "!a!"=="!b!" (
- endlocal&set flag_com=geq&goto :eof
- ) else (
- for /l %%a in (0,1,!l!) do (
- if "!a:~%%a,1!" gtr "!b:~%%a,1!" (endlocal&set flag_com=geq&goto :eof)
- if "!a:~%%a,1!" lss "!b:~%%a,1!" (endlocal&set flag_com=lss&goto :eof)
- )
- )
- )
-
- :trim
- setlocal
- set a=%2
- if "!a:~0,1!"=="0" (if not "!a!"=="0" (endlocal&set %1=%a:~1%&call :trim %1 !%1!))
复制代码
5、- @echo off
- Rem 增量备份就是加了个/d
- if "%date:~-2%"=="周日" (
- xcopy /e/h/r/y/k/o/f/exclude:filter.txt "D:\www.bathome" "D:\bbs.bathome"
- ) else (
- xcopy /e/h/r/y/k/o/f/d/exclude:filter.txt "D:\www.bathome" "D:\bbs.bathome"
- )
- pause>nul
复制代码
6、- @echo off&Rem 因为精确位数很容易修改,所以最后一位没有进行四舍五入
- set "len=for /f "tokens=1-2" %%1 in ("$") do (set ##=!%%1!&set %%2=&(for %%a in (4096,2048,1024,512,256,128,64,32,16,8,4,2,1) do (if not "!%%1:~%%a,1!"=="" (set/a %%2+=%%a&set %%1=!%%1:~%%a!)))&(if not "!%%1!"=="" set/a %%2+=1)&set %%1=!##!)"
- setlocal enabledelayedexpansion&title 任意位正整数除法 BY wankoilz
- set/p x=输入被除数:
- set/p y=输入除数:
- echo 计算中...
- call :division !x! !y!
- cls&echo 被除数:!x!&echo 除数:!y!&echo 商:!quotient!
- echo;&pause&exit
-
- :division
- setlocal
- set dividend=%1&set divisor=%2
- %len:$=dividend length_dividend%
- %len:$=divisor length_divisor%
- set add=100
- for /l %%a in (1,1,!add!) do set dividend=!dividend!0
- set/a length_dividend+=!add!
- set/a up=!length_dividend!-1
- for /l %%a in (0,1,!up!) do (
- set/p=^><nul
- set minuend=!minuend!!dividend:~%%a,1!
- call :trim minuend !minuend!
- call :compare !minuend! !divisor!
- if "!flag_com!"=="geq" (
- set quo=&call :subtraction !minuend! !divisor!
- set quotient=!quotient!!quo!
- set minuend=!D_value!
- ) else (
- set quotient=!quotient!0
- )
- )
- set int=!quotient:~0,-%add%!&set float=!quotient:~-%add%!
- call :trim int !int!
- set quotient=!int!.!float!
- endlocal&set quotient=%quotient%&goto :eof
-
-
- :subtraction 被减数 减数
- setlocal&set a=%1&set b=%2&set/a quo+=1
- %len:$=a length_a%
- set b=0!b!&set b=!b:~-%length_a%!
- set/a p=!length_a!-1
- for /l %%a in (0,1,!p!) do (
- set arrA_%%a=!a:~%%a,1!
- set arrB_%%a=!b:~%%a,1!
- )
- for /l %%a in (!p!,-1,0) do (
- if !arrA_%%a! geq !arrB_%%a! (
- set/a dif=!arrA_%%a!-!arrB_%%a!&set diff=!dif!!diff!
- ) else (
- set/a borrow=%%a-1
- set/a arrA_!borrow!-=1
- set/a dif=!arrA_%%a!+10-!arrB_%%a!
- set diff=!dif!!diff!
- )
- )
- if "!diff:~0,1!"=="0" call :trim diff !diff!
- call :compare !diff! %2
- if "!flag_com!"=="geq" (
- endlocal&set quo=%quo%&set diffr=%diff%&call :subtraction !diffr! %2
- ) else (
- endlocal&set quo=%quo%&set D_value=%diff%&goto :eof
- )
-
-
- :compare 被减数 减数(除数)
- setlocal&set a=%1&set b=%2
- %len:$=a length_a%
- %len:$=b length_b%
- set/a l=!length_a!-1
- if !length_a! gtr !length_b! (endlocal&set flag_com=geq&goto :eof)
- if !length_a! lss !length_b! (endlocal&set flag_com=lss&goto :eof)
- if !length_a! equ !length_b! (
- if "!a!"=="!b!" (
- endlocal&set flag_com=geq&goto :eof
- ) else (
- for /l %%a in (0,1,!l!) do (
- if "!a:~%%a,1!" gtr "!b:~%%a,1!" (endlocal&set flag_com=geq&goto :eof)
- if "!a:~%%a,1!" lss "!b:~%%a,1!" (endlocal&set flag_com=lss&goto :eof)
- )
- )
- )
-
- :trim
- setlocal
- set a=%2
- if "!a:~0,1!"=="0" (if not "!a!"=="0" (endlocal&set %1=%a:~1%&call :trim %1 !%1!))
复制代码
7、- @echo off&setlocal enabledelayedexpansion
- set/p url=请输入系列壁纸的网址:
- Rem wget http://www.zhuoku.com/zhuomianbizhi/star-starcn/20130729110511.htm
- wget !url!
- set Lf=^
-
-
- for %%a in ("!url!") do (set filename=%%~nxa&set dirname=%%~na)
- md !dirname! 2>nul
- for /f "delims=" %%a in ('findstr "src=.*http.*img.zhuoku.com.*jpg" !filename!') do (
- set "str=%%a"
- for %%b in ("!Lf!") do set "str=!str:img src=%%b!"
- for /f "delims=" %%c in ('set str^| findstr "http.*img.zhuoku.com.*jpg"') do (
- for /f %%d in (%%c) do (
- set "url=%%d"
- set "url=!url:~2,-1!"
- set "url=!url:img=bizhi!"
- set "url=!url:/thumbs=!"
- set "url=!url:tn_=!"
- wget !url!
- for %%e in ("!url!") do move %%~nxe !dirname!\
- )
- )
- )
- del "!filename!" /f
- cls&echo 下载完毕!
- pause>nul
复制代码
8、- @echo off&echo; 2>nul 3>nul
- set "cmd1=for /f "delims=" %%x in ("!str:~-1!") do set x_danwei=!%%~x!"
- set "cmd2=for /f "delims=" %%x in ("!str:~0,-1!") do set n_danwei=!%%~x!"
- setlocal enabledelayedexpansion
- set 壹=1&set 贰=2&set 叁=3&set 肆=4&set 伍=5
- set 陆=6&set 柒=7&set 捌=8&set 玖=9
- set 万=1&set 仟=1000&set 佰=100
- set 拾=10&set 圆=1&set 角=10&set 分=1
- for /f %%a in (a.txt) do (
- set str=%%a&set str=!str:整=!&set str=!str:零=!
- for %%b in (万_wan 仟_qian 佰_bai 拾_shi 圆_yuan 角_jiao 分_fen) do (
- for /f "delims=_ tokens=1,2" %%c in ("%%b") do call :decompose %%c %%d
- )
- set str=!wan!
- for %%c in (仟_q 佰_b 拾_s 万_g) do (
- for /f "delims=_ tokens=1-2" %%d in ("%%c") do (
- call :decompose %%d %%e
- ))
- for %%c in (q b s g) do (
- set str=!%%c!
- %cmd1%
- %cmd2%
- set/a sum+=!n_danwei!*!x_danwei!
- )
- set/a sum=!sum!*10000
- for %%c in (qian bai shi yuan) do (
- set str=!%%c!
- %cmd1%
- %cmd2%
- set/a sum+=!n_danwei!*!x_danwei!
- )
- for %%c in (jiao fen) do (
- set str=!%%c!
- %cmd1%
- %cmd2%
- set/a float+=!n_danwei!*!x_danwei!
- )
- set float=00!float!&set float=!float:~-2!
- set sum=0000000000!sum!!float!&set sum=!sum:~-10!
- set sort_!sum!=%%a
- for %%c in (wan qian bai shi yuan jiao fen) do set %%c=
- set sum=&set float=
- )
- echo 升序:&echo;
- for /f "delims== tokens=2" %%a in ('set sort') do echo %%a
- pause>nul
-
- :decompose
- set t=!str:*%1=!&if "!t!"=="" (set %2=!str!&goto :eof)
- set %2=!str:%t%=!& if "!%2!"=="" goto :eof
- call set str=%%str:!%2!=%%
复制代码
9、- @echo off&setlocal enabledelayedexpansion&echo; 2>nul 3>nul
- Rem 要查F盘改 ".\测试文件夹" 为 "F:"
- echo 查找中...
- md tmp123
- call :loop ".\测试文件夹"
-
- for /f "delims=" %%a in ('dir/b tmp123') do (set/a n+=1&set "arr_!n!=%%a")
- set/a u=!n!-1
- for /l %%a in (1,1,!u!) do (
- set/a low=%%a+1,up=!n!
- for /l %%b in (!low!,1,!up!) do (
- fc "tmp123\!arr_%%a!" "tmp123\!arr_%%b!" | findstr "找不到差异" >nul&&set "f_!arr_%%a!=!arr_%%b!"
- )
- )
- cls&echo 存在重复情况的目录:&echo;
- for /f "delims=_= tokens=2,3" %%a in ('set f_') do (
- set "s=%%a"&set "i=%%b"
- set "s=!s:$=:!"&set "i=!i:$=:!"
- set "s=!s:#=\!"&set "i=!i:#=\!"
- echo !s! = !i!
- )
- rd tmp123 /s/q
- pause
- goto :eof
-
- :loop
- set "fn=%~1"&set fn=!fn::=$!&set fn=!fn:\=#!
- (for /f "delims=" %%a in ('dir/a-d/b "%~1"') do echo %%a)>"tmp123\!fn!"
- for /d %%a in ("%~1\*") do call :loop "%%a"
复制代码
10、- @echo off&setlocal enabledelayedexpansion
- Rem 目录
- (
- echo ^<html^>^<body^>
- for /f "delims=" %%a in ('findstr/v "^图[0-9]*\.[0-9]*$" 时间简史.txt') do (
- set "s=%%a"
- if "!s!"=="时间简史 目录" set flag_mulu=true
- if defined flag_mulu (
- for /l %%x in (1,1,4) do set "s= !s!"
- for /f "tokens=1 delims= " %%x in ("!s!") do (
- set "t=%%x"&if "!t:~20,1!!t:~-1!"=="第章" set "s=<br>!s!"
- )
- set "s=!s!<br>"
- echo !s!
- ))
- echo ^<br^>^<br^>
- )>时间简史.htm
-
- set flag_mulu=
- Rem 正文
- (for /f "delims=" %%a in ('findstr/v "^图[0-9]*\.[0-9]*$" 时间简史.txt') do (
- set "s=%%a"
- if "!s!"=="时间简史 目录" set flag_mulu=true
- if not defined flag_mulu (
- for /l %%x in (1,1,4) do set "s= !s!"
- for /f "tokens=1 delims= " %%x in ("!s!") do (
- set "t=%%x"&if "!t:~20,1!!t:~-1!"=="第章" set "s=<font size="5" color="blue">!s!</font>"
- )
- set "s=!s!<br><br>"
- echo !s!
- ))
- echo ^</body^>^</html^>
- )>>时间简史.htm
- echo OK&pause
复制代码
[attach]6650[/attach]
[attach]6651[/attach]
[attach]6652[/attach]
[attach]6653[/attach]
[attach]6654[/attach]
[attach]6655[/attach]
[attach]6656[/attach]
作者: sl543001 时间: 2013-8-13 09:59
诈尸出来,支持一下!
作者: wgx1688 时间: 2013-8-23 17:09
好久没进论坛了都忘记了!
作者: wankoilz 时间: 2013-8-31 22:24
怎么没动静了……
作者: Batcher 时间: 2013-9-1 09:15
回复 11# wankoilz
各位评委在评分的时候十分谨慎,所以需要比较长的时间。
作者: wankoilz 时间: 2013-9-1 13:11
本帖最后由 wankoilz 于 2013-9-1 13:20 编辑
回复 12# Batcher
了解,感谢回复!
看了别人的代码才发现第6题是“任意数”除法,我写的是“任意位正整数”除法... ...
作者: Batcher 时间: 2013-9-7 11:32
评分结果出来了,公示一周。
感谢各位评委的辛苦工作!
作者: 523066680 时间: 2013-9-7 15:31
总感觉第五的位置公示一周是很郁闷的事情
4 和6 你们怎么看?
作者: terse 时间: 2013-9-7 16:01
回复 15# 523066680
也郁闷
作者: cutebe 时间: 2013-9-7 18:04
没事,还有我们这些带着羡慕嫉妒恨的观众呢!
作者: ShadowFiend 时间: 2013-9-7 19:59
回复 15# 523066680
我和我的小伙伴都惊呆了!我才做了一题呀,就有奖品。只能说非常感谢管理员的慷慨❤
作者: PowerShell 时间: 2013-9-7 22:48
本帖最后由 PowerShell 于 2013-9-8 09:24 编辑
我来凑热闹了,其实我并不想凑,咱又不是评委会的,况且不懂bat,而且不想得罪人.
但插科打诨,又怕被人笑话,但本着严谨的态度,来了就得帮忙校验,得罪莫怪啊, ----先凿吧两句。
----看了看第六题-----
首先,我想提的是,出题人是严谨的么? ---你会说,那当然了。但我觉得未必,
[计算任意两数值的商,要求精确到小数点后100位(没有100位的补足100位)。]没说明是否整数,是否正负.
那我只能判定,可以非整数,可以正负.----这导致6楼,8楼理解错误.当然做的就不对了.
-----7楼答错题了.应该打屁股,
------只有2楼理解了题意.做出了答案,正确否,我没看.但是改了下除数和被除数后,程序报错.
set str1=1.234
set str2=2.345
后,报错信息为[此时不应有 1。] 是不是,我哪里搞的不对了呢?请告知.
---结论---
凡是答了第六题的,费了半天脑细胞,第六题全线阵亡!
----再凿吧两句----
从小学开始,我们就是从千考万题中挣扎过来的,
1没明确点明条件的问题很多,虽然这样的题有点不地道,但你不能怪考官,理解题的能力也是一种能力.
2犀利嘛哈答串题的也是有的.
3有人告诉我价值xx元的礼品都是啥么?呵呵~,我只对是啥感兴趣,并不想要.要是我经过努力得了这,估计也就一丢~~~
4又来补充了:计算任意两数值的商,除数,被除数,这两个数要是可以是带小数点的话,【出题时】应该限定小数点前,小数点后,最多是多少位,让大家以此编程,是不是好点?
如果不限定的话,我把除数搞成小数点后几千位,被除数小数点后几万位,你也不能说错啊。
作者: DAIC 时间: 2013-9-7 23:00
回复 2# terse
set str1=1.234
set str2=2.345
我也测试了一下,第六题确实报错了。
作者: wankoilz 时间: 2013-9-7 23:37
感谢站长,感谢评委!
作者: xpw 时间: 2013-9-7 23:44
建议从答题中,选出每题的最佳代码,好让我们这些后辈学习学习,是用什么思路去想,用什么方法去实现。毕竟如果每个都仔细看完的话,会死不少脑细胞的。。。
作者: terse 时间: 2013-9-8 02:04
回复 20# DAIC
首先谢测试
也谢测试本人六题代码的所有人
请将代码第七行 set "d=" 改为 set "d=0" 试下
作者: PowerShell 时间: 2013-9-11 23:51
本帖最后由 PowerShell 于 2013-9-14 18:25 编辑
第九题,验证结果,只对脚本不对人。我觉得这是磁盘密集型程序.
测试机 硬盘=raid5=各类杂数据600G cpu=i5 4670=3.7G=4核 按说cpu硬盘算较快的,
--2楼--
运行3个bat,都很快就完成了。生成3个dir_list.txt 一样大,生成文件=136k,内容基本相同,不完全相同。很明显目录取的不全,甚至太少.
生成的文件,大致:
f:\DL\Swords.SoldiersCN\Swords.Soldiers\Data\Fonts\defaultFontButtons\HD
0x0750.tga
0x0751.tga
0x0752.tga
0x0753.tga
0x0754.tga
0x0755.tga
0x0756.tga
0x0757.tga
0x0758.tga
0x0759.tga
f:\DL\Swords.SoldiersCN\Swords.Soldiers\Data\Fonts\defaultFontButtons\SD
0x0750.tga
0x0751.tga
0x0752.tga
0x0753.tga
0x0754.tga
0x0755.tga
0x0756.tga
0x0757.tga
0x0758.tga
0x0759.tga
--3楼--
1 脚本不放在f盘根目录,不能干活,不太好。
2 运行的很慢,根目录会产生filera.txt filerb.txt f_record.txt。filera.txt filerb.txt 这两个文件内容很小,频繁在变.
3 出现n多 '群规.txt_1752' 不是内部或外部命令,也不是可运行的程序 ,引号中的是文件名的一部分,貌似这些文件名中含有等号,下划线,左右方括号。
4 出现几十个 [输入行太长]
5 脚本磁盘占用很低,几乎没有写入,cpu占用满了,即cpu频率-3.7G,cpu占用率=40%左右,.而且占用了很久.成了cpu密集型程序.但也搞了1--2个小时左右.等不及了,睡了一觉。也不知道到底搞了多久。
6 弹出n个对话框,每弹出一个,脚本都暂停住了。[该版本的 f:\xxx\98dos\more.com 与你运行的 Windows 版本不兼容。请查看计算机的系统信息,然后联系软件发布者]这个目录有more.com,io.sys 是某dos磁盘目录。
总之,是64位win无法运行16位的more.com 。
7 生成结果f_record.txt = 1.7 MB 结果有重复,如:
"f:\FTP"
"f:\FTP"
"f:\FTP"
7 个文件 510,962 字节
不应该有 【7 个文件 510,962 字节】这行
8 经我肉眼观测,下述目录重复了。但是 f_record.txt中没有列出来
f:\DL\Swords.SoldiersCN\Swords.Soldiers\Data\Fonts\defaultFontButtons\HD
f:\DL\Swords.SoldiersCN\Swords.Soldiers\Data\Fonts\defaultFontButtons\SD
9
f:\111\222\333\444\ 下有 images 这个空目录
f:\aaa\ 下有 images 这个空目录
这两个目录下都有同一个空目录images,这种情况,这个脚本把这种情况算是相同了,我认为这是对题理解的不妥.或者没写代码处理这个。
--5楼--
10秒左右结束,提示:
输入记录超过最大长度。请指定更大的最大限度。
请按任意键继续. . .
生成 F_Record.txt = 0
--6楼--
cpu占用28%,磁盘读写一直都是200k左右,运行2小时左右后,磁盘占用基本为0,而cpu占用高了.运行了23小时左右,还没完,我强制关闭了脚本。
貌似在脚本目录生成了3MB多的list.txt,但我删了,我打算抽空重新运行一遍。这个脚本貌似很久会更新一下list.txt
敢问6楼apang:你这脚本测试时运行了多少小时?我这初步看貌似得2---3天!
--8楼--
脚本中,要测试的文件夹,改成f:后,脚本开始了。在脚本目录生成了temp123这个文件夹,和其中的文件,cpu42%,写盘20k每秒.
运行了23小时左右,一点文本还没出来呢,貌似算法和6楼类似,但比6楼还慢。
敢问8楼 wankoilz :你这脚本测试时运行了多少小时?我这初步看貌似得2---3天!
---我的疑惑---
关于第九题,你们是怎样测试自己的代码的?用了多久?测过其他人的代码么?我建议大家在自己机子上测测。
---第九题测试结论---
1 虽然有很多毛病,相对全的,相对快的是3楼脚本。 ----3楼道:“说那么多废话,还不是我第一?!”
2 倒数第一的应该是5楼。
3 6楼,8楼脚本都太慢。我看至少要3天3夜,这还是我这机子。
【第九题测试 完】
作者: PowerShell 时间: 2013-9-11 23:51
本帖最后由 PowerShell 于 2013-9-13 12:26 编辑
关于第九题,各位的代码
1 能完成此功能么?我产生了疑惑。当然是要那种无特殊字符缺陷的,所有都能取出的。
2 这种程序,扫完一个盘符,最快是多快?
3 我不太会bat。我想知道powershell处理这个问题会如何:
3.1 powershell能完全取出么?----我假想是的。
3.2 powershell处理这些有多快?----我假想应该在1小时内,甚至更快。
3.3 powershell处理这些占用了多少cpu?多少磁盘?----我想不出。
带着这三个问题,我开始了powershell版的解题代码,编写中,敬请期待。。。
作者: apang 时间: 2013-9-12 19:40
啊啊啊,居然是我拿第一?感觉像做梦,嗯嗯,高兴ing
感谢斑竹!感谢管理员!!!
作者: terse 时间: 2013-9-12 21:51
回复 25# PowerShell
首先感谢测试 关于测试代码生成的文件 大小一样目录不一样的问题 可能是因为代码判断的不同
其中用FINDSTR 的代码可能会遇特殊字符时和搜索字符长度相关时会有问题
用FC应该没此类问题 此前有说明的
再次感谢测试
也来感谢斑竹!感谢管理员!
作者: Heykuz 时间: 2013-9-13 11:31
我就看着,超高深。
作者: PowerShell 时间: 2013-9-14 19:12
此楼用于 上powershell脚本- <#
- 第九题
- 根据题意,a目录下有b目录,c文件,d文件。和a目录下有c文件,d文件。为相同目录。也就是说,忽略这个目录中的子目录。
-
- 本脚本在powershell命令行窗口运行时遇 $RECYCLE.BIN ,\System Volume Information, 之类的目录将显示错误,这是正常的,不用理会。
- 欢迎测试
- #>
-
-
-
- Write-Host "把F盘中存在重复情况的目录列举出来`r
- 注意:`r
- 只要文件夹中的文件列表相同,就认为是重复的文件夹,不需要判断大小、日期、md5等。"
-
- [system.reflection.assembly]::loadwithpartialname("System.text.encoding") | Out-Null
- function get-hash-md5($多行字符串)
- {
- $md5 = [System.Security.Cryptography.MD5]::Create()
- $字节数组 = [system.text.encoding]::Unicode.getbytes($多行字符串)
- $md5.ComputeHash($字节数组) | foreach -Begin{$filemd5hashcode=''} -Process{$filemd5hashcode += "{0:x2}" -f $_} -End{return $filemd5hashcode}
- }
-
- function pause2
- {
- Read-Host "已经暂停,请按回车继续 ..."
- }
-
- [system.reflection.assembly]::loadwithpartialname("System.Text") | Out-Null
- [int32]$long = 1024 * 1024 * 128 #128MB
- $大字符串 = New-Object System.Text.StringBuilder($long)
-
- $f盘所有目录 = Get-ChildItem f:\ -Recurse -Force | Where-Object {($_.PsIsContainer -eq $true) -and ( $_.GetFiles().Count -ne 0)}
- write-host "需要处理的目录数为:" $f盘所有目录.Length
-
- foreach ($aaa in $f盘所有目录)
- {
-
- $文件名列表哈希 = get-hash-md5 $aaa.GetFiles().name
- $字符串 = "" + $aaa.GetFiles().Count + "`t" + $aaa.FullName + "`t" + $文件名列表哈希
- $大字符串.AppendLine($字符串) | Out-Null
- # pause2
- }
-
- Add-Content "d:\f盘重复目录信息.txt" -value $大字符串
- #哈希值相同的,目录为重复目录,格式为:
- #47 F:\下载 1b7ae701a986cef7046ae48830315946
-
- write-host '------------------------脚本第二部分,对【d:\f盘重复目录信息.txt】进行数据处理-------------------------------'
- #
-
- $第一步 = Get-Content d:\f盘重复目录信息.txt | Select-Object @{N="目录路径";E={[string]$_.split("`t")[1]}},@{N="文件名列表哈希2";E={[string]$_.split("`t")[2]}} |Group-Object 文件名列表哈希2
- foreach ( $aaa in $第一步 )
- {
- if ($aaa.count -gt 1)
- {
- $aaa.group.目录路径 >> d:\f盘重复目录最终结果.txt
- "-----------------------------------------------" >> d:\f盘重复目录最终结果.txt
- }
-
- }
复制代码
作者: apang 时间: 2013-9-14 21:28
本帖最后由 apang 于 2013-9-15 17:23 编辑
回复 24# PowerShell
敢问6楼apang:你这脚本测试时运行了多少小时?我这初步看貌似得2---3天!
此代码运行速度与分区中目录总数及文件总数有关,与相同的目录个数有关,而与硬盘数据大小没有直接关系。本人代码没有考虑分区中目录总数几千几万,文件总数几万几亿的情况。
在我的本本上(acer aspire 4750g,Win7 sp1),d:盘 1018个目录,7859个文件,测试用时10分14秒,生成List.txt大小44.9KB,List.txt中相同目录个数为451个
-------------------------------------------------------------------------------------------------------------
今天又测试,代码第12行改成: if /i not "%%a.tx"=="%%b" if not "!#%%a!!#%%~nb!"=="11" (
同样测试D盘,效率有所提高,用时=4分38秒,生成的List.txt与修改前相同
作者: PowerShell 时间: 2013-9-15 11:14
[attach]6776[/attach]
第九题,验证结果,只对脚本不对人。我觉得这是磁盘密集型程序.
测试机 硬盘=raid5=各类杂数据600G cpu=i5 4670=3.7G=4核 按说cpu硬盘算较快的,
现在公司文件服务器上的数据,动辄3---4tb不新鲜。600g不算多。根目录+各级非空子目录=2万多个,也不算多。
想知道你的f盘,总共有多少个非空目录么?用下述语句即可:- $f盘所有目录 = Get-ChildItem f:\ -Recurse -Force | Where-Object {($_.PsIsContainer -eq $true) -and ( $_.GetFiles().Count -ne 0)}
- write-host "需要处理的目录数为:" $f盘所有目录.Length
复制代码
我的powershell脚本,计算总用时=1分50秒
我的powershell脚本,首先获取f盘所有目录,这时raid盘叽里呱啦响,磁盘读1.7M---2.5M,写280k左右。cpu占9%
然后算目录中文件的md5,此时磁盘读写很低,cpu占29%左右。
然后向d盘写一个临时文件,【f盘重复目录信息.txt】,其内容 如:
10 F:\DL\Cpbcw_20110918215925\Tetris\Blocks 2e8961dee211345fab07eeba8ab7110f
第一部分是这个目录含有的文件数,第二部分是路径,第三部分是文件名列表的md5码
当然这个步骤不是必须。如果没有此步骤,脚本更快。
然后进入第二部分,对此临时文件进行处理。生成最终结果文件。【f盘重复目录最终结果.txt】3.3MB 为unicode编码,变成ansi编码应该 1.8 MB左右。
内容大概是这样:
----------------------------------------------
F:\软件仓库\装机软件\DRV\TL-WN811N_851N_910N_951N\Driver Files\Win2000
F:\软件仓库\装机软件\DRV\TL-WN811N_851N_910N_951N\Driver Files\WinXP\32
-----------------------------------------------
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\ar
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\bg
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\ca
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\cs
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\da
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\de
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\el
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\es
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\et
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\eu
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\fi
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\fr
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\he
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\hr
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\hu
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\id
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\it
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\ja
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\ko
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\lt
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\lv
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\ms
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\nl
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\no
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\pl
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\pt
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\pt-BR
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\ro
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\ru
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\sk
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\sl
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\sr-Cyrl-CS
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\sr-Latn-CS
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\sv
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\th
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\tr
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\uk
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\vi
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\zh-Hans
F:\DL\Cpbcw_20110918215925\Tetris\Bin\Debug\zh-Hant
-----------------------------------------------
F:\软件仓库\装机软件\DRV\TL-WN811N_851N_910N_951N\Driver Files\Vista\32
F:\软件仓库\装机软件\DRV\TL-WN851N 2.0 Win7 Beta版驱动\X86
-----------------------------------------------
F:\软件仓库\装机软件\DRV\TL-WN811N_851N_910N_951N\Driver Files\Vista\64
F:\软件仓库\装机软件\DRV\TL-WN851N 2.0 Win7 Beta版驱动\X64
----------------------------------------------------
我特意查找了下,有下述这两个目录
f:\DL\Swords.SoldiersCN\Swords.Soldiers\Data\Fonts\defaultFontButtons\HD
f:\DL\Swords.SoldiersCN\Swords.Soldiers\Data\Fonts\defaultFontButtons\SD
---结论---
1这道题被powerhshell完美地解决了,没有什么特殊目录取不出来的,没有多取,没有少取。没有误取。用bat貌似没人能实现。
2快速。用bat貌似没人能实现。
3因权限问题读取不了的目录文件,除外。
---致出题人---
1 就好像考大学一样,经常有一年的题出的难了,我看今年的第九题就是如此。所以大家答得都不好。
2 不妨搞一个2013年bat编程大赛外传,还是第九题:
不限制用任何语言,不限制同时用2种语言(如vbs嵌入bat等)不限制任何外部程序。
如果可以用任何外部程序,这道题解起来貌似好写多了吧。
3 我希望能用【1分50秒】给大家砸来出点,写脚本的激情。
作者: Batcher 时间: 2013-9-15 15:40
开始发奖
作者: tt-xb 时间: 2014-1-12 10:40
这些一定都是高手的高手
作者: ssk 时间: 2014-1-25 14:32
有没有比赛战果展示?
作者: ssk 时间: 2014-1-25 14:34
回复 31# PowerShell
powershell是强大点!
作者: hua5551 时间: 2014-4-28 09:06
新人路過學習下、、
作者: allanliuzhi 时间: 2014-7-21 20:27
好高兴,可以学到很多东西了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |