在bash
中,带有
exec >file
stdout的所有输出都将被重定向。
windowscmd.exe
中是否存在等价项?
===p.S.===
为什么需要它?
在我们的应用程序中,需要支持嵌入式shell(windows上的cmd.exe(,为了实现更好的文本搜索支持,我们决定将命令执行与输出显示解耦。
在bash下,我们使用了exec >file
来实现这一点,它可以无缝地工作。但我的cmd专业知识不足以在windows下找到等效的命令。
===编辑===
阐明exec >file
在bash 中的作用
在bash中的exec >file
之后,文件描述符1,即其stdout被重定向到file
。与CCD_ 7不同。
在前一种情况下,shell本身的stdout被重定向,在它内部运行的任何命令的stdout在技术上都没有被重定向,但由于它是shell的子进程,stdout被继承,因此在exec >file
之后运行ls
,ls
的输出将写入`file。
在后一种情况下,shell本身的stdout保持不变,只有子进程的stdout被重定向(由shell,其父进程(。
总之,我要问的是如何重定向cmd.exe
本身的stdout,然后像往常一样交互使用cmd.exe
,除了cmd.exe
不向控制台写入任何内容,所有输出都写入文件。
因此,以下方法不是我追求的
dir >file
wrap_several_command_to_batch_file >file
wrap_several_command_to_batch_file_and_redirect_inside_then_exit
没有与exec
命令等效的命令。
但可以通过重新启动自己的批处理文件来模拟它
这只适用于批处理文件本身中的所有命令,但在批处理结束时结束。
@echo off
REM *** Trampoline jump for function calls of the form ex. "C::function:..ownBatchFile.bat"
FOR /F "tokens=3 delims=:" %%L in ("%~0") DO goto :%%L
REM *** Emulated exec
REM *** Restart this batch file with the function name inside %0
REM *** Parameters are appended, but works only for simple parameters
call "%~d0:exec:..%~pnx0" %* > file
exit /b
:exec
echo This will be redirected
如果您也想从命令行重定向,有两种不同的可能性
- 使用重定向启动cmd
cmd /k >file
- 通过重定向还原失败扰乱文件句柄
重定向有效,但以后无法恢复(只能通过退出cmd实例(
阅读更多关于重定向和文件句柄的更多乐趣
echo dummy >NUL 2>nul 3>file
第二个例子是有效的,因为当一次有多个重定向时,文件句柄的还原会失败,因为cmd.exe以错误的顺序进行还原。