批处理CALL,调用其他批处理子程序的用法

来源:百度知道 编辑:UC知道 时间:2024/09/21 12:45:45
CALL调用其他CMD时,子程序,在命令行里面应该怎么写。
CALL的说明:
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。

语法

call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]

参数

[Drive:}[Path] FileName

指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名
例如,有2批处理
1.cmd:
@echo off
:P1
goto :EOF
:P2
set t=%1
set /a bn=%2
set /a %t%=%bn%+1
GOTO :EOF
---------------------------------
2.CMD:
@ECHO OFF
set /a e=0
call 1.cmd?
echo %e%
pause>nul
请问?处该怎么写,如果是一般子程序应该是CALL :P2 E 22,最后输出为23
我试验CALL 1.CMD :P2 E 22 没有经过1的P2直接输出0
CALL 1.CMD:P2 E 22直接报错.

我觉得问题出现在e的身上,如果你有学过C语言的话应该比较好理解。就是C只是在2.cmd这个文件中,作为里面的一个局部的参数,调用了1.cmd,虽然在1.cmd里面做了运算,但运算的结果是没有传递出来的。所以e的值还是为0.就好像C要用return 把参数值传回来那样,又或者,如果e是一个全局变量的话,或许还行。不过在DOS里面我不知道有没有全局变量这个概念。所以,你要实现这种值传递的话,恐怕,用批处理不是什么好的选择。如果你只是想学习一下call的调用的话,基本上你已经会了

后来想想,或许能用批处理中的errorlevel作为返回值。于是把你的批处理修改了一下,代码如下:
一、1.cmd
@echo off
set /a t=%1+1
set errorlevel=%t%
GOTO :EOF

二、2.cmd
@ECHO OFF
set /a e=0
call 1.cmd 22
set e=%errorlevel%
echo %e%
pause>nul

这样就实现了值传递了,如有需要,我们可以探讨一下,我的QQ:243488442