如何回显并发送控制台输出到蝙蝠脚本中的文件?

我有一个批处理脚本执行任务,并将输出发送到一个文本文件。 有没有办法让输出显示在控制台窗口?

例如:

c:\Windows>dir > windows-dir.txt 

有没有办法在控制台窗口中显示dir的输出,并将其放入文本文件?

编辑位>> tldr; 不,你不能。

我尝试解释一下redirect。

您使用>文件<文件redirect十个stream中的一个
如果redirect是在命令之前或之后,那么这两行几乎是相同的,这是不重要的。

 dir > file.txt > file.txt dir 

这个例子中的redirect只是1>的一个快捷方式,这意味着stream1(STDOUT)将被redirect。
所以你可以用2> err.txt这样的数字来redirect任何stream,也可以在一行中redirect多个stream。

 dir 1> files.txt 2> err.txt 3> nothing.txt 

在这个例子中,“标准输出”将进入files.txt,所有错误将在err.txt中,并且stream3将进入nothing.txt(DIR不使用stream3)。
Stream0是STDIN
Stream1是STDOUT
Stream2是STDERR
Stream3-9不使用

但是,如果您尝试多次redirect同一个stream,会发生什么?

 dir > files.txt > two.txt 

“只能有一个”,它总是最后一个!
所以它等于dir> two.txt

好的,有一个额外的可能性,redirect到另一个stream的stream。

 dir 1>files.txt 2>&1 

2>&1将stream2redirect到stream1,1 > files.txt将所有redirect到files.txt
这里的顺序很重要!

 dir ... 1>nul 2>&1 dir ... 2>&1 1>nul 

是不同的。 第一个将所有的(STDOUT和STDERR)redirect到NUL,
但第二行将STDOUTredirect到NUL和STDERR到“空”STDOUT。

作为一个结论,OtávioDécio和andynormancx的例子显然是不可行的。

 command > file >&1 dir > file.txt >&2 

两个都试图redirectstream1两次,但“只能有一个”,而且总是最后一个。
所以你明白了

 command 1>&1 dir 1>&2 

在第一个示例中,stream1redirect到stream1是不允许的(也不是很有用)。

希望它有帮助。

只需使用Windows版本的UNIX tee命令(可以从http://unxutils.sourceforge.netfind )以这种方式:

 mycommand > tee outpu_file.txt 

如果您还需要STDERR输出,请使用以下内容。
2>&1将STDERR输出组合到STDOUT(主stream)中。

 mycommand 2>&1 | tee output_file.txt 

如果您不需要实时输出(即程序正在写入),则可以添加

 type windows-dir.txt 

在那之后。

为我工作的解决scheme是: dir> a.txt | 键入a.txt 。

 command > file >&1 

是的,有一种方法可以在控制台(屏幕)和文件中显示单个命令输出。 使用你的例子,使用…

 @ECHO OFF FOR /F "tokens=*" %%I IN ('DIR') DO ECHO %%I & ECHO %%I>>windows-dir.txt 

详细说明:

FOR命令将命令或文本的输出parsing为一个可以多次引用的variables。

对于像DIR /B这样的命令,请使用单引号括起来,如下例所示。 用你想要的命令replaceDIR /B文本。

 FOR /F "tokens=*" %%I IN ('DIR /B') DO ECHO %%I & ECHO %%I>>FILE.TXT 

要显示文本,请使用双引号将文本括起来,如下例所示。

 FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO ECHO %%I & ECHO %%I>>FILE.TXT 

…和线包装…

 FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO ( ECHO %%I & ECHO %%I>>FILE.TXT ) 

如果你有时只想在控制台(屏幕)上输出,而其他时间只发送给文件,而其他时间发送给两者,则使用variables指定FOR循环的“DO”子句,如下所示, %TOECHOWHERE%

 @ECHO OFF FOR %%I IN (TRUE FALSE) DO ( FOR %%J IN (TRUE FALSE) DO ( SET TOSCREEN=%%I & SET TOFILE=%%J & CALL :Runit) ) GOTO :Finish :Runit REM Both TOSCREEN and TOFILE get assigned a trailing space in the FOR loops REM above when the FOR loops are evaluating the first item in the list, REM "TRUE". So, the first value of TOSCREEN is "TRUE " (with a trailing REM space), the second value is "FALSE" (no trailing or leading space). REM Adding the ": =" text after "TOSCREEN" tells the command processor to REM remove all spaces from the value in the "TOSCREEN" variable. IF "%TOSCREEN: =%"=="TRUE" ( IF "%TOFILE: =%"=="TRUE" ( SET TEXT=On screen, and in "FILE.TXT" SET TOECHOWHERE="ECHO %%I & ECHO %%I>>FILE.TXT" ) ELSE ( SET TEXT=On screen, not in "FILE.TXT" SET TOECHOWHERE="ECHO %%I" ) ) ELSE ( IF "%TOFILE: =%"=="TRUE" ( SET TEXT=Not on screen, but in "FILE.TXT" SET TOECHOWHERE="ECHO %%I>>FILE.txt" ) ELSE ( SET TEXT=Not on screen, nor in "FILE.TXT" SET TOECHOWHERE="ECHO %%I>NUL" ) ) FOR /F "tokens=*" %%I IN ("%TEXT%") DO %TOECHOWHERE:~1,-1% GOTO :eof :Finish ECHO Finished [this text to console (screen) only]. PAUSE 

如果你想追加而不是replace输出文件,你可能想要使用

 dir 1>> files.txt 2>> err.txt 

要么

 dir 1>> files.txt 2>>&1 

我喜欢atn的答案,但对于我来说,下载wintee并不是件轻而易举的事情,wintee也是开放源代码,并且只提供了三通function(如果你只想使用tee而不是整个unix工具集)。 我从davor的“ 显示Windows命令提示符输出”的答案中了解到了这一点,并将其redirect到一个文件中 ,在文件中还可以find对unix实用程序的引用。

我的select是这样的:

创build一个接收消息的子例程,并自动将其发送到控制台和日志文件。

 setlocal set logfile=logfile.log call :screenandlog "%DATE% %TIME% This message goes to the screen and to the log" goto :eof :screenandlog set message=%~1 echo %message% & echo %message% >> %logfile% exit /b 

如果在消息中添加一个variables,确保在将消息发送到子例程之前删除其中的引号,否则可能会使您的批处理失败。 当然,这只适用于回声。

“Tomas R”提供的解决scheme完美适用于OP的问题,它本身就是可用的。

试试:chkdsk c:> output.txt | inputoutput.txt

这个命令的输出包含一个完成百分比,它被连续输出到文件中,因此看起来有点乱(即随着文件的进展,文本会被追加)。 这不会发生输出到STDOUT(屏幕)的位。 这是如果你只是做同样的命令没有redirect。