显示 Windows 命令提示符输出并将其重定向到文件

Posted

技术标签:

【中文标题】显示 Windows 命令提示符输出并将其重定向到文件【英文标题】:Displaying Windows command prompt output and redirecting it to a file 【发布时间】:2010-10-22 05:47:15 【问题描述】:

如何在 Windows 命令提示符下运行命令行应用程序并同时显示输出并重定向到文件?

例如,如果我要运行命令 dir > test.txt,这会将输出重定向到名为 test.txt 的文件,而不显示结果。

我如何编写一个命令来显示输出将输出重定向到 Windows 命令提示符中的文件,类似于 Unix 上的 tee 命令?

【问题讨论】:

请不要再叫它MSDOS了! cmd.exe 和那个braindead command.com 之间的相似之处微乎其微,而且越来越小。 How do I echo and send console output to a file in a bat script?的可能重复 如果一个控制台应用程序加载一个输出文本的 dll,这些都不起作用。主应用程序文本被重定向到一个文件,但来自 dll 的输出不会并继续显示在控制台窗口中。我发现没有办法从 dll 中捕获文本。 仍然可以通过管道进入文件并在该文件上使用 tail (***.com/questions/187587/…) 如果我使用命令行实用程序并希望将输出重定向到与屏幕上显示的格式完全相同的文件我使用 youtube-dl 提取链接并可以将输出重定向到txt 文件,但它没有像您在提示中看到的那样格式化,在文件中它以单行形式出现。 【参考方案1】:

要扩展 davor's answer,您可以像这样使用 PowerShell:

powershell "dir | tee test.txt"

如果你想重定向当前目录下某个exe的输出,你需要在文件名上使用.\,例如:

powershell ".\something.exe | tee test.txt"

【讨论】:

这是最接近的答案:它适用于默认安装,因为 PS 已经存在于大多数机器上,尤其是服务器上。 LIKE IT :) 无论如何 powershell "ping -n 10 localhost | tee test.txt" 会更好地展示 tee 派对上发生的事情 请注意,powershell 中的dirGet-ChildItem 的别名,这与cmd 的内部dir 命令不同。如果你想要cmd内部版本,你需要powershell "cmd /c dir | tee test.txt" 要查看所有输出,不要忘记使用2>&1 将STDERR 重定向到STDOUT,例如node 2>&1 | tee debug_log.txt 考虑添加'-Append',这样日志文件就不会在每个命令开始时被截断。例如powershell "node server.js 2>&1 | tee -Append app.log"【参考方案2】:

我能够找到将输出重定向到文件然后到控制台的解决方案/解决方法:

dir > a.txt | type a.txt

其中dir是需要重定向输出的命令,a.txt是存储输出的文件。

【讨论】:

这满足了答案,但是在dir命令完成后输出数据,而不是在数据产生时输出。 它会工作,但如果命令等待来自标准输入的输入,你会卡住。 我喜欢这个简单的答案!我发现某些命令的输出需要& 而不是|,例如ping7z.exe @lii re: handle output to stderr - 添加 2>&1 重定向,如下所示:dir 2>&1 > a.txt & type a.txt 并且您应该将 stderr 与 stdout 混合。跨度> @LHC -- 只能使用像tee 这样的实用程序。有各种软件包可以获取在 Windows 上运行的类 unlx(或类 linux)实用程序。没有原生的 Windows 方式。【参考方案3】:

Unix 的tee 命令有一个Win32 端口,可以做到这一点。见http://unxutils.sourceforge.net/或http://getgnuwin32.sourceforge.net/

【讨论】:

该链接指向 Unix 命令 tee 的 Windows 实现,因此它可以在 Windows 上运行。 是的,对答案和评论进行投票。我实际上更喜欢 CygWin,因为它拥有一切,但有些人更喜欢他们可以选择的非 DLL 工具。 GnuWin32 项目还移植了许多 Unix 实用程序,请参阅 gnuwin32.sourceforge.net。 UnxUtils 最后一次更新是在 2003 年; GnuWin32 更新了一点。 如果你和我一样,很难找到 GnuWin32 的 tee 包,你可以在 gnuwin32.sourceforge.net/packages/coreutils.htm 中找到它。【参考方案4】:

看看这个:wintee

不需要cygwin。

我确实遇到并报告了一些问题。

您也可以检查unxutils,因为它包含 tee(并且不需要 cygwin),但请注意此处的输出 EOL 类似于 UNIX。

最后但同样重要的是,如果你有 PowerShell,你可以试试 Tee-Object。在 PowerShell 控制台中输入 get-help tee-object 以获取更多信息。

【讨论】:

为什么投反对票?这里 95% 的回复有一个共同点:只有在初始命令完成后才会重定向输出:读取 cmets。 UNIX 实用程序tee 实时输出。 wtee 具有相同的功能。如果你不介意这些错误,它会做得很好。 这是唯一对我有用的解决方案,没有 Powershell > 4.0。竖起大拇指! 这应该是公认的答案。 wtee 至少在 Win 2003 Srv 上工作,启动速度比 powersell 快得多,并且可以轻松集成到构建过程中。【参考方案5】:

@tori3852

我发现了

dir > a.txt | type a.txt

没有工作(仅目录列表的前几行 - 怀疑某种进程分叉,第二部分,'type' 命令在可怕的列表完成之前终止?), 所以我改为使用:

dir > z.txt && type z.txt

which did - 顺序命令,一个在第二个开始之前完成。

【讨论】:

如果您想确保即使dir 命令失败也能执行type 命令,您应该使用& 而不是&&。当您的命令中存在某种形式的错误并且您仍希望在控制台上查看日志文件时,这很有用。见Microsoft's article on this。但是,这会导致 %errorlevel% 被设置为 type 的错误级别(即 0)。【参考方案6】:

不幸的是,没有这样的事情。

Windows 控制台应用程序只有一个输出句柄。 (好吧,有两个STDOUTSTDERR,但在这里没关系)> 将通常写入控制台句柄的输出重定向到文件句柄。

如果您想进行某种多路复用,您必须使用可以将输出转移到的外部应用程序。然后,此应用程序可以写入文件并再次写入控制台。

【讨论】:

tee on *nix 也是一个单独的应用程序,不是 shell 上的一些重定向【参考方案7】:

一个简单的 C# 控制台应用程序就可以解决问题:

using System;
using System.Collections.Generic;
using System.IO;

namespace CopyToFiles

    class Program
    
        static void Main(string[] args)
        
            var buffer = new char[100];
            var outputs = new List<TextWriter>();

            foreach (var file in args)
                outputs.Add(new StreamWriter(file));

            outputs.Add(Console.Out);

            int bytesRead;
            do
            
                bytesRead = Console.In.ReadBlock(buffer, 0, buffer.Length);
                outputs.ForEach(o => o.Write(buffer, 0, bytesRead));
             while (bytesRead == buffer.Length);

            outputs.ForEach(o => o.Close());
        
    

要使用它,您只需将源命令通过管道传输到程序中,并提供您想要将输出复制到的任何文件的路径。例如:

dir | CopyToFiles files1.txt files2.txt 

将显示 dir 的结果并将结果存储在 files1.txt 和 files2.txt 中。

请注意,上面的错误处理方式并没有太多(任何东西!),实际上可能不需要支持多个文件。

【讨论】:

嗯,免费下载 tee/cygwin 还是用我辛苦赚来的钱购买 MSVS 来购买这样一个微不足道的小程序?这是一个艰难的:-) 你不需要 Visual Studio 来编译它,命令行工具实际上是免费的。只需谷歌“.net sdk 下载”链接(直接链接似乎会改变,但谷歌似乎总是有效)。 Visual Studio Express 也是免费的,但我仍然会使用 tee。 cygwin 安装起来很麻烦。投票给你,因为这是我一直在寻找的。​​span> 我认为这不会同时输出到控制台和文件吗?【参考方案8】:

这行得通,虽然有点丑:

dir >_ && type _ && type _ > a.txt

它比其他一些解决方案更灵活一点,因为它可以逐语句工作,因此您也可以使用它来追加。我在批处理文件中经常使用它来记录和显示消息:

ECHO Print line to screen and log to file.  >_ && type _ && type _ >> logfile.txt

是的,您可以重复 ECHO 语句(一次用于屏幕,第二次重定向到日志文件),但这看起来同样糟糕,并且有点维护问题。至少这样您不必在两个地方更改消息。

请注意,_ 只是一个短文件名,因此您需要确保在批处理文件末尾删除它(如果您使用的是批处理文件)。

【讨论】:

这仅在您想在进程运行后显示内容时才有用。这不是一个很难解决的问题。 是的,我想这解决了与原始发帖人所要求的略有不同的问题。 +1 我一直都是这样做的。我相信这是对原始问题的正确答案,应该这样标记。正如@MTS 所暗示的那样,诀窍是您实际上写入了两个文件:每个命令/行创建一个文件(因此每次都会覆盖一个“>”),然后将该行键入屏幕(键入 ),最后,再次键入它并使用“>>”将它的输出重定向到你的日志文件,所有长的 APPENDING。这就是我多年来一直这样做的方式,尽管我喜欢简单的“”临时文件。我一直在做“tmp.txt”之类的。是的,之后删除它。 这是一个很好的方法,但我遇到了一些错误没有被捕获的问题。将type 命令放在单独的行(在子例程中)解决了这个问题。 正是我的应用程序所需要的。【参考方案9】:

mtee 是一个非常适合此目的的小型实用程序。它是免费的,源代码是开放的,而且可以正常工作。

你可以在http://www.commandline.co.uk找到它。

在批处理文件中用于显示输出并同时创建日志文件,语法如下:

    someprocess | mtee /+ mylogfile.txt

其中 /+ 表示追加输出。

当然,这假设您已将 mtee 复制到 PATH 中的文件夹中。

【讨论】:

这似乎要等到输出完成后再输出到文件或控制台。【参考方案10】:

我想稍微扩展一下 Saxon Druce 的 excellent answer。

如上所述,您可以像这样重定向当前目录中可执行文件的输出:

powershell ".\something.exe | tee test.txt"

但是,这只会记录 stdouttest.txt。它也不会记录stderr

显而易见的解决方案是使用这样的东西:

powershell ".\something.exe 2>&1 | tee test.txt"

但是,这不适用于所有 something.exes。一些something.exes 会将2&gt;&amp;1 解释为参数并失败。正确的解决方案是只在 something.exe 及其开关和参数周围加上撇号,如下所示:

powershell ".\something.exe --switch1 --switch2 … arg1 arg2 …" 2^>^&1 ^| tee test.txt

但请注意,在这种情况下,您必须转义特殊的 cmd-shell 字符 ">&|"每个都有一个“^”,所以它们只能被 powershell 解释。

【讨论】:

我在 Windows 10 上构建 pyqt5.7 时尝试过这个,它很慢,控制台输出不是实时的,也许是缓冲的?日志文件看起来是正确的 所有这些都是完全错误的。它对我根本不起作用。出于显而易见的原因,最后一个命令给出了'tee' is not recognized as an internal or external command。在 cmd 行中使用 2&gt;&amp;1 时,任何到 stderr 的输出都会导致 powershell 出错。 可能是对 PowerShell Tee-Object cmdlet 的引用 - technet.microsoft.com/en-us/library/ee177014.aspx 见***.com/questions/52970939/… 所以它不全是红色的 @PavelP 我猜,您的问题与最后一个示例有关!?该命令缺少对暴露给 cmd 的特殊字符进行必要的转义。它现在已经过编辑,应该可以这样工作!【参考方案11】:

我同意 Brian Rasmussen 的观点,unxutils 移植是最简单的方法。在他的Scripting Pages 的Batch Files 部分中,Rob van der Woude 提供了大量有关使用 MS-DOS 和 CMD 命令的信息。我认为他可能对您的问题有一个本机解决方案,在那里挖掘之后我发现了TEE.BAT,这似乎就是 tee 的 MS-DOS 批处理语言实现。这是一个看起来很复杂的批处理文件,我仍然倾向于使用 unxutils 端口。

【讨论】:

那个 tee.bat 看起来不错。希望OP检查一下。 注意,使用TEE.BAT会在命令完成后输出,就像附近贴的“dir > a.txt | type a.txt”示例。【参考方案12】:

如果你的 windows 环境路径中有 cygwin,你可以使用:

 dir > a.txt | tail -f a.txt

【讨论】:

如果你要使用 Cygwin,它带有 tee。 Cygwin tee 似乎不像在 bash 中那样在 dos 提示符下工作。这是一个很好的解决方法。谢谢!【参考方案13】:

dir 1&gt;a.txt 2&gt;&amp;1 | type a.txt

这将有助于重定向 STDOUT 和 STDERR

【讨论】:

这不起作用。我尝试使用它来启动 JBoss run.bat,它在启动过程中阻塞并且服务器冻结。这个方法有问题... @raja ashok,对我不起作用。我试过 python.exe 1>file.txt 2>&1 |输入文件.txt【参考方案14】:

我知道这是一个非常古老的话题,但在以前的答案中,并没有完整实现以批处理方式编写的实时 Tee。我下面的解决方案是一个 Batch-JScript 混合脚本,它使用 JScript 部分只是为了从管道命令中获取输出,但是数据的处理是在 Batch 部分中完成的。这种方法的优点是任何 Batch 程序员都可以修改该程序以满足特定需求。本程序也能正确处理其他Batch文件产生的CLS命令输出,即检测到CLS命令输出时清屏。

@if (@CodeSection == @Batch) @then


@echo off
setlocal EnableDelayedExpansion

rem APATee.bat: Asynchronous (real time) Tee program, Batch-JScript hybrid version
rem Antonio Perez Ayala

rem The advantage of this program is that the data management is written in Batch code,
rem so any Batch programmer may modify it to fit their own needs.
rem As an example of this feature, CLS command is correctly managed

if "%~1" equ "" (
   echo Duplicate the Stdout output of a command in the screen and a disk file
   echo/
   echo anyCommand ^| APATee teeFile.txt [/A]
   echo/
   echo If /A switch is given, anyCommand output is *appended* to teeFile.txt
   goto :EOF
)

if "%2" equ ":TeeProcess" goto TeeProcess

rem Get the output of CLS command
for /F %%a in ('cls') do set "cls=%%a"

rem If /A switch is not provided, delete the file that receives Tee output
if /I "%~2" neq "/A" if exist %1 del %1

rem Create the semaphore-signal file and start the asynchronous Tee process
echo X > Flag.out
if exist Flag.in del Flag.in
Cscript //nologo //E:JScript "%~F0" | "%~F0" %1 :TeeProcess
del Flag.out
goto :EOF

:TeeProcess
   rem Wait for "Data Available" signal
   if not exist Flag.in goto TeeProcess
   rem Read the line sent by JScript section
   set line=
   set /P line=
   rem Set "Data Read" acknowledgement
   ren Flag.in Flag.out
   rem Check for the standard "End Of piped File" mark
   if "!line!" equ ":_EOF_:" exit /B
   rem Correctly manage CLS command
   if "!line:~0,1!" equ "!cls!" (
      cls
      set "line=!line:~1!"
   )
   rem Duplicate the line in Stdout and the Tee output file
   echo(!line!
   echo(!line!>> %1
goto TeeProcess


@end


// JScript section

var fso = new ActiveXObject("Scripting.FileSystemObject");
// Process all lines of Stdin
while ( ! WScript.Stdin.AtEndOfStream ) 
   // Read the next line from Stdin
   var line = WScript.Stdin.ReadLine();
   // Wait for "Data Read" acknowledgement
   while ( ! fso.FileExists("Flag.out") ) 
      WScript.Sleep(10);
   
   // Send the line to Batch section
   WScript.Stdout.WriteLine(line);
   // Set "Data Available" signal
   fso.MoveFile("Flag.out", "Flag.in");

// Wait for last "Data Read" acknowledgement
while ( ! fso.FileExists("Flag.out") ) 
      WScript.Sleep(10);

// Send the standard "End Of piped File" mark
WScript.Stdout.WriteLine(":_EOF_:");
fso.MoveFile("Flag.out", "Flag.in");

【讨论】:

有什么方法可以捕获标准错误输出?我有一个烦人的 exe,它输出标准错误流上的所有内容(即,为了正常输出到文件,你会这样做 file.exe 2&gt;output.txt 我想通了。您可以使用file.exe 2&gt;&amp;1|tee.bat 来执行此操作,如下所示:superuser.com/questions/452763/…【参考方案15】:

我也在寻找相同的解决方案,经过一番尝试,我成功地在命令提示符中实现了这一点。这是我的解决方案:

@Echo off
for /f "Delims=" %%a IN (xyz.bat) do (
%%a > _ && type _ && type _ >> log.txt
)
@Echo on

它甚至还可以捕获任何 PAUSE 命令。

【讨论】:

【参考方案16】:

这是我根据其他答案之一使用的示例

@echo off
REM SOME CODE
set __ERROR_LOG=c:\errors.txt
REM set __IPADDRESS=x.x.x.x

REM Test a variable
if not defined __IPADDRESS (
     REM Call function with some data and terminate
     call :TEE %DATE%,%TIME%,IP ADDRESS IS NOT DEFINED
     goto :EOF
)

REM If test happens to be successful, TEE out a message and end script.
call :TEE Script Ended Successful
goto :EOF


REM THE TEE FUNCTION
:TEE
for /f "tokens=*" %%Z in ("%*") do (
     >  CON ECHO.%%Z
     >> "%__ERROR_LOG%" ECHO.%%Z
     goto :EOF
)

【讨论】:

【参考方案17】:

这样的东西应该可以满足您的需要吗?

%DATE%_%TIME% > c:\a.txt & type c:\a.txt
ipconfig >> c:\a.txt & type c:\a.txt
ping localhost >> c:\a.txt & type c:\a.txt
pause

【讨论】:

差不多,但不会同时显示——如果你有一个长时间运行的任务,你会很长时间没有结果。【参考方案18】:

将输出发送到控制台,附加到控制台日志,从当前命令中删除输出

dir  >> usb-create.1 && type usb-create.1 >> usb-create.log | type usb-create.1 && del usb-create.1

【讨论】:

想解释一下这里发生了什么?【参考方案19】:

这是 MTS 之前的 answer 的变体,但它添加了一些可能对其他人有用的功能。这是我使用的方法:

命令被设置为变量,以后可以在整个代码中使用,以输出到命令窗口并附加到日志文件,使用set _Temp_Msg_Cmd= 该命令已使用胡萝卜^ 字符转义redirection,因此最初不会评估这些命令 会创建一个临时文件,其文件名类似于正在运行的批处理文件%~n0_temp.txt,它使用command line parameter extension syntax %~n0 来获取批处理文件的名称。 输出附加到单独的日志文件%~n0_log.txt

命令顺序如下:

    输出和错误信息被发送到临时文件^&gt; %~n0_temp.txt 2^&gt;^&amp;1 临时文件的内容是: 附加到日志文件^&amp; type %~n0_temp.txt ^&gt;^&gt; %~n0_log.txt 输出到命令窗口^&amp; type %~n0_temp.txt 带有消息的临时文件被删除^&amp; del /Q /F %~n0_temp.txt

示例如下:

set _Temp_Msg_Cmd= ^&gt; %~n0_temp.txt 2^&gt;^&amp;1 ^&amp; type %~n0_temp.txt ^&gt;^&gt; %~n0_log.txt ^&amp; type %~n0_temp.txt ^&amp; del /Q /F %~n0_temp.txt

这样,命令可以简单地附加在批处理文件中的后续命令之后,看起来更干净:

echo test message %_Temp_Msg_Cmd%

这也可以添加到其他命令的末尾。据我所知,当消息有多行时它会起作用。例如,如果有错误消息,以下命令会输出两行:

net use M: /D /Y %_Temp_Msg_Cmd%

【讨论】:

【参考方案20】:

就像 unix。

dir | tee a.txt

在 Windows XP 上可以工作,它需要安装 mksnt

它显示在提示符上以及附加到文件中。

【讨论】:

【参考方案21】:

这不是另一个答案,而是对已经存在的答案的概述和澄清,例如 Displaying Windows command prompt output and redirecting it to a file 和其他人

我自己发现有一系列问题导致一组 tee 实现在 Windows 中不可靠(在我的情况下为Windows 7)。

我需要专门使用一个 tee 实现,因为已经使用了带有自重定向的批处理脚本:

@echo off

setlocal


... some conditions here ..

rem the redirection
"%COMSPEC%" /C call %0 %* 2>&1 | "<path_to_tee_utililty>" ".log\<log_file_name_with_date_and_time>.%~nx0.log"
exit /b

:IMPL
... here the rest of script ...

如果与 tee 实用程序一起使用,脚本和对脚本内某些实用程序的调用可能会破坏输出。


    gnuwin32 实现

http://gnuwin32.sourceforge.net/packages/coreutils.htm

优点

正确处理标准输出和控制台进度条,其中\r 字符被大量使用。

缺点

使控制台进度条仅在日志文件中绘制,但在控制台窗口中没有重复或可见。 抛出多个错误消息Cwrite error: No such file or directory,因为 cmd 解释器似乎过早关闭了管道/标准输出,并且此后无法自行关闭(垃圾邮件直到终止)。 不在控制台窗口中复制/打印来自pause 命令 (Press any key to continue...) 的输出。
    wintee 实现

https://code.google.com/archive/p/wintee/

https://github.com/rbuhl/wintee

优点

在控制台窗口和日志文件中显示控制台进度条(多次打印)。 是否在控制台窗口中复制/打印来自pause 命令 (Press any key to continnue...) 的输出。

缺点

不正确地处理\r 字符,输出混合和混乱(https://code.google.com/archive/p/wintee/issues/7)。 有其他问题:https://code.google.com/archive/p/wintee/issues
    UnxUtils 实现:

http://unxutils.sourceforge.net/

https://sourceforge.net/projects/unxutils/files/unxutils/current/

优点

在控制台窗口和日志文件中显示控制台进度条(多次打印)。 正确处理\r 字符。 是否在控制台窗口中复制/打印来自pause 命令 (Press any key to continnue...) 的输出。

缺点

还没找到


    ss64.net 实现:

http://ss64.net/westlake/nt

http://ss64.net/westlake/nt/tee.zip

优点

在控制台窗口和日志文件中显示控制台进度条(多次打印)。

缺点

不正确地处理\r 字符,输出混乱和混乱 由于某种原因,在控制台窗口中按下键后会复制/打印来自pause 命令 (Press any key to continnue...) 的输出。
    ritchielawrence mtee 实现:

https://ritchielawrence.github.io/mtee

https://github.com/ritchielawrence/mtee

优点

在控制台窗口和日志文件中显示控制台进度条(多次打印)。 正确处理\r 字符。 是否在控制台窗口中复制/打印来自pause 命令 (Press any key to continnue...) 的输出。 错误代码保留功能无需使用带有doskey/E 标志,Windows command interpreter: how to obtain exit code of first piped command)的解决方法

缺点

不支持日志文件路径中的正斜杠字符 (https://github.com/ritchielawrence/mtee/issues/6)

因此,如果您在上述之间选择 tee 实用程序实现,那么更好的选择是 UnxUtilsmtee

【讨论】:

unixutils 包链接不起作用,更新包不包含 tee 实用程序。还有另一个 tee 实现 ss64.net/westlake/nt 和 robvanderwoude.com/unixports.php @user2956477 我添加了另一个链接。我认为更新包不应该有所有的实用程序,只有作者想要更新的那些。【参考方案22】:
@echo on

set startDate=%date%
set startTime=%time%

set /a sth=%startTime:~0,2%
set /a stm=1%startTime:~3,2% - 100
set /a sts=1%startTime:~6,2% - 100


fullprocess.bat > C:\LOGS\%startDate%_%sth%.%stm%.%sts%.LOG | fullprocess.bat

这将使用当前日期时间创建一个日志文件,您可以在此过程中使用控制台行

【讨论】:

你不是用这个调用同一个程序两次吗?【参考方案23】:

我使用带有“for”语句的批处理子例程来一次获取一行命令输出,并将该行写入文件并将其输出到控制台。

@echo off
set logfile=test.log

call :ExecuteAndTee dir C:\Program Files

Exit /B 0

:ExecuteAndTee
setlocal enabledelayedexpansion
echo Executing '%*'
  for /f "delims=" %%a in ('%* 2^>^&1') do (echo.%%a & echo.%%a>>%logfile%)
endlocal
Exit /B 0

【讨论】:

我在尝试捕获命令的输出时会做同样的事情(IE 把它放在 for 中)但是我只是调用我的标准子函数来回显到屏幕并写入日志,因为我使用它在我的整个脚本中代替使用 echo。不知道为什么这得到了别人的反对,所以我投了赞成票。【参考方案24】:

如果你在 CLI 上,为什么不使用 FOR 循环来“做”任何你想做的事情:

for /F "delims=" %a in ('dir') do @echo %a && echo %a >> output.txt

Windows CMD 上用于循环的重要资源:https://ss64.com/nt/for_cmd.html 这里的关键是将分隔符(delims)设置为空,这将分解每一行输出。这样它就不会破坏默认的空白。 %a 是一个任意字母,但它在“do”部分中用于,嗯……对每行解析的字符做一些事情。在这种情况下,我们可以使用与号 (&&) 执行第二个 echo 命令来创建或附加 (>>) 到我们选择的文件。如果在写入文件时出现问题,为了更安全地保持 DO 命令的顺序,我们至少会首先将回显发送到控制台。第一个回显前面的 at 符号 (@) 禁止控制台显示回显命令本身,而是仅显示命令的结果,即在 %a 中显示字符。否则你会看到:

驱动器 [x] 中的回显卷是 Windows 驱动器 [x] 中的卷是 Windows

更新:/F 跳过空行,唯一的解决方法是预先过滤输出,在每一行中添加一个字符(可能通过命令 find 使用行号)。在 CLI 中解决这个问题并不快也不漂亮。另外,我没有包含 STDERR,所以这里也捕获错误:

for /F "delims=" %a in ('dir 2^>^&1') do @echo %a & echo %a >> output.txt

Redirecting Error Messages

插入符号 (^) 用于对它们后面的符号进行转义,因为该命令是一个正在被解释的字符串,而不是直接在命令行中输入它。

【讨论】:

【参考方案25】:

我刚刚找到了一种使用 perl 作为替代方案的方法,例如:

CMD1 | perl -ne "print $_; print STDERR $_;" 2&gt; OUTPUT.TEE

【讨论】:

【参考方案26】:

如果您想在屏幕上真正看到某些内容,即使批处理文件被重定向到文件,以下操作也会有所帮助。如果重定向到文件,也可以使用设备 CON

例子:

ECHO first line on normal stdout. maybe redirected
ECHO second line on normal stdout again. maybe redirected
ECHO third line is to ask the user. not redirected  >CON
ECHO fourth line on normal stdout again. maybe redirected

另见良好的重定向描述:http://www.p-dd.com/chapter7-page14.html

【讨论】:

【参考方案27】:

如何显示和重定向输出 到一个文件。假设如果我使用 dos 命令, dir > test.txt ,这个命令 将输出重定向到文件 test.txt 不显示结果。如何 编写命令以显示输出 并使用重定向输出到文件 DOS 即 windows 命令提示符,而不是 在 UNIX/LINUX 中。

您可能会发现这些命令在 biterscripting (http://www.biterscripting.com) 中很有用。

var str output
lf > $output
echo $output                            # Will show output on screen.
echo $output > "test.txt"               # Will write output to file test.txt.
system start "test.txt"                 # Will open file test.txt for viewing/editing.

【讨论】:

【参考方案28】:

这可以实时工作,但也很丑陋并且性能很慢。也没有经过很好的测试:

@echo off
cls
SET MYCOMMAND=dir /B
ECHO File called 'test.bat' > out.txt
for /f "usebackq delims=" %%I in (`%MYCOMMAND%`) do (
  ECHO %%I
  ECHO %%I >> out.txt
) 
pause

【讨论】:

不,它不是实时的,它会等到%MYCOMMAND% 完成,并且在很多情况下都会失败。它跳过空行,以; 开头的行失败,内容为&lt;space&gt;/&lt;TAB&gt;ONOFF/?。但其余的有时可以工作:-)【参考方案29】:

另一种方法是在程序中将标准输出转换为标准错误:

在java中:

System.setOut(new PrintStream(new TeeOutputStream(System.out, System.err)));

然后,在你的 dos 批处理文件中:java program &gt; log.txt

标准输出将转到日志文件,标准错误(相同数据)将显示在控制台上。

【讨论】:

【参考方案30】:

我在我的大多数机器上都安装了 perl,所以使用 perl 来回答:tee.pl

my $file = shift || "tee.dat";
open $output, ">", $file or die "unable to open $file as output: $!";
while(<STDIN>)

    print $_;
    print $output $_;

close $output;

目录 | perl tee.pl 要么 目录 | perl tee.pl dir.bat

粗糙且未经测试。

【讨论】:

以上是关于显示 Windows 命令提示符输出并将其重定向到文件的主要内容,如果未能解决你的问题,请参考以下文章

将音频输出重定向到线路输入

Pharo Smalltalk - 消息转发,是不是可以截获消息并将其重定向到另一个对象(实例)?

在 https:// 中设置默认 Wordpress 并将其重定向到 http:// 并在 Cloudflare 中将 http:// 转发到 https://

在命名管道 (FIFO) 的消费者端,有没有办法区分每个项目并将其重定向到自己的进程?

Codeigniter:获取页面的URI段并将其添加到其重定向页面的URL中

报错笔记:linux 命令行中的print输出内容无法重定向到文件中