|
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
状态 离线
|
|
2008-9-25 03:22 |
|
|
zqz0012005
中级用户
积分 297
发帖 135
注册 2006-10-21
状态 离线
|
|
2008-9-25 03:28 |
|
|
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: |
- ::其它代码
- call :获取最后一个参数 %*
- ::放其它代码
- goto :eof
- :获取最后一个参数
- if "%~2"=="" goto :eof
- set DIR="%~2"
- shift /2
- goto %0
chenall发表于: 2008-09-25 10:01 |
|
[ Last edited by chenall on 2008-9-25 at 04:18 PM ]
|
QQ:366840202
http://chenall.net |
|
2008-9-25 10:16 |
|
|
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 |
|
|
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 |
|