中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-09 20:56
47,811 主题排行 / 349,897 发帖 / 今日 2 篇 / 48,255 会员排行
DOS批处理 & 脚本技术(批处理室) » [已解决]如何正确批处理中传递的参数(最后一个参数)
可打印版本  1,684 / 12
第1楼 dejoy 发表于 2008-09-25 03:02
初级用户 发帖 64 积分 76
[已解决]如何正确批处理中传递的参数(最后一个参数)
小弟初学BAT,现写一个传递参数的BAT,但无法正确处理传递的参数,请教各位大大.
写一个a.bat,需要传递参数%1,%2,%3...,我想实现的是前面的参数数量是可变的,最后一个参数规定为一个路径参数,即调用方式可为1. a.bat aa c:\dd,也可为2. a.bat aa bb c:\dd,调用的参数数量是不定的.
我现在在a.bat中处理是这样的:
if not {%2} == {} set DIR=%~2%
这样只能假定参数只有两个,第2个为路径参数,但如果用第2种方法调用就出错了,实际应该dir = %~3%, 小弟初学,不知用何办法可动态取得最后一个参数,现请教各位大大.
有点小要求,就是能跨win98/winnt运行,我的测试机器为win2000,win98,winxp,win2003

[ Last edited by dejoy on 2008-9-27 at 22:11 ]
第2楼 pusofalse 发表于 2008-09-25 03:17
银牌会员 发帖 646 积分 1,604
%~2%是完全错误的写法,但仍然扩展正确,是因为参量扩展的一些特性,~:增强扩展。如果你改为%2%,就会出错了。
可以这样

如果路径中空格,但未用""闭合的话,得出来的结果会出错,所以不管有无空格,路径最好都用""闭合。
第3楼 zqz0012005 发表于 2008-09-25 03:22
中级用户 发帖 135 积分 297
第4楼 zqz0012005 发表于 2008-09-25 03:28
中级用户 发帖 135 积分 297
我的方法不好,效率低,如果位置没放好还会导致参数错乱
只是一个思路而已
第5楼 dejoy 发表于 2008-09-25 04:03
初级用户 发帖 64 积分 76
谢谢楼上两位,经过试验两位的方法都可行. 确如zqz0012005所说,你的方法因为移动了变量位置,会引起其它的变量引用错误.

pusofalse说的对,我先自己尝试时,用%2%就是错误的,换成%~2%才对.总的来说,你的方法运行正常.只是不知这代码能不能在win98下执行?因为我的代码需要跨win98&winnt执行
第6楼 pusofalse 发表于 2008-09-25 06:00
银牌会员 发帖 646 积分 1,604
%~2%也不对,%2或%~2才是正确的写法,前者保留参数首尾的引号,后者去除参数首尾的引号。
第7楼 dejoy 发表于 2008-09-25 09:08
初级用户 发帖 64 积分 76
哦,原来引用变量只需要前面的一个%就可以了啊,我一直还以为引用变量需要用两个%括起来
第8楼 chenall 发表于 2008-09-25 10:16
银牌会员 发帖 469 积分 1,276 来自 福建泉州
不知我有没有理解错楼主的意思,我的理解为
批处理可以带很多参数,但路径参数是最后一个.也就是说只要设定最后一个参数为DIR即可.
使用以下代码就可以保证批处理参数位置不动.

2楼的方法会比较简便.


  1. ::其它代码
  2. call :获取最后一个参数 %*
  3. ::放其它代码
  4. goto :eof

  5. :获取最后一个参数
  6. if "%~2"=="" goto :eof
  7. set DIR="%~2"
  8. shift /2
  9. goto %0
chenall发表于: 2008-09-25 10:01


[ Last edited by chenall on 2008-9-25 at 04:18 PM ]
第9楼 dejoy 发表于 2008-09-25 12:44
初级用户 发帖 64 积分 76
Originally posted by chenall at 2008-9-25 10:16 AM:
不知我有没有理解错楼主的意思,我的理解为
批处理可以带很多参数,但路径参数是最后一个.也就是说只要设定最后一个参数为DIR即可.
使用以下代码 ...


正是此意,你的代码好深奥哦. 经测试你的代码,如果只有一个参数时是正确的,但如果有两个以上参数就无法运行了.而且我也不太明白应该如何调用你的示例

以下是运行结果:c.BAT

E:\>c a
E:\>call :获取最后一个参数 a
E:\>if "" == "" goto :eof
E:\>goto :eof

E:\>c a d:\www
E:\>call :获取最后一个参数 a d:\www
E:\>if "d:\www" == "" goto :eof
E:\>set DIR="d:\www"
E:\>shift
E:\>goto a
系统找不到指定的批标签 - a
E:\>goto :eof

[ Last edited by dejoy on 2008-9-25 at 12:46 PM ]
第10楼 moniuming 发表于 2008-09-25 14:10
银牌会员 发帖 574 积分 1,335 来自 广西
我想8楼应该是这个意思吧
第11楼 pusofalse 发表于 2008-09-25 16:04
银牌会员 发帖 646 积分 1,604
Originally posted by dejoy at 2008-9-25 09:08 AM:
哦,原来引用变量只需要前面的一个%就可以了啊,我一直还以为引用变量需要用两个%括起来

%1 %2 %3....%9这样的叫参量,参量(parameter)(或叫参数)在引用时必须是一个%,你用%~1%之所以没有出错是因为在前面加了~,%~1这部分被当作成了参数的增强扩展形式,而后面的%,会被CMD脱去不要了。。
总结起来,使用%~1%之所以没有出错,是因为歪打正着了。
其他的变量(variable),比如windir,如果写成%windir也是错误的,必须是%windir%。
第12楼 chenall 发表于 2008-09-25 16:19
银牌会员 发帖 469 积分 1,276 来自 福建泉州
8楼上面我没有注意,SHIFT少了个参数所以运行出错..
已改正
直接调用,效果同二楼.结果就是把最后一个参数传给dir变量.
第13楼 dejoy 发表于 2008-09-25 16:46
初级用户 发帖 64 积分 76
8楼及10楼的代码好像有些相似,不过我不知道该怎么调用? 简单的说用您们的代码怎么把dir显示出来echo %dir%应该放您们的代码中那儿?

因为要同时支持win98及winnt,我根据2楼的代码写成如下,请各位指教



我用上述代码算是解决问题了,也许很粗糙,不过还行

[ Last edited by dejoy on 2008-9-27 at 21:53 ]
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023