Jam*_*ers 132 windows cmd batch-file
我有一个批处理脚本执行任务并将输出发送到文本文件.有没有办法在控制台窗口上显示输出?
例如:
c:\Windows>dir > windows-dir.txt
有没有办法dir在控制台窗口中显示输出并将其放入文本文件?
jeb*_*jeb 211
不,你不能用纯重定向.
但是有一些技巧(比如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是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(并且不是非常有用).
希望能帮助到你.
小智 32
只需以这种方式使用Windows版本的UNIX tee命令(可从http://unxutils.sourceforge.net找到):
mycommand > tee outpu_file.txt
如果还需要STDERR输出,请使用以下命令.
的2>&1结合了stderr输出到STDOUT(一次流).
mycommand 2>&1 | tee output_file.txt
对我有用的解决方案是:dir> a.txt | 输入a.txt.
小智 6
是的,有一种方法可以在控制台(屏幕)和文件中显示单个命令输出.使用您的示例,使用...
@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
| 归档时间: | 
 | 
| 查看次数: | 342544 次 | 
| 最近记录: |