CMD 重定向:相当于 Bash 执行>文件



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之后运行lsls的输出将写入`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

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

  1. 使用重定向启动cmd

cmd /k >file

  1. 通过重定向还原失败扰乱文件句柄
    重定向有效,但以后无法恢复(只能通过退出cmd实例(
    阅读更多关于重定向和文件句柄的更多乐趣

echo dummy >NUL 2>nul 3>file

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

最新更新