例子。
foo.bat :
@echo off
start bar.bat 2 3
set result=//somehow return the value
echo %result%
pause
exit
bar.bat :
@echo off
set int1=%1
set int2=%2
set /a result=%int1%+%int2%
//somehow send the result to the running foo.bat
exit
谁能给我一个主意,如何做到这一点。我只能想到写一个文件,然后在for循环中检查这个文件是否存在,以及它包含的内容。但这在我看来太复杂了,先谢谢了。
批量文件 foo.bat
必须按以下方式编写。
@echo off
call "%~dp0bar.bat" 2 3
echo Result is: %result%
pause
批处理文件 bar.bat
必须按以下方式编写。
@echo off
set "int1=%~1"
set "int2=%~2"
set /A result=int1 + int2
批处理文件 foo.bat
电话 批处理文件 bar.bat
也就是在处理完 bar.bat
Windows命令处理器继续处理 foo.bat
与该批处理文件中命令后的下一条命令 呼叫. 两个批处理文件都是由相同的 cmd.exe
并共享相同的环境变量列表。
但在使用 start bar.bat
因为这样一来,就会多启动一个 cmd.exe
有自己的环境变量列表,用于处理批处理文件。bar.bat
的第二个实例并行执行。cmd.exe
而首例 cmd.exe
继续处理 foo.bat
紧接着 cmd.exe
.
批量文件 foo.bat
也可以写成。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
call :DoMath 2 3
echo Result is: %result%
echo/
pause
goto :EOF
:DoMath
set "int1=%~1"
set "int2=%~2"
set /A result=int1 + int2
goto :EOF
下面的一切 DoMath
现在是一个子程序,它可以从主代码的 foo.bat
.
重要的是,批处理文件不包含以下内容 exit
无参数 /B
导致总是退出 cmd.exe
处理批处理与调用层次无关,也与如何处理无关。cmd.exe
在执行批处理文件之前已经启动。
为了了解所使用的命令和它们如何工作,请打开一个 命令提示符 窗口,在那里执行以下命令,并仔细阅读每个命令的所有帮助页面。
call /?
...还解释了 %~dp0
... 参数0的驱动器和路径,它是批处理文件的完整路径,总是以反斜杠结束。echo /?
exit /?
... 不再使用goto /?
pause /?
set /?
setlocal /?
start /?
...不再使用另请参见:
这里有一个替代方案,在调用子脚本的过程中,产生的变量名称将在主脚本中定义,而不是由子脚本本身定义。
foo.bat
:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define name of variable to receive result here:
call "%~dp0bar.bat" RESULT 2 3
rem // Return result:
echo Result: %RESULT%
endlocal
exit /B
bar.bat
:
@echo off
setlocal DisableDelayedExpansion
set "INT1=%~2"
set "INT2=%~3"
set /A "SUM=INT1+INT2"
rem // Assign variable that has been defined during the call:
endlocal & set "%~1=%SUM%"
exit /B