标题: call 能调用什么
[打印本页]
作者: bjsh
时间: 2007-3-17 00:51
标题: call 能调用什么
只知道 call能调用 另一个批处理或者程序;
还有标签;
看了些东西;似乎又觉得可以调用命令;
我见到的是 调用了 echo
但是想不明白;
到底这里是怎么用的呢?
用call 调用其他命令的好处或者用途是什么呢??
能给个例子做一下解释吗
作者: bjsh
时间: 2007-3-17 01:40
自己钻研了一下;
研究了lxmxn的
Quote: |
@echo off
set #=abcdefghijklmnopqrstuvwxyz
for,/l,%%$,in,(-26,1,-1)do,call,echo,%%#:~%%$,1%%
pause
|
|
代码
我的理解如下
Quote: |
::echo %#:1,1%
echo %#:2,1%
........
........
echo %#:26,1%
|
|
利用循环
那么能否用一下代码来实现呢
Quote: |
@echo off
set #=abcdefghijklmnopqrstuvwxyz
for /l %%$ in (-26,1,-1) do echo %#:~%%$,1%
pause
|
|
输出结果
Quote: |
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz 26行
................
...............
abcdefghijklmnopqrstuvwxyz
|
|
所以错误 分析原因 是因为 缺少 变量延迟;
利用call来调用echo 命令
代码如下
就是lxmxn的代码
Quote: |
@echo off
set #=abcdefghijklmnopqrstuvwxyz
for /l %%$ in (-26,1,-1) do call echo %%#:~%%$,1%%
pause
|
|
结果
结果符合要求
所以call 实现了近似变量延迟的作用
不知道我理解的是否正确;
还有别的什么例子 来演示下 call 调用命令的 神奇之处吗?
[
Last edited by bjsh on 2007-3-16 at 12:46 PM ]
作者: htysm
时间: 2007-3-17 03:09
我也是,对CALL是一知半解呀.
作者: xycoordinate
时间: 2007-3-17 03:28
所以错误 分析原因 是因为 缺少 变量延迟
@echo off
set #=abcdefghijklmnopqrstuvwxyz
for /l %%$ in (-26,1,-1) do echo %#:~%%$,1%
pause
有可能呀!!!
修改一下:
@echo off
setlocal enabledelayedexpansion
set #=abcdefghijklmnopqrstuvwxyz
for /l %%$ in (-26,1,-1) do echo !#:~%%$,1!
就能得到:
a
b
c
d
...
...
z
继续关注。。。。。。
作者: mtiankong
时间: 2007-4-21 01:15
明白了。。。。
作者: zhoushijay
时间: 2007-4-21 01:43
有可能call是把变量%#:~%%$,1%调出了for循环,从而达到与变量延迟相同的效果
作者: everest79
时间: 2007-4-21 02:11
for 在初始化时已将引用变量全部扩展,所以这时for内的变量已经是实际值,而不在是扩展字符,也就是静态值,针对这一特点,又出现了变量延迟,反过来说就是一种在for这种命令类型中充许动态存在的变量,而call的作用就像是在当前命令进程下建立了一个子进程,而这个子进程的变量是与当前CMD的变量缓存同步的,这样也是起到了类似延迟的作用,针对变量,call命令还有一个就是多重引用符的特征
set pri1=
set test=%pri1%
set pri1=999
echo %test% => out: %pri1%
call echo %test% => out:999
以上例子中=>符号后的为屏幕输出,这是在CMD交互模式下的操作,因为批处理中对引用符敏感,所以需要增加多余的引用符号,这也间接证明了,call是工作在如同子进程下的一个环境中的
[
Last edited by everest79 on 2007-4-20 at 01:12 PM ]
作者: vkill
时间: 2007-4-21 02:16
貌似这个用call是屏蔽命令回显
作者: everest79
时间: 2007-4-21 02:33
怎么屏蔽?
作者: flyinspace
时间: 2007-4-21 03:49
set pri1=
set test=%pri1%
set pri1=999
echo %test% => out: %pri1%
call echo %test% => out:999
这个不明白啊?有调用错误的提示。
作者: everest79
时间: 2007-4-21 04:13
没有=>后边的
作者: flyinspace
时间: 2007-4-21 04:18
ECHO 处于关闭状态。
请按任意键继续. . .
运行后提示这个???
多了一个文件。里面的内容是 =999
这个有什么用啊?
作者: everest79
时间: 2007-4-21 04:21
set pri1=
set test=%pri1%
set pri1=999
echo %test%
call echo %test%
是这样的
echo %test%会显示 字符串"%pri1%"
call echo %test%显示的是999
作者: htysm
时间: 2007-4-21 05:02
ls ,保存成BAT文件,在VISTA下执行的结果是:
附件
1:
无标题.jpg (2007-4-21 05:02, 7.28 K,下载次数: 1)
作者: everest79
时间: 2007-4-21 06:52
我这边没条件在vista下测试,那你需要仔细研究下vista与xp的cmd有什么不同啦,呵呵
作者: waynebeat
时间: 2007-4-21 14:39
Quote: |
Originally posted by everest79 at 2007-4-21 04:21:
set pri1=
set test=%pri1%
set pri1=999
echo %test%
call echo %test%
是这样的
echo %test%会显示 字符串"%pri1%"
call echo %test%显示的是999 |
|
我在xp下测试过,不是你所说的结果,因为,你已经把pri1设置为空,而test=%pri1%
,这样test也为空,所以,正如大家所说,根本不会有显示,只是说“echo 处于打开状态”,而且出现了两次就说明,有call和没有call是一样的。你可以把pri1随便赋一个值,就会很明显。
作者: everest79
时间: 2007-4-22 07:57
这是在CMD交互模式下的操作
作者: waynebeat
时间: 2007-4-22 08:46
Quote: |
Originally posted by everest79 at 2007-4-22 07:57:
这是在CMD交互模式下的操作 |
|
不好意思,是我没看清题……
在批处理里可以这么写,就和你用交互的结果是一样的,那这里面的call echo和linux的eval作用是一样噢
set pri1=
set test=%%pri1%%
set pri1=999
echo %test%
call echo %test%
作者: huahua0919
时间: 2007-11-29 13:57
call 有变量延次的效果??
作者: hongtashan
时间: 2009-2-7 18:15
call作用:一个批处理程序调用另一个批处理程序,并且不终止父批处理程序,对这个又有了理解,但愿不是错误的