中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决]如何正确批处理中传递的参数(最后一个参数)
作者:
标题: [已解决]如何正确批处理中传递的参数(最后一个参数) 上一主题 | 下一主题
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『楼 主』:  [已解决]如何正确批处理中传递的参数(最后一个参数)

小弟初学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 ]

2008-9-25 03:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 2 楼』:  

%~2%是完全错误的写法,但仍然扩展正确,是因为参量扩展的一些特性,~:增强扩展。如果你改为%2%,就会出错了。
可以这样
@echo off
for %%a in (%*) do set "dir=%%~a"
echo %dir%&pause
如果路径中空格,但未用""闭合的话,得出来的结果会出错,所以不管有无空格,路径最好都用""闭合。



心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-9-25 03:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zqz0012005
中级用户




积分 297
发帖 135
注册 2006-10-21
状态 离线
『第 3 楼』:  


@echo off
:loop
if "%~1" neq "" (
    shift
    goto loop
) else (
    set "dir=%~0"
)

echo %dir%
pause




hh.exe ntcmds.chm::/ntcmds.htm
2008-9-25 03:22
查看资料  发短消息 网志  OICQ (411976538)  编辑帖子  回复  引用回复
zqz0012005
中级用户




积分 297
发帖 135
注册 2006-10-21
状态 离线
『第 4 楼』:  

我的方法不好,效率低,如果位置没放好还会导致参数错乱
只是一个思路而已



hh.exe ntcmds.chm::/ntcmds.htm
2008-9-25 03:28
查看资料  发短消息 网志  OICQ (411976538)  编辑帖子  回复  引用回复
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『第 5 楼』:  

谢谢楼上两位,经过试验两位的方法都可行. 确如zqz0012005所说,你的方法因为移动了变量位置,会引起其它的变量引用错误.

pusofalse说的对,我先自己尝试时,用%2%就是错误的,换成%~2%才对.总的来说,你的方法运行正常.只是不知这代码能不能在win98下执行?因为我的代码需要跨win98&winnt执行

2008-9-25 04:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 6 楼』:  

%~2%也不对,%2或%~2才是正确的写法,前者保留参数首尾的引号,后者去除参数首尾的引号。



心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-9-25 06:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『第 7 楼』:  

哦,原来引用变量只需要前面的一个%就可以了啊,我一直还以为引用变量需要用两个%括起来

2008-9-25 09:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 8 楼』:  

不知我有没有理解错楼主的意思,我的理解为
批处理可以带很多参数,但路径参数是最后一个.也就是说只要设定最后一个参数为DIR即可.
使用以下代码就可以保证批处理参数位置不动.

2楼的方法会比较简便.

  Quote:

  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 ]

   此帖被 +8 点积分        点击查看详情   
评分人:【 moniuming 分数: +8  时间:2008-9-25 16:39




QQ:366840202
http://chenall.net
2008-9-25 10:16
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『第 9 楼』:  



  Quote:
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 ]

2008-9-25 12:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 10 楼』:  我想8楼应该是这个意思吧


@echo off
::其它代码
call :获取最后一个参数 %*
::放其它代码
goto :eof
:获取最后一个参数
if "%~2"=="" goto :eof
set "dir_=%2"
shift
goto :获取最后一个参数


2008-9-25 14:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by dejoy at 2008-9-25 09:08 AM:
哦,原来引用变量只需要前面的一个%就可以了啊,我一直还以为引用变量需要用两个%括起来

%1 %2 %3....%9这样的叫参量,参量(parameter)(或叫参数)在引用时必须是一个%,你用%~1%之所以没有出错是因为在前面加了~,%~1这部分被当作成了参数的增强扩展形式,而后面的%,会被CMD脱去不要了。。
总结起来,使用%~1%之所以没有出错,是因为歪打正着了。
其他的变量(variable),比如windir,如果写成%windir也是错误的,必须是%windir%。



心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-9-25 16:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 12 楼』:  

8楼上面我没有注意,SHIFT少了个参数所以运行出错..
已改正
直接调用,效果同二楼.结果就是把最后一个参数传给dir变量.



QQ:366840202
http://chenall.net
2008-9-25 16:19
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『第 13 楼』:  

8楼及10楼的代码好像有些相似,不过我不知道该怎么调用? 简单的说用您们的代码怎么把dir显示出来echo %dir%应该放您们的代码中那儿?

因为要同时支持win98及winnt,我根据2楼的代码写成如下,请各位指教
@echo off
set dir=
::有两个以上参数才执行
if not {%1} == {} goto FIXEDFLAGS
goto FIXEDFLAGS_END
:FIXEDFLAGS
::判断操作系统
if NOT {%OS%} == {} goto winnt
:win98
for %%a in (%2 %3 %4 %5 %6 %7 %8 %9) do set dir=%%a
goto endos
:winnt
for %%a in (%2 %3 %4 %5 %6 %7 %8 %9) do set dir=%%~sa
:endos
echo dir = %dir%

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

[ Last edited by dejoy on 2008-9-27 at 21:53 ]

2008-9-25 16:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: