Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何回送控制台输出并将其发送到bat脚本中的文件?_Windows_Batch File_Cmd - Fatal编程技术网

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

Windows 如何回送控制台输出并将其发送到bat脚本中的文件?,windows,batch-file,cmd,Windows,Batch File,Cmd,我有一个执行任务并将输出发送到文本文件的批处理脚本。有没有办法让输出也显示在控制台窗口上 例如: c:\Windows>dir > windows-dir.txt 有没有办法让dir的输出显示在控制台窗口中,并将其放入文本文件中?如果您不需要实时输出(即在程序编写时),可以添加 command > file >&1 type windows-dir.txt 在那一行之后。对我有效的解决方案是:。不,你不能使用纯重定向。 但是用一些技巧(比如)你可以 我试着解

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

例如:

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

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

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

command > file >&1
type windows-dir.txt

在那一行之后。

对我有效的解决方案是:。

不,你不能使用纯重定向。
但是用一些技巧(比如)你可以

我试着解释一下重定向

使用>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不使用stream 3)。
Stream0是标准格式
Stream1是标准输出
Stream2是标准的
未使用流3-9

但是如果您多次尝试重定向同一个流,会发生什么

dir > files.txt > two.txt
“只能有一个”,而且总是最后一个
因此它等于dir>two.txt

好的,还有一种可能性,将一个流重定向到另一个流

dir 1>files.txt 2>&1 
2>&1将stream2重定向到stream1,并1>文件.txt将所有文件重定向到文件.txt
这里的订单很重要

dir ... 1>nul 2>&1
dir ... 2>&1 1>nul
它们是不同的。第一个将所有(STDOUT和STDERR)重定向到NUL,
但是第二行将标准输出重定向到NUL,将标准输出重定向到“空”标准输出

作为一个结论,奥塔维奥·德西奥和安德约曼克斯的例子显然无法奏效

command > file >&1
dir > file.txt >&2
两者都尝试重定向stream1两次,但“只能有一次”,而且总是最后一次重定向。
所以你得到了

command 1>&1
dir 1>&2
在第一个示例中,不允许将stream1重定向到stream1(这不是很有用)


希望能有所帮助。

只需以以下方式使用Windows版本的UNIX tee命令(从中找到):

mycommand > tee outpu_file.txt
如果还需要STDERR输出,请使用以下命令。
2>&1
将STDERR输出合并到STDOUT(主流)中


我喜欢atn的答案,但下载它并不像下载它那样简单,它也是开源的,只提供了tee功能(如果您只需要tee而不是整个unix实用程序集,那么它很有用)。我从davor对的回答中了解到了这一点,在这里您还可以找到unix实用程序的参考资料。

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

@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”子句,如下所示,使用
%toechohere%

@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
“Tomas R”提供的解决方案非常适用于OP的问题,并且本机可用

尝试: chkdsk c:>output.txt |键入output.txt


此命令的输出包含一个连续输出到文件的完成百分比,因此它看起来有点凌乱(即,文本将随进程追加)。这不会发生在输出到标准输出(屏幕)的位上。如果只执行相同的命令而不重定向,情况就是这样。

如果要附加而不是替换输出文件,可能需要使用

dir 1>> files.txt 2>> err.txt

我的选择是:

创建一个子例程,接收消息并自动将其发送到控制台和日志文件

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
如果向消息中添加变量,请确保在将其发送到子例程之前删除其中的引号,否则可能会影响批处理。 当然,这只适用于回音。

我制作了一个简单的C#控制台,可以处理cmd屏幕和日志的实时输出

class Tee
{
    static int Main(string[] args)
    {
        try
        {
            string logFilePath = Path.GetFullPath(args[0]);

            using (StreamWriter writer = new StreamWriter(logFilePath, true))
            {
                for (int value; (value = Console.In.Read()) != -1;)
                {
                    var word = Char.ConvertFromUtf32(value);
                    Console.Write(word);
                    writer.Write(word);
                }
            }
        }
        catch (Exception)
        {
            return 1;
        }
        return 0;
    }
}
批处理文件的用法与使用Unix的方法相同
tee

foo | tee xxx.log
这是一个存储库,其中包括Tee.exe,以防您没有工具进行编译

我想你想要的是这样的东西:

echo Your Msg> YourTxtFile.txt
或者,如果您想要一条新线路:

echo Your Msg>> YourTxtFile.txt
这些命令对于日志非常有用

注意:这有时会出现故障并替换我计算机上的整个文本文件


另一个注意事项:如果该文件不存在,它将创建该文件。

当您不将数据写入屏幕时,速度会更快,因为您没有用垃圾填充缓冲区,而是让批处理作业运行。如果您正在调试,我将不会使用>文件语法。@andynormancx yup忘记键入该语法,而不是从CMD中剪切和粘贴。我无法在windows命令提示符下使用该语法,而是使用type命令。&2正常工作,但我测试该文件时不会创建该文件。如果我使用“dir>file.txt>&2”未创建file.txt文件。目录的输出将在控制台中进行回显,但不会创建文件。该文件是在“>&2”不存在时创建的。或在同一行上创建的(在
echo Your Msg> YourTxtFile.txt
echo Your Msg>> YourTxtFile.txt