Batch file 仅当有输出时重定向DOS输出

Batch file 仅当有输出时重定向DOS输出,batch-file,dos,Batch File,Dos,我在Windows计算机上运行的批处理文件(.bat)中有一系列行,例如: start /b prog.exe cmdparam1 cmdparam2 > test1.txt start /b prog.exe cmdparam1 cmdparam2 > test2.txt 有时proj.exe不返回任何内容(空),而返回有用的数据。在这些情况下,我不想生成文本文件,这在批处理文件方面容易实现吗?当前的行为是始终创建一个文本文件,在输出为空的情况下,它只是一个空白文件。just。编

我在Windows计算机上运行的批处理文件(.bat)中有一系列行,例如:

start /b prog.exe cmdparam1 cmdparam2 > test1.txt
start /b prog.exe cmdparam1 cmdparam2 > test2.txt
有时proj.exe不返回任何内容(空),而返回有用的数据。在这些情况下,我不想生成文本文件,这在批处理文件方面容易实现吗?当前的行为是始终创建一个文本文件,在输出为空的情况下,它只是一个空白文件。

just。编辑:为了适应在等待
prog.exe
终止之前没有/WAIT标志返回的
start
,您可以为
prog.exe
创建以下包装脚本
progwrapper.bat

prog.exe "%1" "%2" > "%3"
if %~z3==0 del "%3"
然后从主脚本调用包装器:

start /b progwrapper.bat cmdparam1 cmdparam2 > test1.txt
start /b progwrapper.bat cmdparam1 cmdparam2 > test2.txt
等等


如果prog.exe是GUI应用程序,那么在progwrapper.bat中应该有一个
start/B/WAIT prog.exe

jpe解决方案要求父批在检查输出文件大小之前知道启动的进程何时完成。您可以使用START/WAIT选项,但这样就失去了并行运行的优势

如果另一个进程已将输出重定向到同一个文件,则重定向到该文件的操作将失败,这一点可以利用。当您的父批能够成功重定向到它们时,您就知道启动的流程已经全部完成

您可能应该将stderr重定向到输出文件以及stdout

@echo off

::start the processes and redirect the output to the ouptut files
start /b "" cmd /c prog.exe cmdparam1 cmdparam2 >test1.txt 2>&1
start /b "" cmd /c prog.exe cmdparam1 cmdparam2 >test2.txt 2>&1

::define the output files (must match the redirections above)
set files="test1.txt" "test2.txt"

:waitUntilFinished 
:: Verify that this parent script can redirect an unused file handle to the
:: output file (append mode). Loop back if the test fails for any output file.
:: Use ping to introduce a delay so that the CPU is not inundated.
>nul 2>nul ping -n 2 ::1
for %%F in (%files%) do (
  9>>%%F (
    rem
  )
) 2>nul || goto :waitUntilFinished

::Delete 0 length output files
for %%F in (%files%) do if %%~zF==0 del %%F

只需[删除所有长度为零的文件][1]。您可以将这些命令与“开始”命令交错。例如:[1]:@jpe——如果您想完全在DOS中处理它,这似乎是唯一可能的答案。您应该将其作为答案发布,以便将其标记为“正确”。堆栈溢出将我的答案更改为注释,因为它太短。所以我详细阐述了一下:)为了澄清,通常我会对
prog.exe
进行更改,但我没有编写它,也无法访问它的源代码。所以我只有一些DOS命令可用。这样做有效,唯一的问题是我必须在我的
start
s上添加
/wait
标志,否则我会在生成它们之前尝试删除。@user17753-是的,您的父批必须知道何时检查文件大小。我正在研究一个答案,它将允许多个程序并行运行,并且在所有程序都完成之前不会检查大小。
stdin
0
stdout
1
stderr
2
。出于好奇,
9>%%F的
9
部分是什么(
do?这是CMD.EXE可用的编号最高的未使用文件句柄。该文件已创建,发送到该文件句柄的任何输出都将在该文件中结束,但在正常情况下,当然不会有任何输出。它应该与任何文件句柄1-9一起工作,但我只是很小心。