我正在寻找一种从启动命令启动的批处理脚本中获取值返回值的方法。让我解释一下:
我需要通过从主批处理脚本同时启动多个子批处理脚本来利用多处理,然后在完成后检索每个子批处理文件的返回值。
我一直在调用命令中使用返回变量,dbenham 对此进行了很好的解释. 该解决方案不允许多线程,因为子批处理脚本一个接一个地运行。
使用启动命令允许运行多个批处理脚本,但值不会返回到我的主脚本,因为显然启动命令创建了一个全新的变量上下文。
是否有人有从子脚本返回值到主脚本的解决方案/解决方法?
下面是我需要的模型:
mainScript.bat
@echo off
setlocal
set "retval1=0"
set "retval2=0"
REM run two scripts in parallel:
start "" subscript1.bat arg1 retval1
start "" subscript2.bat arg1 retval2
REM wait for returned value
:waiting
call :sleep 1
set /a "DONE=1"
if %retval1% equ 0 set "DONE=0"
if %retval2% equ 0 set "DONE=0"
if %DONE% equ 0 goto :waiting
echo returned values are %retval1% %retval2%
exit /b
subscript1.bat
@echo off
setlocal
set "arg1=%~1"
set "retval1=%~1"
REM do some stuff...
REM return value
(endlocal
set "%retval1%=%foo%"
)
exit /b
最佳答案
除了将返回值写入文件之外,看不到任何替代方法,所以
主要
@ECHO OFF
SETLOCAL
for %%a in (1 2) do (
del "%temp%\retval%%a" 2>nul
)
start /min "" q225220791.bat arg1 retval1
choice /t 1 /d y >nul
start /min "" q225220791.bat arg1 retval2
:waiting
choice /t 1 /d y >nul
ECHO wait...%retval1%...%retval2%
if not exist "%temp%\retval1" goto waiting
if not exist "%temp%\retval2" goto waiting
for %%a in (1 2) do (
for /f "usebackqdelims=" %%i in ("%temp%\retval%%a") do set "retval%%a=%%i"
)
for %%a in (1 2) do (
del "%temp%\retval%%a" 2>nul
)
echo returned values are %retval1% %retval2%
GOTO :EOF
q225220791.bat
@ECHO OFF
SETLOCAL
:: wait a random time 2..10 sec.
SET /a timeout=%RANDOM% %% 8 + 2
choice /t %timeout% /d y >nul
:: return a random result 12..20
SET /a foo=%RANDOM% %% 8 + 12
>"%temp%\%2" echo %foo%
ENDLOCAL
exit
依靠第二个参数的值给子进程设置临时文件名。我已经更改了批处理的名称以适合我的系统。
关于windows - 通过启动命令返回变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22522079/