2012-08-14 18 views
5

我有一系列的批处理文件(.bat)线的Windows机器上运行,如:重定向DOS输出是否有输出

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

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

+2

刚刚[删除所有文件与零长度] [1]。您可以将这些命令与“开始”命令交错。即如: [1]:http://stackoverflow.com/questions/4176962/recursively-delete-0kb-files-using-windows-cmd – jpe 2012-08-14 19:48:06

+0

@jpe - 这似乎是唯一可能的答案,如果你想完全在DOS下处理它。您应该将其作为答案发布,以便将其标记为“正确”。 – 2012-08-14 19:52:06

+0

Stack Overflow将我的答案改为评论,因为它太短。所以我阐述了一下:) – jpe 2012-08-14 19:57:17

回答

4

jpe解决方案要求您的父批处理知道何时启动的进程已完成,然后才能检查输出文件大小。您可以使用START/WAIT选项,但是会失去并行运行的优势。

如果另一个进程已将输出重定向到同一文件,则可以使用重定向到文件的事实。当您的父批可以重定向到他们成功,那么你知道已启动的进程已完成。

你或许应该stderr重定向到输出文件以及标准输出

@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 
+0

'stdin'为'0','stdout'为'1','stderr'为'2'。出于好奇,'9 >> %% F的'9'部分是什么('do? – 2012-08-16 17:38:21

+0

它是CMD.EXE可用的编号最高的未使用文件句柄。该文件已创建,并且发送到那个文件句柄将会在文件中结束,但是在正常情况下当然不会有任何东西会到那里去,它应该和1-9中的任何一个文件句柄一起工作,但我只是谨小慎微。 – dbenham 2012-08-16 18:04:04

2

只需delete all files with zero length。编辑:以适应事实start,而不用等待prog.exe前/等待标志返回到结束,你可以为你的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

+1

这是有效的,唯一的问题是我必须在我的'start's中加入'/ wait'标志,否则我会在生成之前尝试删除它。 – user17753 2012-08-14 20:07:08

+0

@ user17753 - 是的,您的父批必须知道何时检查文件大小。我正在做一个答案,允许多个程序并行运行,而不是检查大小,直到所有程序都完成。 – dbenham 2012-08-14 20:18:01