如何将静态 运行 程序的输出写入 windows 10 批处理文件中的变量

How to write the output of a still running program into a variable in a windows 10 batch file

我已经看到很多使用 for 循环将程序的输出逐行写入变量的问题的答案。这几乎正​​是我所需要的,但据我所知,它依赖于程序终止,然后能够迭代已知数量的行。

我的情况是这样的:我有一个程序"example.exe",它不会自行终止,而是不断输出数据行。我将从带有几个参数的批处理脚本中 运行 这个程序,我希望这个程序的行以变量 "LINE" 结尾,这样每当该程序有新的输出时,我都希望"LINE" 更新和 运行 一些额外的代码行来处理新的设置变量。

在伪代码中:

Set LINE=*example.exe output*
echo %LINE%
... some more operations on LINE

如何在不必终止 "example.exe" 并且最好不必将所有内容通过管道传输到文件中然后从该文件中读回的情况下实现此目的?

如果您限制自己使用本机批处理命令,那么任何答案都需要使用 SET /P 读取输入,每行限制为 1021 字节。如果您的输出每行超过 1021 字节,那么这对于纯批处理是不可能的。

如果您的 exe 程序在末尾写入一些唯一的字符串表示它已完成,那么完成您的任务并不太难。

对于这个演示,我将用一个小的批处理脚本替换 exe 文件。批处理脚本(:sender 例程)将简单地回显您提供的任何输入,并在您输入 QUIT 时终止。

:receiver 例程将读取和处理行,直到它收到 QUIT。

我只是将 :sender 输出通过管道传递给 :receiver :-)

@echo off
setlocal enableDelayedExpansion
if "%~1" == ":sender" goto :sender
if "%~1" == ":receiver" goto :receiver
"%~f0" :sender | "%~f0" :receiver
exit /b

:sender
set "str="
set /p "str=>" >&2
echo(!str!
if !str! neq QUIT goto :sender
exit /b

:receiver
set "LINE="
set /p "LINE="
echo LINE=!LINE!
REM do whatever...
if !LINE! neq QUIT goto :receiver
exit /b

-- 样本 I/O --

>Hello world!
LINE=Hello world!
>    This is a test
LINE=    This is a test
>
LINE=
>Almost done
LINE=Almost done
>QUIT
LINE=QUIT

为了您的使用,您只需用您的 exe 文件替换管道中的 :sender

yourProgram.exe | "%~f0" :receiver

如果你的exe文件真的能运行"forever",那你就可以去掉QUIT逻辑了。但是我相信当你准备终止时你将不得不终止你的控制台 - Ctrl+C 将无法终止 :receiver。

如果你想在没有更多输入时自动检测并终止管道,而不依赖于唯一的终止字符串,事情会更复杂。该解决方案与 my implementation of a batch tee program 非常相似。我会留给你根据你的情况来调整 batchTee.bat :-)