|
|
灰常酷的楼房 · 通过具体化视图进行性能优化 - Azure ...· 1 年前 · |
|
|
千杯不醉的遥控器 · Django 关系类型字段 - 如心幻雨 ...· 1 年前 · |
|
|
茫然的烈马 · ASP .Net Core 在 ...· 2 年前 · |
|
|
酷酷的领带 · 如何用cmd运行C程序_cmd运行c语言_耳 ...· 2 年前 · |
我有一个执行任务并将输出发送到文本文件的批处理脚本。有没有办法让输出也显示在控制台窗口上?
例如:
c:\Windows>dir > windows-dir.txt
有没有办法将
dir
的输出显示在控制台窗口中,并将其放入文本文件中?
command > file >&1
如果您不需要实时输出(即,当程序正在编写它时),您可以添加
type windows-dir.txt
在那行之后。
对我有效的解决方案是: dir > a.txt | type a.txt 。
只需以这种方式使用UNIX tee命令的Windows版本(可从 http://unxutils.sourceforge.net 找到):
mycommand > tee outpu_file.txt
如果您还需要STDERR输出,那么使用以下命令。
2>&1
将STDERR输出合并到STDOUT (主流)中。
mycommand 2>&1 | tee output_file.txt
我喜欢atn的答案,但它不像 wintee 那样容易下载,它也是开源的,并且只提供了tee功能(如果你只想要tee,而不是整个unix实用程序集,这很有用)。我从davor对 Displaying Windows command prompt output and redirecting it to a file 的回答中了解到这一点,在那里您还可以找到对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“子句,如下面的
%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
"Tomas R“提供的解决方案完美地解决了OP的问题,而且它本身就是可用的。
尝试: chkdsk c:> output.txt |键入output.txt
此命令的输出包含一个完成百分比,该完成百分比将串行输出到文件中,因此它看起来有点凌乱(即,文本将在进行过程中被附加)。输出到STDOUT (屏幕)的位不会发生这种情况。如果您只是执行相同的命令而不重定向,情况就会是这样的。
如果要追加而不是替换输出文件,则可能需要使用
dir 1>> files.txt 2>> err.txt
或
dir 1>> files.txt 2>>&1
我的选择是:
创建一个接收消息并自动将其发送到控制台和日志文件的子例程。
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#控制台,可以处理命令屏幕和日志的实时输出
class Tee
static int Main(string[] args)
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)