猿问

如何在bat脚本中回显控制台输出并将其发送到文件?

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


例如:


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

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


繁花如伊
浏览 3524回答 3
3回答

忽然笑

不,您不能使用纯重定向。但是,您可以使用一些技巧(例如tee.bat)。我尝试解释一下重定向。使用> file或<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是STDINStream1是STDOUT Stream2是STDERRStream3-9未使用但是,如果您尝试多次重定向同一流,会发生什么情况?dir > files.txt > two.txt“只能有一个”,它永远是最后一个!因此等于dir> two.txt好的,还有一种可能,将一个流重定向到另一个流。dir 1>files.txt 2>&1&nbsp;2>&1将stream2重定向到stream1,而1> files.txt将所有都重定向到files.txt。这里的顺序很重要!dir ... 1>nul 2>&1dir ... 2>&1 1>nul是不同的。第一个将所有(STDOUT和STDERR)重定向到NUL,但是第二行将STDOUT重定向到NUL,将STDERR重定向到“空” STDOUT。作为一个结论,很明显为什么OtávioDécio和andynormancx的示例无法正常工作。command > file >&1dir > file.txt >&2两者都尝试将stream1重定向两次,但是“只能有一个”,并且始终是最后一个。所以你得到command 1>&1dir 1>&2并且在第一个示例中,不允许将stream1重定向到stream1(并且不是很有用)。希望能帮助到你。

牛魔王的故事

是的,有一种方法可以在控制台(屏幕)和文件中显示单个命令输出。使用您的示例,使用...@ECHO OFFFOR /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 (&nbsp; ECHO %%I & ECHO %%I>>FILE.TXT)如果您有时只希望在控制台(屏幕)上输出,而有时只希望将输出发送到文件,而有时又希望同时发送给两个文件,请使用变量指定FOR循环的“ DO”子句,如下所示%TOECHOWHERE%。@ECHO OFFFOR %%I IN (TRUE FALSE) DO (&nbsp; FOR %%J IN (TRUE FALSE) DO (&nbsp; &nbsp; SET TOSCREEN=%%I & SET TOFILE=%%J & CALL :Runit))GOTO :Finish:Runit&nbsp; REM Both TOSCREEN and TOFILE get assigned a trailing space in the FOR loops&nbsp; REM above when the FOR loops are evaluating the first item in the list,&nbsp; REM "TRUE".&nbsp; So, the first value of TOSCREEN is "TRUE " (with a trailing&nbsp; REM space), the second value is "FALSE" (no trailing or leading space).&nbsp; REM Adding the ": =" text after "TOSCREEN" tells the command processor to&nbsp; REM remove all spaces from the value in the "TOSCREEN" variable.&nbsp; IF "%TOSCREEN: =%"=="TRUE" (&nbsp; &nbsp; &nbsp; IF "%TOFILE: =%"=="TRUE" (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET TEXT=On screen, and in "FILE.TXT"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET TOECHOWHERE="ECHO %%I & ECHO %%I>>FILE.TXT"&nbsp; &nbsp; &nbsp; &nbsp; ) ELSE (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET TEXT=On screen, not in "FILE.TXT"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET TOECHOWHERE="ECHO %%I"&nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; ) ELSE (&nbsp; &nbsp; &nbsp; IF "%TOFILE: =%"=="TRUE" (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET TEXT=Not on screen, but in "FILE.TXT"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET TOECHOWHERE="ECHO %%I>>FILE.txt"&nbsp; &nbsp; &nbsp; &nbsp; ) ELSE (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET TEXT=Not on screen, nor in "FILE.TXT"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET TOECHOWHERE="ECHO %%I>NUL"&nbsp; &nbsp; &nbsp; )&nbsp; )&nbsp; FOR /F "tokens=*" %%I IN ("%TEXT%") DO %TOECHOWHERE:~1,-1%GOTO :eof:Finish&nbsp; ECHO Finished [this text to console (screen) only].&nbsp; PAUSE
随时随地看视频慕课网APP
我要回答