⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 [原创]批处理参数问题一点谈 - dos批处理 & 脚本技术(批处理室) - 中国dos联盟论坛 - 中国dos联盟之联合dos论坛.htm

📁 批处理参数问题一点谈 最近编写了一个批处理程序
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                  &nbsp; <U><B>[1]</B></U>&nbsp;<A 
                  href="http://www.cn-dos.net/forum/viewthread.php?tid=17785&amp;fpage=0&amp;highlight=&amp;page=2&amp;sid=Z83cGB">[2]</A>&nbsp; 
                  <A 
                  href="http://www.cn-dos.net/forum/viewthread.php?tid=17785&amp;fpage=0&amp;highlight=&amp;page=2&amp;sid=Z83cGB">&gt;&gt;</A> 
                  &nbsp; <A 
                  href="http://www.cn-dos.net/forum/viewthread.php?tid=17785&amp;fpage=0&amp;highlight=&amp;page=2&amp;sid=Z83cGB">&gt;</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&amp;tid=17785&amp;goto=nextoldset&amp;sid=Z83cGB">上一主题</A> 
                              | <A style="FONT-WEIGHT: normal; COLOR: #ffffff" 
                              href="http://www.cn-dos.net/forum/redirect.php?fid=23&amp;tid=17785&amp;goto=nextnewset&amp;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批处理 &amp; 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG 
                        src="[原创]批处理参数问题一点谈 - DOS批处理 &amp; 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG 
                        src="[原创]批处理参数问题一点谈 - DOS批处理 &amp; 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG 
                        src="[原创]批处理参数问题一点谈 - DOS批处理 &amp; 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG 
                        src="[原创]批处理参数问题一点谈 - DOS批处理 &amp; 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG 
                        src="[原创]批处理参数问题一点谈 - DOS批处理 &amp; 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/star.gif"><IMG 
                        src="[原创]批处理参数问题一点谈 - DOS批处理 &amp; 脚本技术(批处理室) - 中国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批处理 &amp; 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/agree.gif" 
                              align=right><IMG 
                              src="[原创]批处理参数问题一点谈 - DOS批处理 &amp; 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/agree.gif" 
                              align=right><IMG 
                              src="[原创]批处理参数问题一点谈 - DOS批处理 &amp; 脚本技术(批处理室) - 中国DOS联盟论坛 - 中国DOS联盟之联合DOS论坛.files/agree.gif" 
                              align=right><FONT color=red>『楼 主』:</FONT> 
                              </SPAN><SPAN 
                              class=bold>&nbsp;[原创]批处理参数问题一点谈</SPAN><BR><BR><B>批处理参数问题一点谈</B><BR>&nbsp; 
                              &nbsp; 
                              最近编写了一个批处理程序,想让程序能够灵活的接收两个以下的参数,但在完成过程中几经卡壳,比如怎么解决数量不等的参数个数,怎么实现参数类型的判断。经过一段时间的思考和摸索,总算比较满意的解决了这些问题。接下来我谈谈这个过程,如果你想测试效果的话请在 
                              NT 系统下进行。<BR>&nbsp; &nbsp; 
                              先交待一下这个批处理程序想要接收的参数,一个参数为路径,另一个参数为数字。这样便有了下面的几种组合变换:<BR>1、空<BR>2、路径<BR>3、数字<BR>4、路径 
                              + 数字<BR>5、数字 + 路径<BR>6、路径 + 路径<BR>7、数字 + 
                              数字<BR>前五种情况是程序需要处理的正常的参数组合,后两种是不期望的组合。先看下面一段演示程序,一起来探讨这个过程的处理与实现。
                              <BLOCKQUOTE class=code><B 
                                class=smalltxt>CODE:</B>&nbsp;&nbsp;<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&nbsp;&nbsp;批处理参数处理演示&nbsp;&nbsp;2000、XP 
                                ↑<BR>:: 
                                by:无奈何&nbsp;&nbsp;email:wunaihe@gmail.com&nbsp;&nbsp;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│&nbsp; 
                                &nbsp; &nbsp; &nbsp; if not defined p1 
                                (<BR>9│&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
                                &nbsp; &nbsp; set "directory=."<BR>10│&nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
                                ) else (<BR>11│&nbsp; &nbsp; &nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
                                &nbsp; set "directory=."<BR>12│&nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; call :_test 
                                "%p1%"<BR>13│&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
                                )<BR>14│) else (<BR>15│&nbsp; &nbsp; &nbsp; 
                                &nbsp; call :_test "%p1%"<BR>16│&nbsp; &nbsp; 
                                &nbsp; &nbsp; call :_test "%p2%"<BR>17│&nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
                                )<BR>18│if %flag_n% == 2 echo 参数为两个数字 &amp;goto 
                                :EOF<BR>19│if %flag_d% == 2 echo 参数为两个目录 
                                &amp;goto :EOF<BR>20│echo 目录为:%directory%&nbsp; 
                                &nbsp; &nbsp; &nbsp; 数字为:%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│&nbsp; &nbsp; &nbsp; &nbsp; set 
                                "number=%x%"<BR>28│&nbsp; &nbsp; &nbsp; &nbsp; 
                                set /a flag_n+=1<BR>29│&nbsp; &nbsp; &nbsp; 
                                &nbsp; ) else (<BR>30│&nbsp; &nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pushd "%x%" 
                                2&gt;nul<BR>31│&nbsp; &nbsp; &nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; if errorlevel 1 set 
                                "directory=." &amp;goto :EOF<BR>32│&nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set 
                                "directory=%x%"<BR>33│&nbsp; &nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set /a 
                                flag_d+=1<BR>34│&nbsp; &nbsp; &nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; popd<BR>35│&nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
                                &nbsp; &nbsp; &nbsp; &nbsp; )<BR>36│goto 
                                :EOF</DIV></BLOCKQUOTE>在前六行中,flag_n 与 flag_d 
                              分别是记录参数中数字和目录个数的两个变量并在以后使用,其余不作过多解释。重点看看第7行到第17行,这是一个 
                              if...else... 分支结构,第一个分支又被分割成为了两部分,p1,p2两个变量分别记录了 
                              demo.cmd 
                              所接收的参数1和参数2,所以整个部分被分成了可以用参数个数描述的,即无参数,一个参数,和两个参数三种情况。分别看看每种分支情况都执行了什么操作。<BR><BR>&nbsp; 
                              &nbsp; 先说第9行也就是无参数的情况,语句含义为将变量 directory 
                              赋值为“.”,有必要细说一下这条语句,既然没有任何参数输入到 demo.cmd 为什么还要设置变量 
                              directory 呢?这样做的目的是给 directory 
                              变量设置一个默认值,在以后的调用中如:dir %directory% ;for /r 
                              "%directory%" in (*.*) do ....这样类似的命令中即使 demo.cmd 
                              没有接收到路径参数也不会出错,因为有这个默认的“.”,也就是使其在缺省状态下代表当前目录。当然是否确实有必要这样做要看你以后的命令如何使用 
                              directory 
                              这个变量。由于上面的代码只是一个参数接收的演示,也就没有后续的相关操作。如果你不需要对 
                              directory 防空设计,可以将第8-10行替换为 “if defined p1 (” 
                              将其简化,而只保留下一个分支。<BR><BR>&nbsp; &nbsp; 
                              下面谈谈上段提到的下一个分支,也就是第二个 if 语句的 else 
                              部分,即一个参数的情况。因为这一个参数的内容仍然会是路径、数字其中之一,所以还需将变量 
                              directory 赋值为“.”,以防碰到的参数是数字,也就是第11行的功能。再看看第12行,以 
                              p1 为参数跳转到标签 _test 
                              ,完成一次类似功能函数的调用。我们不知道完成了什么功能,先放放一放,往下看。下面到了第一个 if 
                              语句的 else 部分,即两个参数的情况。发现分别以 p1 p2 调用了两次 _test 
                              函数。这回我们有必要研究一下 _test 函数到底完成了什么功能。<BR><BR>&nbsp; 
                              &nbsp; 直接跳转到第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 + -