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 是继承的,因此 运行 lsexec >file 之后,ls 的输出将写入 `file.

在后一种情况下,shell 的 stdout 本身没有改变,只有子进程的 stdout 被重定向(由 shell,它的父进程)。

总而言之,我要问的是如何重定向cmd.exe本身的stdout,然后像往常一样以交互方式使用cmd.exe,除了cmd.exe不要写任何东西到控制台,所有输出写入文件。

因此,下面的方法不是我追求的

没有与 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

如果您还想从命令行重定向,有两种不同的可能性。

  1. 使用重定向启动 cmd。

cmd /k > file

  1. 扰乱文件句柄,通过重定向恢复失败。
    重定向有效,但以后无法恢复(只能通过退出 cmd 实例)。
    More fun with redirection and file handles
  2. 阅读更多内容

echo dummy >NUL 2> nul 3> file

第二个例子有效,因为当一次有多个重定向时,文件句柄的恢复会失败,因为cmd.exe恢复的顺序是错误的。