标题: 【练习-021】按要求对文件夹中文件进行统计操作的批处理 [打印本页]
作者: batman 时间: 2008-9-4 17:40 标题: 【练习-021】按要求对文件夹中文件进行统计操作的批处理
出题目的:
通过解题熟练掌握for+dir的用法
解题要求:
1 代码高效简洁
2 不生成临时文件
3 通用性好
加分原则:
1 思路独特基分5分
2 代码高效基分4分
3 代码简洁基分3分
4 无临时文件基分2分
5 通用性好基分1分
6 完美代码加15分
题目如下:
已知文件夹下有子文件夹和诺干txt文件以及批处理test.bat(见图1),其中每
个子文件夹下有诺干txt文件(见图2)要求运行test.bat后生成list.txt并删除test.bat
(见图3),生成的list.txt如下(同文件夹下的文件目录要求5个一排并对齐,两个文
件夹目录用空行格开):
- 本目录下有文本文件5个:
- 本局.txt 电信.txt 水电局.txt 水电站.txt 网吧.txt
-
- 伏波路子文件夹中有文本文件12个:
- 王家洲.txt 湾塘.txt 教师新村.txt 国税局.txt **.txt
- 潇湘双语.txt 移动.txt 税务局.txt 教师村.txt 石港路.txt
- 纸厂.txt 桔园.txt
-
- 渌滨路子文件夹中有文本文件3个:
- 渌滨.txt 伏坡岭.txt 伏波.txt
- ............
- 向阳南路子文件夹中有文本文件17个:
- 电力局.txt 向阳小区.txt 劳动局.txt 林业局.txt 水利局.txt
- 烟草.txt 环保局.txt 民政局.txt 畜牧.txt 向阳南路.txt
- 津口路.txt 向阳.txt 津口东路.txt 世纪.txt **.txt
- 保险.txt 发展.txt
-
- E:\文档资料\局域网\批处理\huafe\中总共有文本文件121个
复制代码
补充一点:
文本文件名中最多有6个汉字,最少有2个汉字(全是汉字)
作者: pusofalse 时间: 2008-9-4 17:50
这题之所以分为文本处理类是因为list.txt中的列表要对其吧?~做过一次才知道这题综合性好强。
[ 本帖最后由 pusofalse 于 2008-9-4 19:19 编辑 ]
作者: Batcher 时间: 2008-9-4 20:50
对齐的时候,需要考虑文件名长度大于80(甚至几百)的情况不?
作者: shqf 时间: 2008-9-4 22:17
- @echo off
- Setlocal Enabledelayedexpansion
- set totle=0
-
- call :shuchu "" 本目录下
-
- for /f "skip=2 tokens=4" %%a in ('dir *^|find "DIR"') do (
- call :shuchu %%a\ %%a子文件夹中
- )
-
- echo %~d0%~p0中总共有文本文件%totle%个>>list
- ren list list.txt
- set n=,m=,totle=
- del %0
- exit
-
- :shuchu
- for /f %%a in ('dir /d %1*.txt^|find "个文件"') do (
- set /a totle=%totle%+%%a
- echo %2有文本文件%%a个:>>list
- )
-
- set "kong= "&set n=0
- for /f %%a in ('dir /b %1*.txt') do (
- set /a n+=1&set "str=%%a%kong%"
- set /p =!str:~,10! <nul>>list
- set /a quyu=!n!%%5
- if !quyu! equ 0 echo.>>list
- )
- echo.>>list
- echo.>>list
复制代码
[ 本帖最后由 shqf 于 2008-9-4 22:19 编辑 ]
作者: namejm 时间: 2008-9-4 22:37
为什么偏偏是5个一排而不是4个一排呢?要是4个一排的话,dir /w就搞定了^_^。
作者: terse 时间: 2008-9-5 02:01
- @echo off&setlocal enabledelayedexpansion
- set mn=1
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- set "str=%%~nxi "
- set/a n+=1,m=n%%5
- call:lp
- )
- >list.txt echo 本目录下有文本文件!n!个
- for /l %%a in (1 1 %mn%) do if "!%%a!" neq "" >>list.txt echo.!%%a!
- echo.>>list.txt
- set/a nm=mn+1,mn+=1,t+=n,n=0
- for /f "delims=" %%a in ('dir /b /ad') do (
- for /f "delims=" %%i in ('dir /b /a-d "%%a\*.txt"') do (
- set var=%%a
- set "str=%%~nxi "
- set/a n+=1,m=n%%5
- call:lp
- )
- if defined var (
- >>list.txt echo.!var!子文件夹中有文本文件!n!个:&set var=
- for /l %%b in (!nm! 1 !mn!) do if "!%%b!" neq "" >>list.txt echo.!%%b!
- )
- echo.>>list.txt
- set/a nm=mn+1,mn+=1,t+=n,n=0
- )
- >>list.txt echo %~dp0中总共有文本文件%t%个
- del %0
- pause&exit
- :lp
- if %m% equ 0 (set/a mn+=1&set "%mn%=!%mn%!%str%") else set "%mn%=!%mn%!%str%"
复制代码
精简点
- @echo off&setlocal enabledelayedexpansion
- set/a mn=1,nm=1&set "var1=%~dp0"
- for /f "delims=" %%i in ('dir /s/b *.txt') do (
- set "var=%%~dpi"&set "str=%%~nxi "
- if "!var!" neq "!var1!" call:lp0
- set/a n+=1,m=n%%5
- call:lp
- )
- call:lp0
- >>list.txt echo %~dp0中总共有文本文件%t%个
- del %0
- pause&exit
- :lp
- set var1=!var!
- if %m% equ 0 (set/a mn+=1&set "%mn%=!%mn%!%str%") else set "%mn%=!%mn%!%str%"
- goto:eof
- :lp0
- if !nm! equ 1 (>list.txt echo 本目录下有文本文件!n!个) else (
- set var1=!var1:%~dp0=!
- >>list.txt echo !var1:~,-1!子文件夹中有文本文件!n!个)
- for /l %%i in (!nm! 1 !mn!) do if "!%%i!" neq "" >>list.txt echo.!%%i!
- echo.>>list.txt
- set/a nm=mn+1,mn+=1,t+=n,n=0
复制代码
[ 本帖最后由 terse 于 2008-9-5 03:05 编辑 ]
作者: pusofalse 时间: 2008-9-5 13:52
- @echo off&setlocal enabledelayedexpansion
- set "space= "
- :lp
- for /f "delims=" %%a in ('dir/b %1') do (
- if /i "%%~fsa" neq "%~fs0" if exist "%%a\" (
- call :lp "%%a"
- ) else (
- if /i "%%~xa" equ ".txt" set/a #%~1+=1&set "_%~1=!_%~1!"%%a" "
- ))
- set/a m=0
- (echo %~1目录中有!#%~1!个文本文件:
- for %%i in (!_%~1!) do (
- set/a m+=1,mod=m%%5,x+=1
- set "var=%%~i%space%"
- set/p=!var:~,10! <nul
- if !mod! equ 0 echo.
- )
- echo.&echo.)>>list.txt
- if "%~1" equ "" echo %~dp0中共有%x%个文本文件>>list.txt&start list.txt
复制代码
- @echo off&setlocal enabledelayedexpansion
- set "space= "
- for /r %%a in (*.txt) do (
- set "pat=%%~dpa"&set "pat=!pat:~,-1!"
- for %%i in (!pat!.tmp) do set "_%%~ni=!_%%~ni!"%%~nxa" "&set/a .%%~ni+=1
- )
- for /f "tokens=1* delims==_" %%a in ('set _') do (
- set m=0
- echo %%a中共有!.%%a!个文本文件:
- for %%i in (%%b) do (
- set "x=%%~i%space%"
- set/a m+=1,mod=m%%5,c+=1
- set/p=!x:~,10! <nul&if !mod! equ 0 echo.
- )
- echo.&echo.
- )>>list.txt
- echo %~dp0中共有%c%个文本文件>>list.txt
- start list.txt
复制代码
- @echo off&setlocal enabledelayedexpansion
- set "space= "
- for /r %%a in (*.txt) do set ".%%~pa=!.%%~pa!"%%~nxa" "&set/a _%%~pa+=1
- for /f "delims==." %%a in ('set .') do (
- set "var=%%a"&set n=0
- echo !var:%~p0=!中有!_%%a!个文本文件:
- for %%i in (!.%%a!) do (
- set "str=%%~i%space%"
- set/a n+=1,mod=n%%5,c+=1
- set/p=!str:~,10! <nul
- if !mod! equ 0 echo.
- )
- echo.&echo.
- )>>list.txt
- echo %~dp0中共有%c%个文本文件。>>list.txt
- start list.txt
复制代码
作者: batman 时间: 2008-9-5 14:12 标题: 我再来抛下砖吧
- @echo off&setlocal enabledelayedexpansion
- set "str=本目录"
- for /f "delims=" %%i in ('dir /ad /b') do set "str=!str! %%i"
- for %%a in (%str%) do (
- if "%%a" equ "本目录" (
- set "p="
- ) else (
- set "p=%%a\"
- )
- set /a m=0,n=0,v=0
- for /f "delims=" %%i in ('dir /b !p!*.txt') do (
- set "var=%%~nxi "&set /a n+=1,v+=1
- call,set "%%a!m!=%%%%a!m!%%!var:~,10!"
- if !n! equ 5 set /a n=0,m+=1
- )
- set /a num+=v,m-=1
- echo %%a下有文本文件!v!个:>>list.txt
- for /l %%m in (0,1,!m!) do echo !%%a%%m!>>list.txt
- echo.>>list.txt
- )
- echo %~dp0下总共有文本文件%num%个>>list.txt
- start list.txt&del /q %0
复制代码
[ 本帖最后由 batman 于 2008-9-5 14:42 编辑 ]
作者: batman 时间: 2008-9-5 14:20
原帖由 pusofalse 于 2008-9-5 13:52 发表
@echo off&setlocal enabledelayedexpansion
set "space= "
:lp
for /f "delims=" %%a in ('dir/b %1') do (
if /i "%%~fsa" neq "%~fs0" if exist "%%a\" (
call :lp "%%a"
...
空行处理不完全正确,有时会多出一空行来。。。
作者: batman 时间: 2008-9-5 14:30
&&在我题目的最后我补上了这句话:文本文件名中最多有6个汉字,最少有2个汉字(全是
汉字),可能大家只注意到了“6”,而没有注意“汉字”,对汉字字符进行对齐在字符后补
英文空格" "是不行的,而要补汉字空格" ",shqf和terse兄弟显然是忽视了这点了。
ps:这是道综合性极强的题目,希望大家不要以现有的方案为满足,都来动动手,想一想还有
没有更完美的解决方案!
[ 本帖最后由 batman 于 2008-9-5 14:33 编辑 ]
作者: pusofalse 时间: 2008-9-5 14:33 标题: 回复 9楼 的帖子
三个代码我这里测试正常,还请BATMAN兄把你的测试结果贴上来,再分析一下。
作者: batman 时间: 2008-9-5 14:46
原帖由 pusofalse 于 2008-9-5 14:33 发表
三个代码我这里测试正常,还请BATMAN兄把你的测试结果贴上来,再分析一下。
测试结果如下:
- 中有5个文本文件:
- 本局.txt 电信.txt 水电局.txt 水电站.txt 网吧.txt
-
- 伏波路\中有12个文本文件:
- 王家洲.txt 湾塘.txt 教师新村.txt 国税局.txt 检察院.txt
- 潇湘双语.txt 移动.txt 税务局.txt 教师村.txt 石港路.txt
- 纸厂.txt 桔园.txt
- 南江北路\中有13个文本文件:
- 建材小区.txt 交警.txt 交通局.txt 物资局.txt 南江北路.txt
- 接龙桥.txt 农机公司.txt 二五一.txt 铁路.txt 建材.txt
- 渌园路.txt 石油.txt 七六三一八.txt
- 南江南路\中有10个文本文件:
- 地税局.txt 杨家山.txt 一医院.txt 育红小学.txt 农业局.txt
- 工商银行.txt 粮食局.txt 东风.txt 南江南路.txt 姚家岭.txt
-
- 向阳北路\中有15个文本文件:
- 农行.txt 城信.txt 信用联社.txt 金丰.txt 卫生局.txt
- 向阳北路.txt 文化路.txt 桑园.txt 台湾村.txt 向阳路.txt
- 开发区.txt 客运公司.txt 黄金西路.txt 黄金东路.txt 卫生.txt
-
- 向阳南路\中有17个文本文件:
- 电力局.txt 向阳小区.txt 劳动局.txt 林业局.txt 水利局.txt
- 烟草.txt 环保局.txt 民政局.txt 畜牧.txt 向阳南路.txt
- 津口路.txt 向阳.txt 津口东路.txt 世纪.txt 武警.txt
- 保险.txt 发展.txt
- 学堂路\中有25个文本文件:
- 财政局.txt 县政府.txt 县委.txt 人大.txt 自来水.txt
- 箭台.txt 工商局.txt 法院.txt 建设局.txt 教育局.txt
- 建委.txt 外贸局.txt 派出所.txt 司法局.txt 房产局.txt
- 政府.txt 审计局.txt 商业局.txt 组织.txt 班竹塘.txt
- 学堂路.txt 班竹圹.txt 斑竹塘.txt 津口西路.txt 甘塘坡.txt
-
- 渌滨路\中有3个文本文件:
- 渌滨.txt 伏坡岭.txt 伏波.txt
- 漉浦东路\中有9个文本文件:
- 熙园.txt 梅苑.txt 五中.txt 公安局.txt 双月.txt
- 棉织厂.txt 公路局.txt 漉浦东路.txt 黎韶.txt
- 漉浦西路\中有12个文本文件:
- 国土.txt 邮政局.txt 火花塞.txt 中医院.txt 湘火炬.txt
- 农业发展银行.txt 火车.txt 菜码头.txt 渌口中学.txt 漉浦路.txt
- 火花.txt 五二六.txt
- E:\文档资料\局域网\批处理\huafe\中共有121个文本文件。
复制代码
有的目录下多出了空行。。。
作者: terse 时间: 2008-9-5 18:48
原帖由 batman 于 2008-9-5 14:30 发表
&&在我题目的最后我补上了这句话:文本文件名中最多有6个汉字,最少有2个汉字(全是
汉字),可能大家只注意到了“6”,而没有注意“汉字”,对汉字字符进行对齐在字符后补
英文空格" "是不行的,而要补汉字空格 ...
怎么回事呢?我应该补的就是“ ” 贴上的变化吧
%mn%=!%mn%!%str%
而且我没用截位的 因为无须的
作者: shqf 时间: 2008-9-5 20:36
我补的是汉字空格,本地VISTA下测试通过,好象没错呵。
[ 本帖最后由 shqf 于 2008-9-5 20:39 编辑 ]
作者: 随风 时间: 2008-9-6 22:23
我也来一个
...- @echo off&set /a m=0&del/q list.txt 2>nul
- call :loop "%cd%" 本目录
- for /f "delims=" %%i in ('dir/b/ad') do call :loop "%%i" "%%~nxi"
- start list.txt
- del/q "%~0"
- :loop
- Setlocal Enabledelayedexpansion
- for /f "delims=" %%a in ('dir/b "%~1\*.txt"2^>nul') do (
- set /a b+=^^!n,n+=1,n=n%%5,m+=1
- set "str=%%~nxa "
- call "set var!b!=%%var!b! !str:~0,10!"
- )
- >>list.txt echo %~2里有!m!个文件
- for /l %%l in (1 1 !b!) do >>list.txt echo !var%%l!
- >>list.txt echo\
- endlocal&goto :eof
复制代码
[ 本帖最后由 随风 于 2008-9-10 20:27 编辑 ]
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |