Как напечатать вывод, когда исполняемый файл запущен в цикле Windows для цикла? - PullRequest
2 голосов
/ 17 октября 2019

Я использую цикл for для выполнения другого исполняемого файла и захвата вывода. Вывод представляет собой набор переменных, таких как

Name=Jim
Address=1234 Main Ave
Phone=425-555-0202

Однако для запуска этого исполняемого файла требуется много времени. Я фиксирую выходные данные и устанавливаю переменные среды с помощью:

for /f "tokens=*" %%a in ('fetch.exe <options>') do (
    echo "%%a"
    set "%%a"
)

Это работает нормально, однако, если fetch.exe занимает 120 секунд, эхо-часть этого цикла не запускается до тех пор, пока процесс не завершится. завершено через 120 секунд. Простым тестом является создание командного файла, такого как

@echo 1
@echo 2
@echo 3
@echo 4
timeout /t 30

. Затем вызовите его из командной строки через for /f "tokens=*" %a in ('call test.cmd') do (@echo "%a")

. В течение 30 секунд вы не увидите никакого вывода.

Как я могу немедленно начать видеть результат выполнения команды?

1 Ответ

1 голос
/ 18 октября 2019

Как уже было сказано, FOR /F не может справиться с этим, поскольку ожидает завершения вызванной команды.

Но вы можете заставить его работать с асинхронным шаблоном.
Производитель работает в своем собственном потоке.

@echo off
REM *** Trampoline jump for function calls of the form ex. "C:\:function:\..\MyBatchFile.bat"
FOR /F "tokens=3 delims=:" %%L in ("%~0") DO goto :%%L

break > async.tmp
start "" /b "cmd /c "%~d0\:producer:\..\%~pnx0"
call :consumer
exit /b

:producer
(
  call slowOutput.bat 
  (echo ende)
) > async.tmp
exit /b

:consumer
echo c
setlocal EnableDelayedExpansion
< async.tmp call :_consumer
exit /b

:_consumer
set "line="
set /p line=

if not defined line goto :_consumer
if "!line!" EQU "ende" exit /b

echo(!line!
goto :_consumer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...