![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-07 08:03 |
共 48,040 主题排行 / 350,125 发帖 / 今日 0 篇 / 48,252 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » call 调用:label(标签)引发的问题[已结] |
| 可打印版本 2,754 / 17 |
| 第1楼 stornager | 发表于 2007-06-27 21:23 |
| 中级用户 发帖 131 积分 328 | |
|
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 ] |
|
| 第2楼 wudixin96 | 发表于 2007-06-27 21:28 |
| 银牌会员 发帖 931 积分 1,928 | |
|
不是经常用call echo %%a%%等吗?
|
|
| 第3楼 zh159 | 发表于 2007-06-27 21:34 |
| 金牌会员 发帖 1,467 积分 3,687 | |
|
调用标签也必须包含“:”号
|
|
| 第4楼 lxmxn | 发表于 2007-06-27 21:47 |
| 版主 发帖 4,938 积分 11,386 | |
Originally posted by stornager at 2007-6-27 21:23:我测试没什么问题,比如“call :date”:
有什么意外结果?
|
|
| 第5楼 dikex | 发表于 2007-06-27 21:56 |
| 高级用户 发帖 366 积分 788 | |
|
call调用标签时标签可以有“:”也可以没有,当没有时,而标签名恰好为某命令名时,系统就当你是想调用那个命令了;
指代不清的结果,平时养成 call :标签名 的习惯比较好 |
|
| 第6楼 lxmxn | 发表于 2007-06-27 22:47 |
| 版主 发帖 4,938 积分 11,386 | |
Originally posted by dikex at 2007-6-27 21:56: call 调用标签的时候不能没有:号吧?试试。 |
|
| 第7楼 dikex | 发表于 2007-06-27 22:49 |
| 高级用户 发帖 366 积分 788 | |
|
可以的,我很久以前也是不用的,但后来如了楼主类似的问题,于是以后都加上了冒号了
|
|
| 第8楼 lxmxn | 发表于 2007-06-27 22:51 |
| 版主 发帖 4,938 积分 11,386 | |
|
你测试过了没有?
|
|
| 第9楼 stornager | 发表于 2007-06-27 23:01 |
| 中级用户 发帖 131 积分 328 | |
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 ] |
|
| 第10楼 dikex | 发表于 2007-06-27 23:12 |
| 高级用户 发帖 366 积分 788 | |
Originally posted by lxmxn at 2007-6-27 10:51 PM: 倒……倒……倒…… 我搞错了…… 还以为是goto,原来是call…… call需要加冒号的…… (犯傻中) |
|
| 第11楼 lxmxn | 发表于 2007-06-27 23:35 |
| 版主 发帖 4,938 积分 11,386 | |
Originally posted by stornager at 2007-6-27 23:01: 之所以会出现“系统找不到指定的批处理标签 -”的错误提示,是因为“call :%^(set^)%”的时候,系统把“^(set^)”看作是一个变量,但是你并没有给他赋值,所以导致它的值为空,此时就相当于“ call :”,调用了一个不存在的标签,系统自然就给出了上面的提示。 下面给出一个例子,希望对你理解call有帮助。 |
|
| 第12楼 stornager | 发表于 2007-06-27 23:42 |
| 中级用户 发帖 131 积分 328 | |
|
关于上面的代码我在网吧测试了3个多小时,不论怎样改变标签本身的名称,只要其内含有系统内置命令或外部命令都不易得到正确的输出结果。还有我在命令行打入下面一串命令,为何不能得到值123(系统没有提示错误):
call ( echo. set n=123 echo %n% ) |
|
| 第13楼 stornager | 发表于 2007-06-27 23:55 |
| 中级用户 发帖 131 积分 328 | |
Originally posted by lxmxn at 2007-6-27 11:35 PM: 再次谢谢斑竹的指教,但是下面代码的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 |
|
| 第14楼 dikex | 发表于 2007-06-28 00:37 |
| 高级用户 发帖 366 积分 788 | |
|
首先,是前标签要加冒号,这个上面已经说了;
第二,貌似和标签名后面的括号有关: 看看下面的代码: 运行时发现报错,而出错提示是“系统找不到指定的批处理标签 - 1”,括号后面的不见了,在看看下面的代码: 这是出错提示变为了“系统找不到指定的批处理标签 - 1123)”; 再测试一个代码: 这时居然可以成功调用了! 我推测是那个括号(的问题了,如果标签名里面包含有(,那么系统将会忽略它本身和它后面的所有字符,于是就会报错了;%!等变量里面可以 存在(,因为系统会在命令执行前把相关的变量替换掉; 而具体楼主的那段代码,由于前面的%^(set^)%没有复制(即为空),而(和它后面的又被忽略了,所有出现了“系统找不到指定的批处理标签 -”的错误提示也就可以解释了; 第三,我想这个应该很可能和系统执行批处理文件的方法有一定的关系: 记得以前有人问过怎样使得执行下面的类似代码运行时不会提示“找不到批处理文件”(拖到cmd窗口下执行可以看到相关信息); 当时我做了下面的一些试验和推测:
原贴:http://www.cn-dos.net/forum/viewthread.php?tid=31094 回到标签的讨论上来,由于系统按照顺序执行批处理里面的代码,当执行到 call :标签名,如果有标签名里面含有变量,系统会替换掉那个变 量,但由于后面的需要被调用的标签上面的变量并没有被替换,这时就会出现找不到标签的错误信息了,看看下面的几个代码: 这个执行成功了,从回显那里可以看到被执行的代码是 call :123 ,也就是执行call是系统就已经把%^date^%替换为123了,再看看下面的代 码: 系统提示“系统找不到指定的批处理标签 - 123”,同样系统已经把call后面的标签替换了,但系统并没有替换后面的被调用的那个标签,于 是系统就报错了。 综合2、3点,看看下面的代码: |
|
| 第15楼 zh159 | 发表于 2007-06-28 01:27 |
| 金牌会员 发帖 1,467 积分 3,687 | |
|
以前就试过,标签不能使用变量方式,倒是goto、call可以使用变量
这个方式会把(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 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |