如何回显并发送控制台输出到蝙蝠脚本中的文件?
我有一个批处理脚本执行任务,并将输出发送到一个文本文件。 有没有办法让输出显示在控制台窗口?
例如:
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。