中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » call 调用:label(标签)引发的问题[已结]
« [1] [2] »
作者:
标题: 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 楼』:  



  Quote:
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


  Quote:
今天晚上,在cmd里测试call,发现call date 有意想不到的结果。???可能大家早就知道啦。
由于时间关系,我要下机啦,明天再和大家讨论这个问题。

有什么意外结果?

  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
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
当时我做了下面的一些试验和推测:

  Quote:
先做一个试验,写一个批处理,内容为
@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
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: