📄 [原创]批处理参数问题一点谈 - dos批处理 & 脚本技术(批处理室) - 中国dos联盟论坛 - 中国dos联盟之联合dos论坛.htm
字号:
set
帮助:<BR>“在表达式中的任何非数字字符串键作为环境变量名称,这些环境变量名称的值已在使用前转换成数字。如果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零。这使您可以使用环境变量值做计算而不用键入那些
% 符号来得到它们的值。”<BR> 现在清楚 set /a
"y=x+1-1" 这一句的执行过程了吧! x 被替换为它自身变量值参与运算,当 x
值为数字时先加一再减一其值不变也就是 y=x ;当 x 值为非数字时其值将被定为零,先加一再减一后即
y=0 。所以据此也就可以判断 x 值是否为数字了。细心人会猜想要是 x 本身等于 0
怎么办,这是特殊情况可以在 set /a
句前加以判断,改变程序执行顺序完成指定操作。但是我们这种将变量直接参与数值运算的处理方法也有局限性,比如
x 值 为 0123 会被判断为非数字,这是因为以 0 开头的数字会被解释为 8 进制数字其值为
83
。所以我们可以正确判断的只是自然数字,有方法能回避或者解决吗?我们待会再谈这个问题。<BR><BR>
接下来我们再来看 _test 函数 if 语句的 else 分支,第30行 pushd
"%x%" 会保存当前目录,供后续命令 popd 命令使用,并切换到 x
值所表示的目录,简单说就是保存当前目录,并更改目录。下一行根据 pushd
命令的执行情况决定程序的转向,错误的话也就是非目录情况仍然设置 directory
为“.”并退出函数。第32-34行很简单 pushd 执行成功将 directory 设为 x
的值, flag_d
值增一,然后切换到被保存起来的目录。这样便完成了是否是目录的判断。看一下我们发现忽略了非数字非目录的错误输入情况,这只是为了更好的理解这个过程而做的忽略,你可以在开头部分设置一个
flag_o 变量,并在 if errorlevel 1 句增加 set /a flag_o+=1
来记录这种情况。当然为了便于理解和描述我用了并行执行多个命令的连接符“&”;实际中你可以用括号括起多条语句段来分别执行。<BR><BR>
这样我们便实现了数字、目录和其他字符的判断,再回到主程序就好理解了,只是将我们保存的信息显示出来,实际应用中的话再供其他命令使用。想想我们还有什么遗漏情形,比如一个参数
456 是一个目录怎么办,我们可以在第27行前加一个是否为目录的判断?而存在 456
这个目录但本身是我们想要的一个数字怎么办?这是一个没法回答的问题,所以避免这样种种岐义情况最好的办法是要求输入全路径也就是文章开头提到的这个词,而不是我们文章中部一直在使用的目录这个词。我们再来谈谈以零开头的数字的问题,既然要求的是全路径,零开头肯定不是目录,我们用取子字符串命令循环替换掉前面的零再做判断。事实上我们有必要这样做吗?我不敢说没有,那要看你对程序的容错要求程度了。<BR><BR>
回过头来再看看这种参数的处理方式,会发现很难应对多参数的复杂情况,更好的方式应该是
demo /A... /B...
/C...这样的接收处理模式,用选项来限定参数。这样的好处是只要按限定符接收就行了,而不用将无顺序的参数交给批处理程序分析判断。这只是初步想法还不知是否能转成可行实用的批处理程序,欢迎朋友们一起来探讨。<BR><BR>补记,本来只是想记录一下碰到的问题来这,没想到罗嗦了那么多。如有纰漏,希望指正。
<BR><BR>
<CENTER>
<TABLE cellSpacing=0 cellPadding=1 bgColor=#cccccc
border=0>
<TBODY>
<TR>
<TD>
<CENTER> 此帖被 <FONT
color=red>+17</FONT> 点积分 <IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/agree.gif"> <IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/agree.gif"> <IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/agree.gif">
<A
onclick="sp=this.parentNode.nextSibling;sp.style.display=(sp.style.display==''?'none':'');this.innerHTML=(sp.innerHTML==''?'无':('点击'+(this.innerHTML=='点击查看详情'?'隐藏':'查看')))+'详情'"
href="javascript:;">点击查看详情</A>
</CENTER>
<TABLE style="DISPLAY: none" cellSpacing=0
cellPadding=4 bgColor=#ffffff border=0>
<TBODY></TBODY></TABLE></TD></TR></TBODY></TABLE></CENTER><BR><BR></TD></TR></TBODY></TABLE></TD></TR>
<TR bgColor=#f8f9fc>
<TD class=smalltxt vAlign=center><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/lastpost.gif"
align=absMiddle> 2005-11-17 04:42 PM</TD>
<TD vAlign=center>
<TABLE cellSpacing=0 cellPadding=0 width="100%"
border=0>
<TBODY>
<TR class=smalltxt>
<TD align=left><A
href="http://www.cn-dos.net/forum/viewpro.php?uid=40733&sid=Z83cGB"><IMG
alt=查看资料
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/profile.gif"
border=0></A> <A
href="mailto:dlm-lx@163.com"><IMG alt=发送邮件
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/email.gif"
border=0></A> <A
href="http://www.cn-dos.net/forum/pm.php?action=send&uid=40733&sid=Z83cGB"
target=_blank><IMG alt=发短消息
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/pm.gif"
border=0></A> <A
href="http://www.cn-dos.net/forum/blog.php?uid=40733&sid=Z83cGB"><IMG
alt=网志
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/blog.gif"
border=0></A> <A
href="http://search.tencent.com/cgi-bin/friend/user_show_info?ln=105400208"
target=_blank><IMG alt=QQ
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/oicq.gif"
border=0></A> </TD>
<TD align=right> <A
href="http://www.cn-dos.net/forum/post.php?action=edit&fid=23&tid=17785&pid=105062&page=1&sid=Z83cGB"><IMG
alt=编辑帖子
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/edit.gif"
border=0></A> <A
href="http://www.cn-dos.net/forum/post.php?action=reply&fid=23&tid=17785&sid=Z83cGB"><IMG
alt=回复
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/replyb.gif"
border=0></A> <A
href="http://www.cn-dos.net/forum/post.php?action=reply&fid=23&tid=17785&repquote=105062&sid=Z83cGB"><IMG
alt=引用回复
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/quote.gif"
border=0></A> </TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD bgColor=#f8f9fc colSpan=2 height=1></TD></TR>
<TR bgColor=#ffffff>
<TD vAlign=top width="21%"><A name=pid105077></A><SPAN
class=bold>willsort</SPAN><BR><SPAN
class=smalltxt><B><FONT color=red>荣誉版主</FONT></B>
<BR><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><BR>Batchinger<BR><BR>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0
cellPadding=0 width="95%" border=0>
<TBODY>
<TR>
<TD align=middle><IMG height=58
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/19.gif"
width=62 border=0></TD></TR></TBODY></TABLE><BR>积分
4310<BR>发帖 1515<BR>注册 2002-10-18<BR>状态 离线 </SPAN></TD>
<TD vAlign=top width="79%" height="100%">
<TABLE
style="TABLE-LAYOUT: fixed; WORD-WRAP: break-word"
height="100%" cellSpacing=0 cellPadding=0 width="100%"
border=0>
<TBODY>
<TR>
<TD vAlign=top><SPAN class=smalltxt>『第<FONT
color=red><B> 2</B></FONT> 楼』: </SPAN><SPAN
class=bold> </SPAN><BR><BR>Re
无奈何:<BR><BR>
很有见地的一篇主题,根据其讨论的内容和深度,相信可以归入(開發室)
,只是彼处对此能会心一笑的人太少了,还是暂时先放在这里讨论吧。<BR><BR>
动态参数的支持,我在学习批处理之初便曾有接触,只是当时未及深入,疏漏自然难免。后来再编写那个文本遍历程序的命令行增强版(VisitCE)时,曾试图对此进行更深入的探索,但是一入其中,便觉如同幽魂迷宫,错综复杂,需要考虑和斟酌的东西太多了。此时,才对DOS命令行的灵活性有了另一番深入的体会。<BR><BR>
关于多个动态参数的支持,我建议使用 :loop 和 goto
loop 的循环对参数分析,这样多少可以避免程序陷入 if else
的迷魂阵中,这也是其他高级语言的代码处理参数的通常做法。对所有的参数都一视同仁,首先判断是否空,其次判断其所属类别,再次判断其是否有效,最后判断其是否可以保存(即是否已经保存或其他情形)。这样即使处理任意多个动态参数,也不需要对代码有太大的更改。<BR><BR>
另外,将参数分为目录和数字的分类法,必然会导致参数的二义性问题,从而导致程序分析的复杂化,许多高级语言规定变量名不允许以数字起始,便基于此项原因(反例是DOS的环境变量)。想要避免它,就需要重新划分参数的类别,你所说的全路径便是一种折中的办法。<BR><BR>
对于判断参数是否数字,如果允许使用外部命令,那么可以考虑
finstr 的正则表达式过滤。<BR><BR>
最后,给出一个题目,大家讨论一下:如何在 MS-DOS下 实现相同的需求?
<BR><BR><BR></TD></TR>
<TR>
<TD vAlign=bottom align=left><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/sigline.gif"><BR>※
Batchinger 致 Bat Fans:请访问 <A
href="http://www.cn-dos.net/forum/viewthread.php?tid=12388"
target=_blank>[讨论]批处理编程的异类</A>
,欢迎交流与共享批处理编程心得!</TD></TR></TBODY></TABLE></TD></TR>
<TR bgColor=#ffffff>
<TD class=smalltxt vAlign=center><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/lastpost.gif"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -