📄 [原创]批处理参数问题一点谈 - dos批处理 & 脚本技术(批处理室) - 中国dos联盟论坛 - 中国dos联盟之联合dos论坛.htm
字号:
<U><B>[1]</B></U> <A
href="http://www.cn-dos.net/forum/viewthread.php?tid=17785&fpage=0&highlight=&page=2&sid=Z83cGB">[2]</A>
<A
href="http://www.cn-dos.net/forum/viewthread.php?tid=17785&fpage=0&highlight=&page=2&sid=Z83cGB">>></A>
<A
href="http://www.cn-dos.net/forum/viewthread.php?tid=17785&fpage=0&highlight=&page=2&sid=Z83cGB">></A></TD>
<TD align=right></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="99%" align=center
border=0>
<TBODY>
<TR>
<TD bgColor=#dde3ec>
<TABLE cellSpacing=1 cellPadding=4 width="100%" border=0>
<TBODY>
<TR class=header>
<TD width="21%">作者:</TD>
<TD>
<TABLE
style="TABLE-LAYOUT: fixed; WORD-WRAP: break-word"
cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR style="COLOR: #ffffff">
<TD class=bold>标题: [原创]批处理参数问题一点谈</TD>
<TD noWrap align=right width=200><A
style="FONT-WEIGHT: normal; COLOR: #ffffff"
href="http://www.cn-dos.net/forum/redirect.php?fid=23&tid=17785&goto=nextoldset&sid=Z83cGB">上一主题</A>
| <A style="FONT-WEIGHT: normal; COLOR: #ffffff"
href="http://www.cn-dos.net/forum/redirect.php?fid=23&tid=17785&goto=nextnewset&sid=Z83cGB">下一主题</A></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD bgColor=#f8f9fc colSpan=2 height=1></TD></TR>
<TR bgColor=#f8f9fc>
<TD vAlign=top width="21%"><A name=pid105062></A><SPAN
class=bold>无奈何</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><BR><BR><BR><BR>积分
1313<BR>发帖 356<BR>注册 2005-7-15<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><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/agree.gif"
align=right><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/agree.gif"
align=right><IMG
src="[原创]批处理参数问题一点谈 - DOS批处理 & 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/agree.gif"
align=right><FONT color=red>『楼 主』:</FONT>
</SPAN><SPAN
class=bold> [原创]批处理参数问题一点谈</SPAN><BR><BR><B>批处理参数问题一点谈</B><BR>
最近编写了一个批处理程序,想让程序能够灵活的接收两个以下的参数,但在完成过程中几经卡壳,比如怎么解决数量不等的参数个数,怎么实现参数类型的判断。经过一段时间的思考和摸索,总算比较满意的解决了这些问题。接下来我谈谈这个过程,如果你想测试效果的话请在
NT 系统下进行。<BR>
先交待一下这个批处理程序想要接收的参数,一个参数为路径,另一个参数为数字。这样便有了下面的几种组合变换:<BR>1、空<BR>2、路径<BR>3、数字<BR>4、路径
+ 数字<BR>5、数字 + 路径<BR>6、路径 + 路径<BR>7、数字 +
数字<BR>前五种情况是程序需要处理的正常的参数组合,后两种是不期望的组合。先看下面一段演示程序,一起来探讨这个过程的处理与实现。
<BLOCKQUOTE class=code><B
class=smalltxt>CODE:</B> <A
class=smalltxt
onclick="copycode(findobj('code0'));"
href="http://www.cn-dos.net/forum/viewthread.php?tid=17785###">[Copy
to clipboard]</A>
<HR color=#dde3ec SIZE=1>
<DIV id=code0
style="PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px; FONT-FAMILY: Courier New">::
demo.cmd 批处理参数处理演示 2000、XP
↑<BR>::
by:无奈何 email:wunaihe@gmail.com 2005.11.17<BR>1│@echo
off<BR>2│setlocal<BR>3│set "p1=%~1"<BR>4│set
"p2=%~2"<BR>5│set flag_d=0<BR>6│set
flag_n=0<BR>7│if not defined p2 (<BR>8│
if not defined p1
(<BR>9│
set "directory=."<BR>10│
) else (<BR>11│
set "directory=."<BR>12│
call :_test
"%p1%"<BR>13│
)<BR>14│) else (<BR>15│
call :_test "%p1%"<BR>16│
call :_test "%p2%"<BR>17│
)<BR>18│if %flag_n% == 2 echo 参数为两个数字 &goto
:EOF<BR>19│if %flag_d% == 2 echo 参数为两个目录
&goto :EOF<BR>20│echo 目录为:%directory%
数字为:%number%<BR>21│goto
:EOF<BR>22│<BR>23│:_test<BR>24│set
"x=%~1"<BR>25│set /a "y=x+1-1"<BR>26│if "%y%" ==
"%x%" (<BR>27│ set
"number=%x%"<BR>28│
set /a flag_n+=1<BR>29│
) else (<BR>30│
pushd "%x%"
2>nul<BR>31│
if errorlevel 1 set
"directory=." &goto :EOF<BR>32│
set
"directory=%x%"<BR>33│
set /a
flag_d+=1<BR>34│
popd<BR>35│
)<BR>36│goto
:EOF</DIV></BLOCKQUOTE>在前六行中,flag_n 与 flag_d
分别是记录参数中数字和目录个数的两个变量并在以后使用,其余不作过多解释。重点看看第7行到第17行,这是一个
if...else... 分支结构,第一个分支又被分割成为了两部分,p1,p2两个变量分别记录了
demo.cmd
所接收的参数1和参数2,所以整个部分被分成了可以用参数个数描述的,即无参数,一个参数,和两个参数三种情况。分别看看每种分支情况都执行了什么操作。<BR><BR>
先说第9行也就是无参数的情况,语句含义为将变量 directory
赋值为“.”,有必要细说一下这条语句,既然没有任何参数输入到 demo.cmd 为什么还要设置变量
directory 呢?这样做的目的是给 directory
变量设置一个默认值,在以后的调用中如:dir %directory% ;for /r
"%directory%" in (*.*) do ....这样类似的命令中即使 demo.cmd
没有接收到路径参数也不会出错,因为有这个默认的“.”,也就是使其在缺省状态下代表当前目录。当然是否确实有必要这样做要看你以后的命令如何使用
directory
这个变量。由于上面的代码只是一个参数接收的演示,也就没有后续的相关操作。如果你不需要对
directory 防空设计,可以将第8-10行替换为 “if defined p1 (”
将其简化,而只保留下一个分支。<BR><BR>
下面谈谈上段提到的下一个分支,也就是第二个 if 语句的 else
部分,即一个参数的情况。因为这一个参数的内容仍然会是路径、数字其中之一,所以还需将变量
directory 赋值为“.”,以防碰到的参数是数字,也就是第11行的功能。再看看第12行,以
p1 为参数跳转到标签 _test
,完成一次类似功能函数的调用。我们不知道完成了什么功能,先放放一放,往下看。下面到了第一个 if
语句的 else 部分,即两个参数的情况。发现分别以 p1 p2 调用了两次 _test
函数。这回我们有必要研究一下 _test 函数到底完成了什么功能。<BR><BR>
直接跳转到第23行,看语句首先将上面调用时发送的参数赋值给变量 x
,接下来执行一次算术操作将值赋给变量 y ,先加一再减一,有些不知所以。再往下看看 if
语句的第一个分支,如果 x 与 y 的值相等,将 x 值赋给变量 number ,并且将
flag_n 加一,我们还记得上文提及 flag_n 是记录参数中数字个数的变量,看来 x 与 y
的值相等,就断定 x
也就是上面调用时传送的参数是一个数字。为什么会这样?第25行应该是关键,在这里有一个小技巧,先插一段
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -