仅在有输出时才重定向DOS输出

时间:2012-08-14 19:43:49

标签: batch-file dos

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

start /b prog.exe cmdparam1 cmdparam2 > test1.txt
start /b prog.exe cmdparam1 cmdparam2 > test2.txt

有时proj.exe不返回任何内容(空)而不返回有用数据。在那些情况下,我想不生成文本文件,这在批处理文件方面是否容易实现?目前的行为是始终创建文本文件,在空输出的情况下,它只是一个空白文件。

2 个答案:

答案 0 :(得分:4)

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 :(得分:2)

只是delete all files with zero length。编辑:为了适应没有/ WAIT标志的start在等待prog.exe终止之前返回的事实,您可以为progwrapper.bat创建以下包装脚本prog.exe:< / p>

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