windows - 通过启动命令返回变量

标签 windows multithreading batch-file scope

我正在寻找一种从启动命令启动的批处理脚本中获取值返回值的方法。让我解释一下:

我需要通过从主批处理脚本同时启动多个子批处理脚本来利用多处理,然后在完成后检索每个子批处理文件的返回值。

我一直在调用命令中使用返回变量,dbenham 对此进行了很好的解释. 该解决方案不允许多线程,因为子批处理脚本一个接一个地运行。

使用启动命令允许运行多个批处理脚本,但值不会返回到我的主脚本,因为显然启动命令创建了一个全新的变量上下文。

是否有人有从子脚本返回值到主脚本的解决方案/解决方法?

下面是我需要的模型:

ma​​inScript.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/

相关文章:

java - System.out.println 与 java volatile

batch-file - 如何在 "setlocal ENABLEDELAYEDEXPANSION"之后继续 "endlocal"的效果?

windows - 创建可执行文件来运行快捷方式?类似于 .bat 文件,但是 .exe?

c++ - 编写新的 "malloc"和 "free"函数

ios - 如何在 Windows 上运行 Xcode 项目?

windows - 如何使用没有管理员权限的 vbs 将任务设置为在登录时以当前用户身份运行?

batch-file - 批处理cmd不接受重定向符号

.net - Windows 服务未启动 : "The service is not responding to the control function."

Objective-C 卡住 GUI 也带有队列

python - 读取一个文件并做一些事情,多线程