本帖最后由 cjiabing 于 2011-9-25 23:50 编辑
我将第二套题的答案公布出来吧:
B1、分行显示李白的古诗《静夜思》:“床前明月光 疑是地上霜 举头望明月 低头思故乡”
- for %%a in (床前明月光 疑是地上霜 举头望明月 低头思故乡) do echo %%a
复制代码
——使用txt也得。不过有些人没注意看提示,第一个是不用参数的FOR就可以完成了,原因是空格,点号(.)等都是默认的分隔符,会自动将句子分行显示。这是FOR的特性。当然,使用FOR /F也可以,啰嗦了点。
B2、搜索并分别显示路径名、文件名和后缀名。
- @echo off
- for /r c:\ %%i in (mplayer.*) do echo 完整路径名:%%i;路径名:%%~dpi;文件名:%%~ni;后缀名:%%~xi
- pause>nul
复制代码
借楼上的代码修改了用。一个涉及到搜索参数FOR /R,一个涉及到批处理参数。什么是批处理参数?用“FOR/?”看看最后面的内容。
另外要记得,FOR /R的搜索快是快,但无法搜索隐藏的文件。而批处理参数应用广泛,最好熟悉。
B3、显示递减数列:100、98、96、……、4、2、0,并求和。
这个不难了。只要掌握/L是数列顺序等,然后大的数在前面,小的数在后面,这是递减;小的数在前面,大的数在后面是递增;中间的数是递增或递减的级数。要注意的是0的位置和使用,有时候括号内什么都没有时,或者全部是0时有可能导致死循环。
- @echo off
- for /l %%i in (100,-2,0) do echo %%i&set /a str+=%%i
- echo 总和:%str%
- pause
复制代码
B4、从句子中提取“荡妇大游行”这个词:
- for /f "tokens=5 delims=“”" %%a in ("“穿了裙子,不等于说可以。”加拿大警察的“如果不想被强奸,就不要把自己打扮得像荡妇”言论引发了世界性的抗议。7月31日,继加拿大、美国、英国、澳大利亚、巴西、荷兰、韩国之后,印度新德里也举行了“荡妇大游行”。") do echo %%a
复制代码
说到提取嘛,一般都是用tokens=来提取指定的列,而提取前先用delims=进行切分。本例使用中文的双引号进行分隔,然后再提该词语所在的列。
用来切割的delims=可以是空格和其他特殊符号,也可以是英文和汉字。当然,使用双引号做分隔符需要其他技巧。
B5、请提取 IP 地址“192.168.1.100”。
我觉得最简便的方法如下:
- @echo off
- for /f "tokens=1,2 delims=:" %%i in ('ipconfig/all') do if /i "%%i"==" IP Address. . . . . . . . . . . . " echo;%%j
- pause
复制代码
有点投机取巧。当然,还有更多的技巧,我也做过其他的,目的是看大家对FOR /F的选项使用的熟练程度,比如skip、usebackq、eol等等。
B6、提取指定行。
方法也有很多,比如,如果预先知道包含关键词的可以用FIND和FINDSTR。
如果知道行数的,也可以使用FINDSTR和FOR组合提取。findstr /n 是显示搜索结果的所在行,用此即可查到行。
不过单纯用FOR也可以解决。其中,skip和more功能上有点类似,可以忽略第几行,然后从第几行开始显示。
因此,所谓的提取指定行,要么是知道该行的行号,要么是知道该行的关键词。通过这些都可以提取。方法多多,此处还是用老办法:
-
- ::提取指定行
- @echo off
- set /p p=请输入要文本路径:
- set /p m=请输入要定位的行:
- echo.
- for /f "tokens=1,* delims=:" %%a in ('findstr /n .* %p%^|findstr /b "%m%"') do if %%a==%m% echo %%b
- echo.
- pause
复制代码
差点忘记补usebackq的使用了。之所以把路径定在“C:\Program Files\windows media player”(其实在桌面就可以了),目的就是为了考考大家对路径中有空格时怎么处理。是啊,一般情况下是直接用双引号的,但在特殊情况下,你会用到usebackq。
- @echo off
- for /f "usebackq tokens=*" %%a in ("C:\Documents and Settings\Administrator\桌面\a.txt") do echo %%a
- pause
复制代码
假如桌面上有一个文件a.txt,你的这个bat则放在D盘,在D盘打开桌面上的东西就会发生错误,此时,只能用usebackq。
在FOR /F中,双引号通常用作显示字符串的,而批处理中路径含有空格等特殊符号时,也是使用双引号,这里就存在冲突了,使用双引号的话,路径就会变成字符串显示,而不显示文本中的文字。此时,需要usebackq来重新定义双引号的作用。 |