首页 > 解决方案 > cmd 重定向:相当于 bash exec >file

问题描述

bash,与

exec >file

标准输出的所有输出都将被重定向。

windows中是否有等价物cmd.exe

== PS ==

为什么需要它?

在我们需要支持嵌入式 shell(Windows 上的 cmd.exe)的应用程序中,为了获得更好的文本搜索支持,我们决定将命令执行与输出显示分离。

在 bash 下,我们已经习惯exec >file了实现这一点,它可以无缝地工作。但是我的 cmd 专业知识不足以在 windows 下找到等效的命令。

==编辑==

澄清exec >file在 bash 中做什么

在 bash之后exec >file,文件描述符 1,即它的标准输出被重定向到file. 这与 不同mycommand >file

在前一种情况下,shell本身的stdout被重定向,在其中运行的任何命令的stdout在技术上都没有被重定向,但由于它是shell的子进程,stdout被继承,因此在运行ls之后exec >filels输出将写入`file.

在后一种情况下,shell 本身的标准输出没有变化,只有子进程的标准输出被重定向(通过 shell,它的父进程)。

总之,我要问的是如何重定向cmd.exe自己的标准输出,然后cmd.exe像往常一样交互使用,除了cmd.exe不向控制台写入任何内容,所有输出都写入文件。

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

标签: cmdio-redirection

解决方案


没有等效的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 实例)。
    阅读更多关于重定向和文件句柄的更多乐趣

echo dummy >NUL 2> nul 3> file

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


推荐阅读