我有一个批处理脚本执行任务并将输出发送到文本文件.有没有办法在控制台窗口上显示输出?
例如:
c:\Windows>dir > windows-dir.txt
有没有办法dir
在控制台窗口中显示输出并将其放入文本文件?
不,你不能用纯重定向.
但是有一些技巧(比如tee.bat)你可以.
我试着解释一下重定向.
您使用> file或
如果重定向在命令之前或之后,则它不重要,因此这两行几乎相同.
dir > file.txt > file.txt dir
此示例中的重定向仅是1>的快捷方式,这意味着将重定向流1(STDOUT).
因此,您可以使用前缀2> err.txt之类的数字重定向任何流,并且还允许在一行中重定向多个流.
dir 1> files.txt 2> err.txt 3> nothing.txt
在这个例子中,"标准输出"将进入files.txt,所有错误都将在err.txt中,而stream3将进入nothing.txt(DIR不使用流3).
Stream0是STDIN
Stream1是STDOUT
Stream2
是STDERR
Stream3-9未使用
但是,如果您尝试多次重定向同一个流,会发生什么?
dir > files.txt > two.txt
"只能有一个",它始终是最后一个!
所以它等于dir> two.txt
好的,有一个额外的可能性,将流重定向到另一个流.
dir 1>files.txt 2>&1
2>&1将stream2重定向到stream1和1> files.txt将所有重定向到files.txt.
订单在这里很重要!
dir ... 1>nul 2>&1 dir ... 2>&1 1>nul
是不同的.第一
行将所有(STDOUT和STDERR)重定向到NUL,但第二行将STDOUT重定向到NUL,将STDERR重定向到"空"STDOUT.
作为一个结论,很显然为什么OtávioDécio和andynormancx的例子不起作用.
command > file >&1 dir > file.txt >&2
两者都尝试重定向stream1两次,但"只能有一个",它始终是最后一个.
所以你得到了
command 1>&1 dir 1>&2
并且在第一个示例中,不允许将stream1重定向到stream1(并且不是非常有用).
希望能帮助到你.
只需以这种方式使用Windows版本的UNIX tee命令(可从http://unxutils.sourceforge.net找到):
mycommand > tee outpu_file.txt
如果还需要STDERR输出,请使用以下命令.
的2>&1
结合了stderr输出到STDOUT(一次流).
mycommand 2>&1 | tee output_file.txt
如果您不需要实时输出(即程序正在编写它),您可以添加
type windows-dir.txt
在那之后.
对我有用的解决方案是:dir> a.txt | 输入a.txt.
是的,有一种方法可以在控制台(屏幕)和文件中显示单个命令输出.使用您的示例,使用...
@ECHO OFF FOR /F "tokens=*" %%I IN ('DIR') DO ECHO %%I & ECHO %%I>>windows-dir.txt
详细说明:
该FOR
命令将命令或文本的输出解析为变量,该变量可以多次引用.
对于命令,例如DIR /B
,用单引号括起来,如下例所示.DIR /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 )
如果您有时希望仅在控制台(屏幕)上输出,而其他时间只发送到文件,而其他时间发送到两者,请使用变量指定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