当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何回显并将控制台输出发送到bat脚本中的文件?》经验,为你挑选了5个好方法。

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

例如:

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

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



1> jeb..:

不,你不能用纯重定向.
但是有一些技巧(比如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 shell是不可能的
@fantastory这是可能的,看看dbenham这个伟大的解决方案[Windows batch:'tee'命令](http://stackoverflow.com/a/21841567/463115)

2> 小智..:

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

mycommand > tee outpu_file.txt

如果还需要STDERR输出,请使用以下命令.
2>&1结合了stderr输出到STDOUT(一次流).

mycommand 2>&1 | tee output_file.txt


[PowerShell Tee-Object](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/tee-object)提供类似的功能.Get-Process | Tee-Object -file c:\ scripts\test.txt

3> Mark Pim..:

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

type windows-dir.txt

在那之后.



4> NSPKUWCExi2p..:

对我有用的解决方案是:dir> a.txt | 输入a.txt.


这适用于低输出的命令。使用大输出命令时,它不起作用,因为它仅显示第一个缓冲区。他要求实时输出,同时将输出保存到日志文件中。

5> 小智..:

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

@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

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有