cmd 重定向:相当于 bash exec >file
cmd redirection: equivalent of bash exec >file
在bash
,与
exec >file
stdout 的所有输出都将被重定向。
windowscmd.exe
中是否存在等价关系?
== P.S. ==
为什么需要它?
在我们的应用程序中,需要支持嵌入式 shell(cmd.exe on windows),为了获得更好的文本搜索支持,我们决定将命令执行与输出显示分离。
在 bash 下,我们使用 exec >file
来实现这一点,它可以无缝运行。但是我的 cmd 专业知识不足以在 windows.
下找到等效的命令
== 编辑 ==
阐明 exec >file
在 bash
中做了什么
在 bash 中的 exec >file
之后,文件描述符 1,即其标准输出被重定向到 file
。这不同于 mycommand >file
.
在前一种情况下,shell 的标准输出本身被重定向,其中任何命令 运行ning 的标准输出在技术上没有被重定向,但由于它是 shell 的子进程, stdout 是继承的,因此 运行 ls
在 exec >file
之后,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 实例)。
在 More fun with redirection and file handles 阅读更多内容
echo dummy >NUL 2> nul 3> file
第二个例子有效,因为当一次有多个重定向时,文件句柄的恢复会失败,因为cmd.exe恢复的顺序是错误的。
在bash
,与
exec >file
stdout 的所有输出都将被重定向。
windowscmd.exe
中是否存在等价关系?
== P.S. ==
为什么需要它?
在我们的应用程序中,需要支持嵌入式 shell(cmd.exe on windows),为了获得更好的文本搜索支持,我们决定将命令执行与输出显示分离。
在 bash 下,我们使用 exec >file
来实现这一点,它可以无缝运行。但是我的 cmd 专业知识不足以在 windows.
== 编辑 ==
阐明 exec >file
在 bash
在 bash 中的 exec >file
之后,文件描述符 1,即其标准输出被重定向到 file
。这不同于 mycommand >file
.
在前一种情况下,shell 的标准输出本身被重定向,其中任何命令 运行ning 的标准输出在技术上没有被重定向,但由于它是 shell 的子进程, stdout 是继承的,因此 运行 ls
在 exec >file
之后,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 实例)。
在 More fun with redirection and file handles 阅读更多内容
echo dummy >NUL 2> nul 3> file
第二个例子有效,因为当一次有多个重定向时,文件句柄的恢复会失败,因为cmd.exe恢复的顺序是错误的。