【问题标题】:cmd redirection: equivalent of bash exec >filecmd 重定向:相当于 bash exec >file
【发布时间】:2020-02-23 13:36:59
【问题描述】:

bash,与

exec >file

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

windowscmd.exe中是否有等价物?

== 附言 ==

为什么需要它?

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

在 bash 下,我们使用 exec >file 来实现这一点,它可以无缝运行。但是我的cmd专业知识不足以在windows下找到等效的命令。

== 编辑 ==

澄清 exec >file 在 bash 中的作用

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

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

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

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

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

  • dir >file
  • wrap_several_command_to_batch_file >file
  • wrap_several_command_to_batch_file_and_redirect_inside_then_exit

【问题讨论】:

    标签: cmd io-redirection


    【解决方案1】:

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

    echo dummy >NUL 2> nul 3> file

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

    【讨论】:

    • exec >file 'exec' 不是内部或外部命令、可运行程序或批处理文件。 (版本信息:Microsoft Windows [版本 10.0.18362.657] (c) 2019 Microsoft Corporation。保留所有权利。)
    • @qeatzy 抱歉,我完全错了,我没有识别出exec 命令。但我的下一次尝试应该有效
    • 首先,感谢您的帮助。一个问题,怎么用?我尝试将所有内容复制到.\xx.bat,然后将xx.bat 复制到cmd.exe,但没有任何改变。其次,请同时查看修改,并确保我们的方向一致。
    • 1 我将您答案中的代码(从@echo 到最后)复制到一个批处理文件中。并在 cmd.exe 中执行该批处理文件,并期望 cmd.exe 的标准输出被重定向到 file。 2 以我有限的cmd.exe 专业知识,我发现它在 bash 中没有达到与exec >file 相当的效果。 3 你读过我最新的编辑吗,为了清楚起见,通过解释exec >file 在 bash 中做什么来解释我需要什么。
    • 另外,您能否详细说明一下echo dummy >NUL 2> nul 3> file,或者提供一些链接来解释它是如何工作的?这样我可以在需要时重定向标准输入或标准错误。
    猜你喜欢
    • 2019-05-12
    • 2023-02-02
    • 2015-08-11
    • 2016-10-02
    • 2017-06-30
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多