标题: [ 新手练习题 9 ]批处理显示指定数目INF文件的第一行内容 [打印本页]
作者: wxcute 时间: 2009-7-28 17:12 标题: [ 新手练习题 9 ]批处理显示指定数目INF文件的第一行内容
[ 新手练习题 9 ] 显示指定数目 INF 文件的第一行内容
查找系统盘下 INF 文件,并显示头四个文件的第一行内容。
若文件不到四个则循环显示,直到显示四个条目;若找不到文件则显示不存在。
目的:学习 FOR 或 DIR 遍历文件的方法。
要求:显示时文件名在前,第一行内容在后;或分行也行。
方法不限。
输出示例一:c:\a.inf
[批处理之家]
c:\b.inf
[新手练功区]
c:\c.inf
[BATHOME]
c:\d.inf
[junior]
输出示例二:c:\1.inf
[BAT]
c:\2.inf
[BATHOME]
c:\3.inf
[BBS.bathome.net]
c:\1.inf
[BAT]
评分:代码可读性 1 分;
首个新方法 6 分,第二个 5 分,依次类推,最少 2 分;
一人可多种方法,新方法追加 2 分,已经出现过的方法追加 1 分。
=================================
2009-08-15 六 题目修正
一、“直到显示四遍” 中的 “遍” 改为 “个条目”;
二、增加文件数不足时的显示示例。
[ 本帖最后由 wxcute 于 2009-8-15 21:28 编辑 ]
作者: Lumiere 时间: 2009-7-31 09:05
晕啊,88次浏览还没一个回复,这年头都不是新手了啊,呵呵,那我这个新手来抛砖引玉,顶一顶吧。- @echo off
- setlocal enabledelayedexpansion
- :repeat
- set /a n=0,count+=1
- for /f "delims=" %%a in ('dir /a-d /s/b *.inf 2^>nul^|^|echo Alert') do (
- if "%%a"=="Alert" goto :eof
- set /a n+=1
- call :show "%%a"
- if !n! equ 4 goto :eof
- )
- if %count% lss 4 goto repeat
- :show
- for /f "delims=" %%b in ('type %1') do echo %~1第一行为%%b>>c.txt&goto :eof
复制代码
作者: inittab 时间: 2009-7-31 18:43
没事,新手来了。呵呵
系统盘下是指C:盘吗?
- @echo off&setlocal enabledelayedexpansion
- for /r C:\ %%b in (*.inf) do (
- set /a m+=1
- if !m! leq 4 (echo;%%b&set/p aa=<%%b&echo;!aa!&echo;) else pause&goto :eof
- )
复制代码
本来写的是遍历c~z盘的。后来发现for /r %drivers% 嵌套于另一个for 里边。 %drivers%变量就会失效,只能用goto 循环,大家有发现这个现像吗?
[ 本帖最后由 inittab 于 2009-7-31 18:54 编辑 ]
作者: keen 时间: 2009-7-31 19:12 标题: 回复 3楼 的帖子
挑挑刺^_^
你的代码没考虑没有inf文件的情况,一旦没有inf文件,就进入到死循环。
按照楼主的意思应该显示四个inf文件,当少于四个inf文件时,你的代码只显示仅有的inf文件。也就是只有两个时,你只显示两个。
你的代码应该在if的括号里,最后在加个&pause,否则看不到inf文件信息。
作者: keen 时间: 2009-7-31 19:24 标题: 回复 2楼 的帖子
继续挑刺^_^
为什么我测试你的代码,有问题。
当inf文件个数是2时,就是由两个inf文件时,会显示8个条目,应该按照楼主的意思显示4个条目呀。
作者: wxcute 时间: 2009-7-31 20:51
此题要点有三
一、遍历INF文件
二、显示文本部分内容如何跳出
三、循环次数控制
一些细节暂不考虑在此题范围内,因为那样的话会使题目难度加大。如:
遍历INF文件时可能会把INFO文件也算进去
隐藏文件问题
非 ANSI 编码问题
作者: tireless 时间: 2009-7-31 20:58
- @echo off
- setlocal enabledelayedexpansion
- set n=0
-
- :loop
- (for /r %SystemDrive%\ %%a in (*.inf) do (
- echo %%a
- set /p var=<"%%a"
- echo;!var!
- echo;
- set /a n+=1, "1/(n-4)" || (pause & exit /b)
- )) 2>nul || (echo %SystemDrive% 下不存在 inf 文件 & pause & exit /b)
-
- if %n% lss 4 goto loop
复制代码
[ 本帖最后由 tireless 于 2009-7-31 21:08 编辑 ]
作者: tireless 时间: 2009-7-31 22:07 标题: 回复 7楼 的帖子
改成这样:- @echo off
- setlocal enabledelayedexpansion
- set n=0
-
- :loop
- (for /f "delims=" %%a in ('dir /a-d/b/s *.inf') do (
- echo %%a
- set /p var=<"%%a"
- echo;!var!
- echo;
- set /a n+=1, "1/(n-4)" || (pause & exit /b)
- )) 2>nul || (echo %SystemDrive% 下不存在 inf 文件 & pause & exit /b)
-
- if %n% lss 4 goto loop
复制代码
作者: inittab 时间: 2009-8-1 20:31 标题: 回复 4楼 的帖子
恩,多谢指出~~
后两条确实。做的时候不认真,该打PP。
发现有这个题目有点意思,特别是inf文件不够4个的时候。需要循环显示。费了一番脑筋。
改进代码如下:- @echo off&setlocal enabledelayedexpansion
- :begin
- for /r %SYSTEMDRIVE% %%b in (*.inf) do (
- set /a m+=1
- if !m! leq 4 (echo;%%b&set/p aa=<%%b&echo;!aa!&echo;) else pause&goto :eof
- )
-
- if not defined m (echo inf文件不存在!) else if !m! leq 4 goto begin
- pause&goto :eof
复制代码
[ 本帖最后由 inittab 于 2009-8-1 20:33 编辑 ]
作者: Lumiere 时间: 2009-8-1 23:53 标题: 回复 7楼 的帖子
tireless兄该代码似乎与你发的一个帖子有关,如果我没猜错的话肯定是在解答这个题目的时候出现的疑惑,所以才会那个帖子。如果for的返回码真的那么复杂的话,如此看来代码应该可靠性不太好。不知道这个问题到底如何解决。
作者: nopr 时间: 2009-8-5 14:31 标题: 辛苦答题
这道题不好搞好,我用了一天啊,,可以还不理想.- @echo off
- setlocal enabledelayedexpansion
- for /r c:\ %%i in (*.inf) do (set /p a=<%%i
- echo %%i !a! >>a.txt)
- for /f "delims=\ tokens=7,* " %%j in (a.txt) do (
- set/a b+=1
- if !b! leq 4 (for %%k in (%%j) do echo %%k) else goto 1)
- :1
- del a.txt&pause>nul
复制代码
作者: Lumiere 时间: 2009-8-7 12:20 标题: 回复 5楼 的帖子
没问题啊,楼主说循环显示四次,两个文件乘以4不就是8么?晕……
作者: poxi 时间: 2010-7-19 22:39
不会,,真的不会......>> 和 ||一点都不懂...
等以后会了再来.......
作者: broly 时间: 2010-7-22 11:22
绝对自己写的,事先没有看过别人代码
- @echo off &setlocal enabledelayedexpansion
- :label1
- for /r %systemdrive%\ %%i in (*.inf) do (
- set /a m+=1 & if !m! gtr 4 goto label2
- set /p str=<"%%i"
- echo %%i
- echo !str!
- echo,)
- if defined m (if !m! lss 4 goto label1) else (echo 文件不存在!)
- :label2
- pause>nul
复制代码
[ 本帖最后由 broly 于 2010-7-22 11:30 编辑 ]
作者: lvsehuaxue 时间: 2010-9-20 19:01
@echo off
setlocal enabledelayedexpansion
for /r %systemdrive%\ %%i in (*.inf) do (
set /a n+=1
if !n! gtr 4 goto a
echo %%i
set /p v=<%%i
echo !v!
)
:a
作者: lvsehuaxue 时间: 2010-9-20 19:03 标题: 刚才少传了
@echo off
setlocal enabledelayedexpansion
for /r %systemdrive%\ %%i in (*.inf) do (
set /a n+=1
if !n! gtr 4 goto a
echo %%i
set /p v=<%%i
echo !v!
)
:a
pause >nul
作者: Hello123World 时间: 2011-7-27 16:34
- @echo off
- (For /f "tokens=2* delims=:" %%i in ('Findstr /n ".*" "*.txt"') do If "%%i"=="1" echo %%j)>1.txt
- pause
复制代码
作者: 慕夜蓝化 时间: 2014-12-30 21:14
回复 3# inittab
嗯嗯,我之前碰到了这个问题,也是一直没有想明白是怎么回事,论坛里好像也有人测试过,没弄出个所以然。。。for /r 的这种情况确实只有在嵌套于另一个for中时,无论是设置变量,还是直接引用前一个for返回的值,都不能显示我们想要的结果。如果使用单独for /r 后跟参数都没问题,或者在一个for中使用 call,命令也可以通过。这是你即使为%%i重新赋予新的变量名都没有问题,但是,如果你开启了变量延迟,并且使用了!var!,那么它仍然无法正常显示>_<。也就是for /r 之后不能有"!"。
在这里顺便求下说明。先谢过了!
作者: 慕夜蓝化 时间: 2014-12-30 21:27
本帖最后由 慕夜蓝化 于 2014-12-30 21:29 编辑
- @echo off
- setlocal enabledelayedexpansion
- dir /s/b/aa c:\*inf >1.txt 2>nul||echo,没有inf文件&goto :end
- set "n=0"
- :a
- if %n% equ 4 goto :end
- more +%n% 1.txt >2.txt
- set/p a=<2.txt
- echo,%a%:&set/p b=<"%a%"&set/p=!b!<nul&echo,&set "b="
- set/a n+=1
- goto :a
- :end
- pause>nul&exit
复制代码
这里是完全脱离for命令的一个尝试,一直以来,我都在想,除了for命令,还有那些命令能作用与行,也是前天刚刚想到 more +n and set/p 可以做到,但是相对于for来说可能比较麻烦一点。
作者: dengyuli 时间: 2015-1-2 21:06
本帖最后由 dengyuli 于 2015-1-3 10:42 编辑
- @echo off
- setlocal enabledelayedexpansion
- set ctr=0
- set "infs="
- echo 请稍等……
- for /f "delims=? tokens=* eol=" %%a in ('dir /s /b !systemdrive!') do (
- set str=%%a
- if "!str:~-4!"==".inf" set infs=!infs!,"!str: =`!" & set /a ctr+=1
- if !ctr! geq 4 goto:show
- if !ctr!==0 exit
- )
-
- set ctrt=0
- for %%a in (!infs!!infs!!infs!!infs!) do (
- set ctr=0
- set t=%%a
- set str=!t:`= !
- for /f "delims=~ tokens=* eol=?" %%b in ('type !str!') do (
- if !ctr! == 0 echo !str! & echo %%b & set ctr=1 & set /a ctrt+=1
- )
- if !ctrt! geq 4 pause>nul & exit
- )
-
- :show
- for %%a in (!infs!) do (
- set ctr=0
- set t=%%a
- set str=!t:`= !
- for /f "delims=~ tokens=* eol=?" %%b in ('type !str!') do (
- if !ctr! == 0 echo !str! & echo %%b & set ctr=1
- )
- )
- pause>nul
复制代码
作者: ann 时间: 2015-1-7 14:46
献丑了- @echo off
- Setlocal enabledelayedexpansion
- for /r F:\ %%a in (*.inf) do (if not "!js!" equ "4" (set aa=%%a&call :xs) else (goto end))
- echo 不存在inf文件!
- pause>nul&exit
- :xs
- echo %aa%
- set /p nr=<%aa%
- echo %nr%
- echo.&set /a js+=1&goto :eof
- :end
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |