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

[ 新手练习题 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 编辑 ]
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

晕啊,88次浏览还没一个回复,这年头都不是新手了啊,呵呵,那我这个新手来抛砖引玉,顶一顶吧。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :repeat
  4. set /a n=0,count+=1
  5. for /f "delims=" %%a in ('dir /a-d /s/b *.inf 2^>nul^|^|echo Alert') do (
  6.     if "%%a"=="Alert" goto :eof
  7.     set /a n+=1
  8.     call :show "%%a"
  9.     if !n! equ 4 goto :eof
  10. )
  11. if %count% lss 4 goto repeat
  12. :show
  13. for /f "delims=" %%b in ('type %1') do echo %~1第一行为%%b>>c.txt&goto :eof
复制代码
1

评分人数

    • wxcute: 少校也“冒充”新手?^_^PB + 7
Still with wax

TOP

没事,新手来了。呵呵
系统盘下是指C:盘吗?

  1. @echo off&setlocal enabledelayedexpansion
  2. for /r C:\ %%b in (*.inf) do (
  3. set /a m+=1
  4. if !m! leq 4 (echo;%%b&set/p aa=<%%b&echo;!aa!&echo;) else pause&goto :eof
  5. )
复制代码



本来写的是遍历c~z盘的。后来发现for /r %drivers% 嵌套于另一个for 里边。 %drivers%变量就会失效,只能用goto 循环,大家有发现这个现像吗?

[ 本帖最后由 inittab 于 2009-7-31 18:54 编辑 ]
1

评分人数

    • wxcute: 不错。系统盘可用%SYSTEMDRIVE%表示。有几个 ...PB + 5

TOP

回复 3楼 的帖子

挑挑刺^_^

你的代码没考虑没有inf文件的情况,一旦没有inf文件,就进入到死循环。
按照楼主的意思应该显示四个inf文件,当少于四个inf文件时,你的代码只显示仅有的inf文件。也就是只有两个时,你只显示两个。
你的代码应该在if的括号里,最后在加个&pause,否则看不到inf文件信息。
(*^_^*)

TOP

回复 2楼 的帖子

继续挑刺^_^

为什么我测试你的代码,有问题。
当inf文件个数是2时,就是由两个inf文件时,会显示8个条目,应该按照楼主的意思显示4个条目呀。
1

评分人数

    • wxcute: 说的是,没有仔细检测。PB + 1
(*^_^*)

TOP

此题要点有三
一、遍历INF文件
二、显示文本部分内容如何跳出
三、循环次数控制

一些细节暂不考虑在此题范围内,因为那样的话会使题目难度加大。如:
遍历INF文件时可能会把INFO文件也算进去
隐藏文件问题
非 ANSI 编码问题
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. :loop
  5. (for /r %SystemDrive%\ %%a in (*.inf) do (
  6.   echo %%a
  7.   set /p var=<"%%a"
  8.   echo;!var!
  9.   echo;
  10.   set /a n+=1, "1/(n-4)" || (pause & exit /b)
  11. )) 2>nul || (echo %SystemDrive% 下不存在 inf 文件 & pause & exit /b)
  12. if %n% lss 4 goto loop
复制代码

[ 本帖最后由 tireless 于 2009-7-31 21:08 编辑 ]
1

评分人数

    • wxcute: 显示次数上控制有缺陷。PB + 4

TOP

回复 7楼 的帖子

改成这样:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. :loop
  5. (for /f "delims=" %%a in ('dir /a-d/b/s *.inf') do (
  6.   echo %%a
  7.   set /p var=<"%%a"
  8.   echo;!var!
  9.   echo;
  10.   set /a n+=1, "1/(n-4)" || (pause & exit /b)
  11. )) 2>nul || (echo %SystemDrive% 下不存在 inf 文件 & pause & exit /b)
  12. if %n% lss 4 goto loop
复制代码
1

评分人数

TOP

回复 4楼 的帖子

恩,多谢指出~~
后两条确实。做的时候不认真,该打PP。
发现有这个题目有点意思,特别是inf文件不够4个的时候。需要循环显示。费了一番脑筋。

改进代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. :begin
  3. for /r %SYSTEMDRIVE% %%b in (*.inf) do (
  4. set /a m+=1
  5. if !m! leq 4 (echo;%%b&set/p aa=<%%b&echo;!aa!&echo;) else pause&goto :eof
  6. )
  7. if not defined m (echo inf文件不存在!) else if !m! leq 4 goto begin
  8. pause&goto :eof
复制代码

[ 本帖最后由 inittab 于 2009-8-1 20:33 编辑 ]
2

评分人数

TOP

回复 7楼 的帖子

tireless兄该代码似乎与你发的一个帖子有关,如果我没猜错的话肯定是在解答这个题目的时候出现的疑惑,所以才会那个帖子。如果for的返回码真的那么复杂的话,如此看来代码应该可靠性不太好。不知道这个问题到底如何解决。
Still with wax

TOP

辛苦答题

这道题不好搞好,我用了一天啊,,可以还不理想.
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /r c:\ %%i in (*.inf) do (set /p a=<%%i
  4.               echo %%i !a! >>a.txt)
  5. for /f "delims=\ tokens=7,* " %%j in (a.txt) do (
  6.              set/a b+=1
  7.              if !b! leq 4 (for %%k in (%%j) do echo %%k) else goto 1)
  8. :1
  9. del a.txt&pause>nul
复制代码
1

评分人数

    • wxcute: 精神值得鼓励。还有一些错误。 &quot;delims= ...PB + 5

TOP

回复 5楼 的帖子

没问题啊,楼主说循环显示四次,两个文件乘以4不就是8么?晕……
1

评分人数

    • wxcute: 多谢,你真仔细。我表述上有问题,已修改。PB + 1
Still with wax

TOP

不会,,真的不会......>> 和 ||一点都不懂...
等以后会了再来.......

TOP

绝对自己写的,事先没有看过别人代码

  1. @echo off &setlocal enabledelayedexpansion
  2. :label1
  3. for /r %systemdrive%\ %%i in (*.inf) do (
  4. set /a m+=1 & if !m! gtr 4 goto label2
  5. set /p str=<"%%i"
  6. echo %%i
  7. echo !str!
  8. echo,)
  9. if defined m (if !m! lss 4 goto label1) else (echo 文件不存在!)
  10. :label2
  11. pause>nul
复制代码

[ 本帖最后由 broly 于 2010-7-22 11:30 编辑 ]
---学无止境---

TOP

@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

TOP

返回列表