标题: 如何传递自定义参数
[打印本页]
作者: xjmyga
时间: 2006-5-12 15:31
标题: 如何传递自定义参数
我的第一个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 ]
作者: 3742668
时间: 2006-5-12 18:18
Quote: |
就是说把第一个中的参数传到二中 问题就在这里 我现在想在二中直接写
入参数 不需要一来做媒介来完成自动改名 可有高手知道如何定义变量
不!! 给代码也行!!谢谢
... |
|
有点绕口令的味道,不是很明白你的意思。似乎是想在第一个批处理中只用call 2.bat,而不加参数。如果是这样的话你可以在2.bat中用set /p来获得需要操作的参数。
作者: xjmyga
时间: 2006-5-12 20:35
呵呵是这样的 我用第一个调用第二个 在调用过程把%1 2 3 的值传入进去根据传入的值做改名处理 明白吗
我现在想做的是 在第二中直接写入值而不需要第一个把值传进去
不用在DOS中写入参数值 直接写死谢谢
作者: xjmxjm1234
时间: 2006-5-12 21:20
是 if {%1}=={} 吗?
我记得应该用 if "%1"==""
[
Last edited by xjmxjm1234 on 2006-5-13 at 12:56 ]
作者: xjmyga
时间: 2006-5-13 08:04
这个没事的我可以保正我的程序一定能运行的 我只想一步玩成写死
比如说 能不能把%1换成 a=多少,在下面的程序中就用a代做%1这样的方法有没有
作者: xjmyga
时间: 2006-5-13 08:08
各位兄弟帮帮忙呀 给代码也可以 我自己看好好 不过最重要的是不需要在DOS下写入值 要的是直接运行就能完成改名 文件名与被文件名路径写死
作者: 3742668
时间: 2006-5-13 12:46
用set命令,set a=多少,然后把%1换成%a%,set b=多少,再把%2换成%b%.....
万丈高楼平地起。
Re xjmxjm1234:
其实防空字符并没有什么官方的方法与规定,一般来说都是根据各人的习惯,有时候用{},有时候用“”,甚至有时候用goto,call以及根据errorlevel来防空,更详细的解释可以参考willsort兄的帖子:
[讨论]批处理编程的异类
作者: xjmxjm1234
时间: 2006-5-13 16:21
标题: 三克油
多谢提醒!
作者: bagpipe
时间: 2006-5-13 16:48
我的第一个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
)
如果楼主是为了批量改名,上面的我是安装你的改的,就一个批处理就可以了,没有必要那么烦琐
希望你的问题能够解决
作者: willsort
时间: 2006-5-13 18:22
Re xjmyga:
按照你的叙述,我只能理解为你想实现命令行参数在批处理中的直接替换,将它由一个通用性程序变成一个专用型程序,而如果你具备编写者两段批处理的能力,就也应该可以轻松实现这种转换。我的做法如下:
@echo off
for /R c:\a %%v IN (*.txt) DO (
call:rn %%v
)
:rn
if %1==* exit
ren %1 *.doc
Re bagpipe:
关于你的第二段代码,可以考虑舍弃if "%1" 和 if "%2" 两句,因为我们最终要求三个命令行参数都必须具备,那么只需要判断最后一个就可以了,毕竟没有%1和%2,%3就无从存在。
很抱歉!一日之内屡次指摘兄的代码,实乃心性使然,万望勿怪!
作者: 3742668
时间: 2006-5-13 19:54
for /R %3. %%v IN (%1.%2) DO ren "%%v" "%%~nv".doc
有参数3则为参数3的目录,默认为当前目录。
作者: xjmyga
时间: 2006-5-14 00:34
多谢各位兄弟指教 小弟用PB改程序,在PB中调中BAT,这个BAT就必需是一步玩成不能用CALL来调用,十分的感谢你们谢谢谢谢!!
willsort说的方法我也试过可是在运行现在点问题所以没用,谢谢你们啦。帮我解决了个比较头痛的问题
作者: bagpipe
时间: 2006-5-14 17:30
第一段代码不是我写的,是楼主写的,我只是按照楼主的代码改写的,至于省略%1 %2,我看还是楼主没有说清楚,如果楼主说必有三个参数我也就不这样写了, WILLSORT兄哪里话,批评或者提意见我不在乎,这样会让我学到的更多,我已经不是刚来到联盟时的我了,望所有高手多多指点.......
作者: xjmyga
时间: 2006-5-15 08:41
@echo off
for /R c:\a %%v IN (*.txt) DO (
call:rn %%v
)
:rn
if %1==* exit
ren %1 *.doc
请问板主OR各位兄弟,为什么这个程序中没有定义%1,然REN能用%1做参数值呢
还望高手指点
作者: willsort
时间: 2006-5-15 22:19
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的解析特性,这需要慢慢揣摩。
因此,代码的最后改进结果如下:
@echo off
for /R c:\a %%v IN (*.txt) do ren %%v *.doc
作者: frankwz
时间: 2007-4-13 10:25
不懂