Board logo

标题: 【讲解】自编批处理试卷答案解析 [打印本页]

作者: defanive    时间: 2009-2-8 23:43     标题: 【讲解】自编批处理试卷答案解析

http://bbs.bathome.net/thread-3064-1-1.html

我自编的试卷,难度中,很多朋友对里面的题目都答错了,所以今天来个解析。。。





1、下列代码中,能完成打开批处理自身的是:
A、start "%0"
B、start "" "%0"
C、start "" "%~f0"
D、start "" %~dpnx0


解析:

路径含空格的时候必须使用双引号,D排除。路径使用双引号的时候,start会将路径看作标题,因此在路径前必须加上"",A排除。
%0并不一定代表批处理的路径,根据其调用方式而有不同,有时仅显示其文件名。此时如果cd并不在当前目录的话,就无法实现打开自身,B排除
%~f0是把%0拓展到其完整的路径,并去除最外层的双引号,故C正确。



2、有如下一批处理:
@set /p a=Type:>a.txt
运行批处理后,输入abc并回车,则下面对结果预测正确的是:
A、会产生大小为3字节的a.txt,内容为abc
B、会产生大小为5字节的a.txt,内容为abc及一新行
C、会产生大小为5字节的a.txt,内容为Type:
D、会产生大小为7字节的a.txt,内容为Type:及一新行


解析:

首先,明确>的用意:将命令输出到文件中,注意,是输出,那么这句批处理的输出就是Type:,排除A、B。set /p所产生的输出与echo并不同,区别在于echo产生的输出会换行而set /p不会换行。而我们所见的输入完之后会换行是因为我们按下了回车结束输入导致的。故选C。



3、下列代码中,能把a.txt文件的第一行内容赋值给变量a的是(不讨论特殊字符过滤):
A、for /f %%a in (a.txt) do set a=%%a
B、for /f "tokens=*" %%a in (a.txt) do set a=%%a
C、set /p a=<a.txt
D、type a.txt|set /p a=


解析:

C选项是批处理中常用的技巧,将a.txt的内容输入到set /p里,当第一行结束换行的时候等于按下了回车,赋值就结束了。(D选项实在不知道怎么解释好了,因为我自己也没有想通,理论上是可以的,但实际不行)



4、下列代码中,与echo 123执行效果相同的是:
A、set /p a=123<nul
B、echo 123>>b.txt&type b.txt
C、set a=123&echo %a%
D、echo 123|findstr .


解析:

set /p产生的输出是不带回车的,具体可以看题2解析。B选项使用的是>>符,将123追加到文本结尾,假如文本本身存在并有内容,那么显示的并非123,排除B。C选项有变量延迟的问题,预处理的时候已经把%a%替换为空。D选项将123作为findstr查找的文本,查找任意字符,输出是带回车的。



5、下列代码中,能实现将变量a的值随机设置为1~100之间的是:
A、set a=%random%%%100+1
B、set /a a=%random%%%100
C、set /a a=%random%%%99+1
D、set /a a=%random%%%100+1


解析:

%random%将扩展到0~32767之间的任意十进制数字,而%%是取余数的意思(也就是模运算,数学中是mod)。对于任意自然数m,mod n,产生的结果必将在0~(n-1)之间。A选项没有/a,排除。根据上述方法,B得到的数范围为0~99,C为1~99,D为1~100。另外对上述方法进行拓展,易得范围为n~m时应mod (m-n+1),再对结果+n



6、下列代码中,能实现交换变量a与变量b的内容的是:
A、set "c=%a%"&set "a=%b%"&set "b=%c%"
B、set "a=%b%"&set "b=%a%"
C、echo %a%>va.txt&echo %b%>vb.txt&set /p a=<vb.txt&set /p b=<va.txt
D、echo "%a%">va.txt&echo "%b%">vb.txt&set /p a=<vb.txt&set /p b=<va.txt


解析:

乍一看还真复杂。C选项最容易看出漏洞,当变量a或变量b存在特殊字符的时候,会出错,排除。D选项有了""括住虽然没有了特殊字符的问题,但是赋值变量后值多了一对""号,排除。A有变量延迟问题,执行完后变量a为变量b的值,但b为空值。B由于预处理的关系,在值改变之前已成功执行了交换变量的方法,故B正确。B是批处理中常用的技巧。



7、有如下一批处理:
@echo off
set a=0
set b=0
for /l %%a in (1,1,5) do (
set /a a+=%%a
set /a b+=a
)
echo a=%a%,b=%b%
pause>nul
运行批处理后,则下面对结果预测正确的是:
A、显示“a=5,b=5”
B、显示“a=5,b=15”
C、显示“a=15,b=15”
D、显示“a=15,b=35”


解析:

这里需注意的是,set /a允许把变量当作环境变量来使用,即在set /a中对变量不需要加上%号。这样的好处是不受变量延迟的影响,能实时对值操作。还有一点要明确,set /a a+=1实际上是等于set /a a=a+1的,注意,等式右边的a并没有%号,也就是说对a的+=、-=等操作都即时生效。明确这点之后,也就是说上述代码完全不需要考虑变量延迟的影响,直接运算就可以了。选D。



8、有如下一批处理:
@echo off
set var=a
set a=b
call echo %%%%%var%%%%%
pause
则对运行结果预测正确的是:
A、显示“%%b%%”
B、显示“%a%”
C、显示“%b%”
D、显示“b”


解析:

这题考察的是预处理的运用。单讲%号,预处理的原则是优先处理成对的成单个的,分开的成对的用变量值替换。首先,批处理在执行“call echo %%%%%var%%%%%”,的时候先进行了一次预处理,按照原则替换成“call echo %%a%%”。执行完这条命令后,call就执行“echo %%a%%”这条命令,于是就进行了第二次预处理,按照原则预处理成“echo %a%”,于是就显示了“%a%”。故选B。更多相关的请搜索“预处理”。



9、两个冒号(即“::”)可以达到注释的效果。则下列说法正确的是:
A、::是一条命令,但它不输出输出流及错误流
B、::是系统定义的用法,在系统批处理中也有它的踪影
C、::其实被解析为一个标签,但goto不能跳转到:开头的标签,利用此漏洞达到了注释的效果
D、::其实被解析为一个标签,利用了goto的漏洞达到了效果


解析:

这是概念题。::并不是一条命令,排除A。系统批处理中的确有::的踪影,但并不是系统定义的方法。C和D其实都是一样的,但是C提到goto不能跳转到:开头的标签,这是错误的,因为有goto :EOF的用法。故选D。



10、代码“echo a”的完整形式是:
A、echo a 1>con
B、echo a 1>con 2>nul
C、echo a 0>nul 1>con 2>nul
D、echo a 1>con 2>con


解析:

本题考查的是句柄的意义。0指标准输入,1指标准输出,2指标准错误。易得D为正确选项。






批处理编写的第一题,其实还有更简洁的方法:

@echo off
setlocal enabledelayedexpansion
set /p a=请输入:
echo !a!
pause

各种特殊符号的处理是在预处理进行的,而!!的处理比预处理晚,所以输出的时候不会产生错误,并且不会导致字符缺失。

当然,还有投机取巧的办法:

@type con

type不对特殊符号进行处理,con在这里则是标准输入,也就是输入什么就输出什么。





好了,写完了,下去跑步了,55555~

[ 本帖最后由 defanive 于 2009-2-9 00:59 编辑 ]
作者: Batcher    时间: 2009-2-9 00:27

路径含空格的时候必须使用双引号,D排除。路径使用双引号的时候,start会将路径看作标题,因此在路径前必须加上"",A排除。
%0并不一定代表批处理的路径,根据其调用方式而有不同,有时仅显示其文件名。此时如果cd并不在当前目录的话,就无法实现打开自身,C排除
%~f0是把%0拓展到其完整的路径,并去除最外层的双引号,故D正确

笔误?
作者: defanive    时间: 2009-2-9 00:58

笔误。。。

马上修改。。。
作者: 5566ljlj    时间: 2009-11-7 13:54

认真学习了。
作者: Seter    时间: 2009-11-7 14:01

第四题解析中
B选项使用的是>>符,将123追加到文本结尾,假如文本本身存在并有内容,那么显示的并非123
我在cmd中测试,echo k>tmp.txt&type tmp.txt也是不行的,这个也算延迟把?
作者: pumahxh    时间: 2009-11-21 18:58     标题: 第7题疑惑

仔细看了下,想不通为什么第7题中,b=35,而不是15。请楼主赐教!
、有如下一批处理:
@echo off
set a=0
set b=0
for /l %%a in (1,1,5) do (
set /a a+=%%a
set /a b+=a
)
echo a=%a%,b=%b%
pause>nul
运行批处理后,则下面对结果预测正确的是:
A、显示“a=5,b=5”
B、显示“a=5,b=15”
C、显示“a=15,b=15”
D、显示“a=15,b=35”
作者: tession    时间: 2009-11-24 12:15

原帖由 pumahxh 于 2009-11-21 18:58 发表
仔细看了下,想不通为什么第7题中,b=35,而不是15。请楼主赐教!
、有如下一批处理:
@echo off
set a=0
set b=0
for /l %%a in (1,1,5) do (
set /a a+=%%a
set /a b+=a
)
echo a=%a%,b=%b%
pause>nul
...


肯定不是15啊  b只加最后一次的a就已经15了  还有前面4次没加呢
作者: pumahxh    时间: 2009-11-27 16:00

写出来对比下,发现自己的问题了。谢谢!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2