中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » call 调用:label(标签)引发的问题[已结]
作者:
标题: call 调用:label(标签)引发的问题[已结] 上一主题 | 下一主题
stornager
中级用户

scriptlover


积分 328
发帖 131
注册 2007-3-25
状态 离线
『楼 主』:  call 调用:label(标签)引发的问题[已结]

测试代码: 一。 @echo off echo. echo. call %^(set^)%(echo I love you.)% pause :%^(set^)%(echo I love you.)% set n=1 2 3 4 5 6 7 8 echo %n% %n% %n% %n% echo %1% %1% %1% %1% ping -n 3 127.1>nul goto :eof 二。 @echo off echo. echo. call %^(set&&echo I love you.^)% pause :%^(set&&echo I love you.^)% set n=1 2 3 4 5 6 7 8 echo %n% %n% %n% %n% echo %1% %1% %1% %1% ping -n 3 127.1>nul goto :eof 经过分析认为:call 调用的标签不能含有系统内置命令或外部命令,否则就会得不到理想结果。请大家多测试!!! 今天晚上,在cmd里测试call,发现call date 有意想不到的结果。???可能大家早就知道啦。 由于时间关系,我要下机啦,明天再和大家讨论这个问题。 [ Last edited by stornager on 2007-6-28 at 11:32 PM ]




scriptlover Be with script forever!!
2007-6-27 21:23
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
wudixin96
银牌会员





积分 1928
发帖 931
注册 2007-1-6
状态 离线
『第 2 楼』:  

不是经常用call echo %%a%%等吗?


2007-6-27 21:28
查看资料  发短消息  网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 3 楼』:  

调用标签也必须包含“:”号




2007-6-27 21:34
查看资料  发短消息  网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  

Originally posted by stornager at 2007-6-27 21:23: 经过分析认为:call 调用的标签不能含有系统内置命令或外部命令,否则就会得不到理想结果。请大家多测试!!!
我测试没什么问题,比如“call :date”:
@echo off
echo Starting...
call :date
echo End...
exit/b

:date
echo This is the label :date line
echo Please press any key to exit
pause
今天晚上,在cmd里测试call,发现call date 有意想不到的结果。???可能大家早就知道啦。 由于时间关系,我要下机啦,明天再和大家讨论这个问题。
有什么意外结果?
G:\>call date 当前日期: 2007-06-27 星期三 输入新日期: (年月日) G:\>date 当前日期: 2007-06-27 星期三 输入新日期: (年月日) G:\>


2007-6-27 21:47
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 5 楼』:  

call调用标签时标签可以有“:”也可以没有,当没有时,而标签名恰好为某命令名时,系统就当你是想调用那个命令了; 指代不清的结果,平时养成 call :标签名 的习惯比较好




正在潜水修练的批处理小白
2007-6-27 21:56
查看资料  发短消息  网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  

Originally posted by dikex at 2007-6-27 21:56: call调用标签时标签可以有“:”也可以没有,当没有时,而标签名恰好为某命令名时,系统就当你是想调用那个命令了; 指代不清的结果,平时养成 call :标签名 的习惯比较好
call 调用标签的时候不能没有:号吧?试试。


2007-6-27 22:47
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 7 楼』:  

可以的,我很久以前也是不用的,但后来如了楼主类似的问题,于是以后都加上了冒号了




正在潜水修练的批处理小白
2007-6-27 22:49
查看资料  发短消息  网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 8 楼』:  

你测试过了没有?


2007-6-27 22:51
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
stornager
中级用户

scriptlover


积分 328
发帖 131
注册 2007-3-25
状态 离线
『第 9 楼』:  

Originally posted by lxmxn at 2007-6-27 10:51 PM: 你测试过了没有?
谢谢斑竹的指教,但是加了:命令提示符提示系统找不到指定的标签。:o:o:o对于call date的输出结果我感到惊奇,是因为我几乎没有直接在命令行敲入date,现在想通啦。 @echo off echo. echo. call :%^(set^)% pause :%^(set^)% set n=1 2 3 4 5 6 7 8 echo %n% %n% %n% %n% echo %1% %1% %1% %1% ping -n 3 127.1>nul goto :eof 这个批处理便是一个例子。 [ Last edited by stornager on 2007-6-27 at 11:17 PM ]




scriptlover Be with script forever!!
2007-6-27 23:01
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 10 楼』:  

Originally posted by lxmxn at 2007-6-27 10:51 PM: 你测试过了没有?
倒……倒……倒…… 我搞错了…… 还以为是goto,原来是call…… call需要加冒号的…… (犯傻中)




正在潜水修练的批处理小白
2007-6-27 23:12
查看资料  发短消息  网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 11 楼』:  

Originally posted by stornager at 2007-6-27 23:01: 谢谢斑竹的指教,但是加了:命令提示符提示系统找不到指定的标签。:o:o:o对于call date的输出结果我感到惊奇,是因为我几乎没有直接在命令行敲入 ...
之所以会出现“系统找不到指定的批处理标签 -”的错误提示,是因为“call :%^(set^)%”的时候,系统把“^(set^)”看作是一个变量,但是你并没有给他赋值,所以导致它的值为空,此时就相当于“ call :”,调用了一个不存在的标签,系统自然就给出了上面的提示。 下面给出一个例子,希望对你理解call有帮助。
@echo off
echo Beginning of test
set ^^(set^^)=Batch
call :%^(set^)%
echo End of test
pause&exit/b

:%^(set^)%
set n=1 2 3 4 5 6 7 8
echo    %n% %n% %n% %n% 
echo                      %1% %1% %1% %1%
ping -n 3 127.1>nul
goto :eof

:Batch
echo This script is worked


2007-6-27 23:35
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
stornager
中级用户

scriptlover


积分 328
发帖 131
注册 2007-3-25
状态 离线
『第 12 楼』:  

关于上面的代码我在网吧测试了3个多小时,不论怎样改变标签本身的名称,只要其内含有系统内置命令或外部命令都不易得到正确的输出结果。还有我在命令行打入下面一串命令,为何不能得到值123(系统没有提示错误): call ( echo. set n=123 echo %n% )




scriptlover Be with script forever!!
2007-6-27 23:42
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
stornager
中级用户

scriptlover


积分 328
发帖 131
注册 2007-3-25
状态 离线
『第 13 楼』:  

Originally posted by lxmxn at 2007-6-27 11:35 PM: 之所以会出现“系统找不到指定的批处理标签 -”的错误提示,是因为“call :%^(set^)%”的时候,系统把“^(set^)”看作是一个变量,但是你并没有给他 ...
再次谢谢斑竹的指教,但是下面代码的date不需要赋值吧???结果同样是系统找不到指定的批处理标签。 @echo off echo. call :%^(date^)% pause&exit/b :%^(date^)% set n=1 2 3 4 5 6 7 8 echo %n% %n% %n% %n% echo %1% %1% %1% %1% ping -n 3 127.1>nul goto :eof




scriptlover Be with script forever!!
2007-6-27 23:55
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 14 楼』:  

首先,是前标签要加冒号,这个上面已经说了; 第二,貌似和标签名后面的括号有关: 看看下面的代码:
call :1(123)
pause
goto :EOF

:1(123)
echo a
goto :EOF
运行时发现报错,而出错提示是“系统找不到指定的批处理标签 - 1”,括号后面的不见了,在看看下面的代码:
call :1123)
pause
goto :EOF

:ddd
echo a
goto :EOF
这是出错提示变为了“系统找不到指定的批处理标签 - 1123)”; 再测试一个代码:
call :1(123)
pause
goto :EOF

:1
echo a
goto :EOF
这时居然可以成功调用了! 我推测是那个括号(的问题了,如果标签名里面包含有(,那么系统将会忽略它本身和它后面的所有字符,于是就会报错了;%!等变量里面可以 存在(,因为系统会在命令执行前把相关的变量替换掉; 而具体楼主的那段代码,由于前面的%^(set^)%没有复制(即为空),而(和它后面的又被忽略了,所有出现了“系统找不到指定的批处理标签 -”的错误提示也就可以解释了; 第三,我想这个应该很可能和系统执行批处理文件的方法有一定的关系: 记得以前有人问过怎样使得执行下面的类似代码运行时不会提示“找不到批处理文件”(拖到cmd窗口下执行可以看到相关信息);
echo a
del %0
当时我做了下面的一些试验和推测:
先做一个试验,写一个批处理,内容为
@echo off
pause
echo a
pause
运行后先不要按任何键,在那个批处理上面右键——编辑,将echo a改为echo b,保存后转为那个正在运行的批处理的窗口,按一下任意键, 结果echo出来的是b而不是a! 再做一个试验,批处理内容如下:
@echo off
pause
echo a
pause
同样运行后不要按任何键,然后把那个批处理文件删除或者重命名,接着转为批处理的运行窗口,按一下任意键,批处理直接退出而不执行下 面的语句,隐约看到一行报错的语句; 关于这个,以下为个人猜测: 批处理运行时并不会一开始就将所有的代码载入内存,而是每执行完一行才载入下一行的代码,于是我们就产生了试验里面中途改变代码后执 行的是修改后的代码; 具体到楼主的那个批处理,由于批处理在运行时把自身删除了,在执行完那个del的命令后系统想往下读取下一行命令时却发现找不到那个批处 理文件,于是就报错了。
原贴:http://www.cn-dos.net/forum/viewthread.php?tid=31094 回到标签的讨论上来,由于系统按照顺序执行批处理里面的代码,当执行到 call :标签名,如果有标签名里面含有变量,系统会替换掉那个变 量,但由于后面的需要被调用的标签上面的变量并没有被替换,这时就会出现找不到标签的错误信息了,看看下面的几个代码:
set "^date^=123"
call :%^date^%
pause
goto :EOF

:123
echo a
goto :EOF
这个执行成功了,从回显那里可以看到被执行的代码是 call :123 ,也就是执行call是系统就已经把%^date^%替换为123了,再看看下面的代 码:
set "^date^=123"
call :%^date^%
pause
goto :EOF

:%^date^%
echo a
goto :EOF
系统提示“系统找不到指定的批处理标签 - 123”,同样系统已经把call后面的标签替换了,但系统并没有替换后面的被调用的那个标签,于 是系统就报错了。 综合2、3点,看看下面的代码: [code] set "(date)=123(" call :%(date)%456 pause goto :EOF :123 echo a goto :EOF [code] 如果上面的看明白了,那应该可以猜出这个代码是可以正常运行的 [ Last edited by dikex on 2007-6-28 at 12:41 AM ]




正在潜水修练的批处理小白
2007-6-28 00:37
查看资料  发短消息  网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 15 楼』:  

以前就试过,标签不能使用变量方式,倒是goto、call可以使用变量
call :1(123)
pause
goto :EOF

:1
echo %1
goto :EOF
这个方式会把(123)作为%1,但是call :1(123)(321)中的(321)却不能成为%2,(123)(321)作为整体为%1,需要%2以后的还得空格 [ Last edited by zh159 on 2007-6-28 at 10:31 AM ]


   此帖被 +1 点积分    点击查看详情   
评分人:【 komafd2 分数: +1  时间:2008-3-9 23:32




2007-6-28 01:27
查看资料  发短消息  网志   编辑帖子  回复  引用回复

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


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



论坛跳转: