Board logo

标题: 如何传递自定义参数 [打印本页]

作者: 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
不懂