![]() |
中国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楼的方法会比较简便.
[ 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: 正是此意,你的代码好深奥哦. 经测试你的代码,如果只有一个参数时是正确的,但如果有两个以上参数就无法运行了.而且我也不太明白应该如何调用你的示例 以下是运行结果: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 |