![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-26 01:25 |
共 47,812 主题排行 / 349,910 发帖 / 今日 0 篇 / 48,264 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 如何传递自定义参数 |
| 可打印版本 6,330 / 15 |
| 第1楼 xjmyga | 发表于 2006-05-12 15:31 |
| 新手上路 发帖 7 积分 18 来自 风花雪月 | |
|
如何传递自定义参数 我的第一个BAT中写的是这样
call 2.bat * txt c:\a 第二中写的是这样 @echo off if {%1}=={} goto :useageexit if {%2}=={} goto :useageexit if {%3}=={} goto :useageexit for /R %3 %%v IN (%1.%2) DO ( call:rn %%v ) :rn if %1==* exit ren %1 *.doc 就是说把第一个中的参数传到二中 问题就在这里 我现在想在二中直接写 入参数 不需要一来做媒介来完成自动改名 可有高手知道如何定义变量 不!! 给代码也行!!谢谢 最好能给出一个简单点的例子 [ Last edited by namejm on 2007-2-5 at 01:58 PM ] |
|
| 第2楼 3742668 | 发表于 2006-05-12 18:18 |
| 荣誉版主 发帖 718 积分 2,013 | |
有点绕口令的味道,不是很明白你的意思。似乎是想在第一个批处理中只用call 2.bat,而不加参数。如果是这样的话你可以在2.bat中用set /p来获得需要操作的参数。 |
|
| 第3楼 xjmyga | 发表于 2006-05-12 20:35 |
| 新手上路 发帖 7 积分 18 来自 风花雪月 | |
|
呵呵是这样的 我用第一个调用第二个 在调用过程把%1 2 3 的值传入进去根据传入的值做改名处理 明白吗
我现在想做的是 在第二中直接写入值而不需要第一个把值传进去 不用在DOS中写入参数值 直接写死谢谢 ![]() |
|
| 第4楼 xjmxjm1234 | 发表于 2006-05-12 21:20 |
| 中级用户 发帖 166 积分 361 | |
|
是 if {%1}=={} 吗?
我记得应该用 if "%1"=="" [ Last edited by xjmxjm1234 on 2006-5-13 at 12:56 ] |
|
| 第5楼 xjmyga | 发表于 2006-05-13 08:04 |
| 新手上路 发帖 7 积分 18 来自 风花雪月 | |
|
这个没事的我可以保正我的程序一定能运行的 我只想一步玩成写死
比如说 能不能把%1换成 a=多少,在下面的程序中就用a代做%1这样的方法有没有 |
|
| 第6楼 xjmyga | 发表于 2006-05-13 08:08 |
| 新手上路 发帖 7 积分 18 来自 风花雪月 | |
|
各位兄弟帮帮忙呀 给代码也可以 我自己看好好 不过最重要的是不需要在DOS下写入值 要的是直接运行就能完成改名 文件名与被文件名路径写死
|
|
| 第7楼 3742668 | 发表于 2006-05-13 12:46 |
| 荣誉版主 发帖 718 积分 2,013 | |
|
用set命令,set a=多少,然后把%1换成%a%,set b=多少,再把%2换成%b%.....
万丈高楼平地起。 Re xjmxjm1234: 其实防空字符并没有什么官方的方法与规定,一般来说都是根据各人的习惯,有时候用{},有时候用“”,甚至有时候用goto,call以及根据errorlevel来防空,更详细的解释可以参考willsort兄的帖子: 批处理编程的异类 |
|
| 第8楼 xjmxjm1234 | 发表于 2006-05-13 16:21 |
| 中级用户 发帖 166 积分 361 | |
|
三克油 多谢提醒!
|
|
| 第9楼 bagpipe | 发表于 2006-05-13 16:48 |
| 银牌会员 发帖 425 积分 1,144 来自 北京 | |
|
我的第一个BAT中写的是这样
call 2.bat * txt c:\a @echo off if {%1}=={} goto :useageexit if {%2}=={} goto :useageexit if {%3}=={} goto :useageexit for /R %3 %%v IN (%1.%2) DO ( call:rn %%v ) :rn if %1==* exit ren %1 *.doc 不就是批量改名吗?LZ的方法是不是有些小题大做了?不明白楼主为什么这么做? @echo off if "%1"=="" goto :eof if "%2"=="" goto :eof if "%3"=="" goto :eof for /R "%3" %%v IN (%1.%2) DO ( ren "%%v" "%%~nv".doc ) 如果楼主是为了批量改名,上面的我是安装你的改的,就一个批处理就可以了,没有必要那么烦琐 希望你的问题能够解决 |
|
| 第10楼 willsort | 发表于 2006-05-13 18:22 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re xjmyga:
按照你的叙述,我只能理解为你想实现命令行参数在批处理中的直接替换,将它由一个通用性程序变成一个专用型程序,而如果你具备编写者两段批处理的能力,就也应该可以轻松实现这种转换。我的做法如下: Re bagpipe: 关于你的第二段代码,可以考虑舍弃if "%1" 和 if "%2" 两句,因为我们最终要求三个命令行参数都必须具备,那么只需要判断最后一个就可以了,毕竟没有%1和%2,%3就无从存在。 很抱歉!一日之内屡次指摘兄的代码,实乃心性使然,万望勿怪! |
|
| 第11楼 3742668 | 发表于 2006-05-13 19:54 |
| 荣誉版主 发帖 718 积分 2,013 | |
|
for /R %3. %%v IN (%1.%2) DO ren "%%v" "%%~nv".doc
有参数3则为参数3的目录,默认为当前目录。 |
|
| 第12楼 xjmyga | 发表于 2006-05-14 00:34 |
| 新手上路 发帖 7 积分 18 来自 风花雪月 | |
|
多谢各位兄弟指教 小弟用PB改程序,在PB中调中BAT,这个BAT就必需是一步玩成不能用CALL来调用,十分的感谢你们谢谢谢谢!!
willsort说的方法我也试过可是在运行现在点问题所以没用,谢谢你们啦。帮我解决了个比较头痛的问题 |
|
| 第13楼 bagpipe | 发表于 2006-05-14 17:30 |
| 银牌会员 发帖 425 积分 1,144 来自 北京 | |
|
第一段代码不是我写的,是楼主写的,我只是按照楼主的代码改写的,至于省略%1 %2,我看还是楼主没有说清楚,如果楼主说必有三个参数我也就不这样写了, WILLSORT兄哪里话,批评或者提意见我不在乎,这样会让我学到的更多,我已经不是刚来到联盟时的我了,望所有高手多多指点.......
|
|
| 第14楼 xjmyga | 发表于 2006-05-15 08:41 |
| 新手上路 发帖 7 积分 18 来自 风花雪月 | |
|
@echo off
for /R c:\a %%v IN (*.txt) DO ( call:rn %%v ) :rn if %1==* exit ren %1 *.doc 请问板主OR各位兄弟,为什么这个程序中没有定义%1,然REN能用%1做参数值呢 还望高手指点 |
|
| 第15楼 willsort | 发表于 2006-05-15 22:19 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re xjmyga:
%0~%9是系统预定义的命令行参数变量,不需要也不能由我们来定义。但是我们可以给这些变量赋值,方法即使通过在命令行或者批处理中带参数调用一个批处理。以下方法1、2在DOS和CMD中同时有效,3只在CMD中有效。 1、命令行:batprog arg1 arg2 arg3 ... 2、批处理:call batprog arg1 arg2 arg3 ... 3、批处理中调用自身并从某个标签处起始执行:call:label arg1 arg2 arg3 ... 经过此次调用,arg1,arg2,arg3这些参数被传入批处理中并分别赋给%1,%2,%3。而%0代表命令行的第一个串,即批处理命令本身。 调用后:%0==batprog(方法1、2)或者其全路径名(方式3),%1==arg1,%2==arg2... 10楼的案例中,for中的call:rn一句即属于第三种调用方式。将%%v作为命令行参数传递给自身,并赋给%1,供在:rn段中引用。 另外,10楼代码是从你的原代码直接转换而来,仍然继承了一些缺陷。比如if %1==* 缺乏必要的防空措施,在%1为空值时必然会出错,尽管在这里它没有取空值的可能;而此句本身也因为%1不可能为*而显得多余,从而使:rn段和自我调用显得多余。9楼的第二段代码正是针对此点进行改进的。 而之所以%1即不会为*,也不会为空,皆因for的解析特性,这需要慢慢揣摩。 因此,代码的最后改进结果如下: |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |