【发布时间】:2013-12-30 23:55:35
【问题描述】:
我有一个脚本 a.cmd,它调用另一个脚本 b.cmd,并重定向它的输出。被调用的脚本启动一个永不终止的可执行文件。可执行文件的输出被重定向到它自己的日志文件。简化代码:
a.cmd:
[1] @ECHO OFF
[2] SET LOG_FILE_NAME="log.txt"
[3] REM Start the b.cmd redirecting all output
[4] CALL b.cmd >> %LOG_FILE_NAME% 2>&1
[5] ECHO returned to a.cmd >> %LOG_FILE_NAME% 2>&1
[6] EXIT /B 0
b.cmd:
[1] @ECHO OFF
[2] SET ANOTHER_LOG_FILE_NAME="log2.txt"
[4] ECHO RunForEver.exe redirecting all output
[5] START CMD /C "RunForEver.exe >> %ANOTHER_LOG_FILE_NAME% 2>&1"
[6] ECHO b.cmd execution complete
[7] EXIT /B 0
(为方便起见,添加了行号)
我遇到的问题是 b.cmd 中的第 4 行似乎抓住了初始日志文件 (LOG_FILE_NAME) 的句柄,因为所有 b.cmd 输出都被重定向到它,并且在可执行文件时不会释放句柄(以及启动它的 cmd)正在运行。 我没有排除这种行为,因为我认为只有启动命令本身的输出将被重定向到 LOG_FILE_NAME 日志文件,而实际运行 RunForEver.exe 可执行文件的其他进程的输出将被写入 ANOTHER_LOG_FILE_NAME。 结果,a.cmd 中的第 5 行出错,拒绝访问 LOG_FILE_NAME。
有人可以解释发生了什么吗?有没有办法避免这种情况?
我尝试从 b.cmd 内部将输出重定向到 LOG_FILE_NAME,但随后在 b.cmd 的第 2 行出现访问被拒绝错误。
提前致谢!
【问题讨论】:
-
我发现的最佳解决方法是使用 powershell 代替 start 命令。见这里:stackoverflow.com/a/53321347/5932003
标签: cmd io-redirection