拥有用于重定向其父进程的std输出的文件的子进程

时间:2014-03-27 13:39:21

标签: windows batch-file file-io command-line stdout

情景 我有一个批处理文件a.bat,下面包含语句

A.exe >> a.txt
Test.exe >> a.txt

A.exe启动另一个exe说b.exe(通过_wpopen函数)并返回。但是在重定向A.exe的输出后,a.txt的所有权似乎被转移到了b.exe。由于b.exe仍在运行且仍然拥有a.txt,因此test.exe无法将其stdout重定向到a.txt。

B.exe无限期运行,不能等待它停止。 而且我也无法将输出重定向到多个文件。由于这些exe执行是安装设置的一部分,因此日志记录应该是连续的,必须对单个文件进行

这种情况有没有可能的解决方案?我希望a.exe返回后文件a.text是免费的!

1 个答案:

答案 0 :(得分:0)

通过分别对每一行进行重定向,您需要命令处理器重新打开该文件。如果另一个进程仍然具有打开文件的原始句柄,就像在您的方案中那样,那将无法正常工作。

相反,为多个命令或整个批处理文件重定向输出一次。您可以使用call命令执行此操作:

call :main >> a.txt
goto :eof

:main
A.exe
Test.exe
goto :eof

您也可以使用括号:

(
A.exe
Test.exe
) > test.txt

或者,如果您只想要某些输出转到文件:

call :main 3>> a.txt
goto :eof

:main
A.exe >&3
Test.exe >&3
goto :eof

请记住,在B.exe退出之前,日志文件将保持打开状态,因此写入它的唯一方法是使用现有的句柄。 (这假设您不能修改A.exe;如果可以,那可能是更好的解决方案。)

也可以像这样完全避免这个问题:

A.exe > temp.txt
type temp.txt >> a.txt