我在 Windows 机器上运行的批处理文件 (.bat) 中有一系列行,例如:
start /b prog.exe cmdparam1 cmdparam2 > test1.txt
start /b prog.exe cmdparam1 cmdparam2 > test2.txt
有时 proj.exe 不返回任何内容(空)而不是有用的数据。在那些情况下,我不想生成文本文件,这在批处理文件方面很容易做到吗?当前的行为是始终创建一个文本文件,在空输出的情况下它只是一个空白文件。
我在 Windows 机器上运行的批处理文件 (.bat) 中有一系列行,例如:
start /b prog.exe cmdparam1 cmdparam2 > test1.txt
start /b prog.exe cmdparam1 cmdparam2 > test2.txt
有时 proj.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
只需删除所有长度为零的文件。start
编辑:为了适应在等待终止之前没有 /WAIT 标志返回的事实,您可以为您prog.exe
创建以下包装脚本:progwrapper.bat
prog.exe
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 应用程序,那么您应该start /B /WAIT prog.exe
在 progwrapper.bat 中有一个。