我如何通过另一个正在运行的批处理程序传递参数?

问题描述 投票:0回答:1

例子。

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循环中检查这个文件是否存在,以及它包含的内容。但这在我看来太复杂了,先谢谢了。

batch-file parameter-passing
1个回答
0
投票

批量文件 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 /? ...不再使用

另请参见:


0
投票

这里有一个替代方案,在调用子脚本的过程中,产生的变量名称将在主脚本中定义,而不是由子脚本本身定义。

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
© www.soinside.com 2019 - 2024. All rights reserved.