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