c语言 输出定向到文件 命令提示符窗口也能看见,关于cmd:显示Windows命令提示符输出并将其重定向到文件...

如何在Windows命令提示符下运行命令行应用程序并同时显示输出并重定向到文件?

例如,如果我要运行命令dir > test.txt,则会将输出重定向到名为test.txt的文件而不显示结果。

我怎么能写一个命令来显示输出并将输出重定向到Windows命令提示符中的文件,类似于Unix上的tee命令?

请停止称它为MSDOS! cmd.exe和braindead command.com之间的相似之处微不足道,并且越来越小。

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

如果有一个控制台应用程序加载一个输出文本的DLL,这些都不起作用。 主应用程序文本被重定向到文件,但dll的输出不会继续显示在控制台窗口中。 我找不到从dll捕获文本的方法。

一个人仍然只能管道进入文件并在该文件上使用tail(stackoverflow.com/questions/187587/)

要扩展davor的答案,您可以像这样使用PowerShell:

powershell"dir | tee test.txt"

如果您尝试在当前目录中重定向exe的输出,则需要在文件名上使用.\,例如:

powershell".\something.exe | tee test.txt"

这是最接近的答案:它适用于默认安装,因为PS已经存在于大多数机器上,尤其是服务器上。

这是最好的答案!简单,工作"开箱即用"

它工作正常,但文件不包含所有输出

喜欢它:)无论如何{powershell"ping -n 10 localhost | tee test.txt"}将展示更好的发球派对

请注意,powershell中的dir是Get-ChildItem的别名,它与cmd的内部dir命令不同。如果需要cmd内部版本,则需要powershell"cmd /c dir | tee test.txt"

要查看所有输出,请不要忘记使用2>&1将STDERR重定向到STDOUT,例如node 2>&1 | tee debug_log.txt

但是你在控制台输出上丢失了文本颜色。

是非常有用的命令,我们想拥有一切,我们需要2>&1

考虑添加'-Append',这样每个命令启动时日志文件都不会被截断。例如powershell"node server.js 2>&1 | tee -Append app.log"

我能够找到将输出重定向到文件然后重定向到控制台的解决方案/解决方法:

dir > a.txt | type a.txt

其中dir是需要重定向输出的命令,a.txt是存储输出的文件。

这满足了答案,但是在dir命令完成之后而不是在生成数据时输出数据。

它会工作,但如果命令等待来自stdin的输入,你将会卡住。

我喜欢这个简单的答案!我发现某些命令的输出需要&而不是|,例如ping或7z.exe

不适用于交互式命令而不是dir。示例:chkdsk /f c: > c:\Temp.txt | c:\Temp.txt。系统报告文件被另一个进程锁定。

此命令似乎不处理输出到stderr。 Stderr似乎打印到控制台但未保存在文件中。

@lii re:handle output to stderr - 添加2>&1重定向,所以它是这样的:dir 2>&1 > a.txt & type a.txt,你应该将stderr与stdout混合在一起。

我同意@WesLarson,&或&&比管道|更好...管道可能无法打印长输出的整个重定向,因为它不等待完成,&确实等待完成并且是延迟输出所必需的。

是的,但我得到了丑陋的空白,任何方向?

Unix tee命令的Win32端口就是这样做的。请参阅http://unxutils.sourceforge.net/或http://getgnuwin32.sourceforge.net/

该链接指向Unix命令tee的Windows实现,因此它可以在Windows上运行。

是的,投票给答案和评论。我实际上更喜欢CygWin,因为它拥有一切,但有些人更喜欢他们可以挑选的非DLL工具。

许多Unix实用程序也由GnuWin32项目移植,请参阅gnuwin32.sourceforge.net。

UnxUtils最后更新于2003年; GnuWin32更新一点。

尽管速度很慢,CygWin的tee就像一个魅力。

为什么在Windows中有本机支持的时候使用这个,按照下面的答案?

@Feanor:你看过那个答案的评论了吗?虽然它适用于某些情况,但它有其局限性。这两个答案都是有效的并且有其用途。

投票时请发表评论。谢谢。

如果你像我一样努力寻找GnuWin32的tee包,你可以在gnuwin32.sourceforge.net/packages/coreutils.htm找到它。

看看这个:wintee

不需要cygwin。

我确实遇到并报告了一些问题。

你也可以检查unxutils,因为它包含tee(并且不需要cygwin),但要注意输出EOL在这里类似于UNIX。

最后,但并非最不重要的,如果您有PowerShell,您可以尝试Tee-Object。在PowerShell控制台中键入get-help tee-object以获取更多信息。

为什么投票失败?这里有95%的回复有一个共同点:只有在初始命令完成后才会重定向输出:阅读注释。 UNIX实用程序tee输出实时。 wtee具有相同的功能。如果你不介意这些错误,它会做得很好。

为wintee +1简单,就像一个魅力。

PS中的Tee-Object工作正常

这是唯一适合我的解决方案,没有Powershell> 4.0。竖起大拇指!

@ tori3852

我找到

dir > a.txt | type a.txt

没有工作(前几行dir列表 - 怀疑某种过程分叉和第二部分,'type'命令在可怕列表完成之前终止?),

所以我使用了:

dir > z.txt && type z.txt

它做了 - 顺序命令,一个在第二个开始之前完成。

如果要确保即使dir命令失败也要执行type命令,则应使用&而不是&&。当命令中存在某种形式的错误并且您仍希望在控制台上看到日志文件时,这非常有用。请参阅Microsoft的文章。但是,这会将%errorlevel%的问题设置为type的错误级别(将为0)。

一个简单的C#控制台应用程序可以做到这一点:

using System;

using System.Collections.Generic;

using System.IO;

namespace CopyToFiles

{

class Program

{

static void Main(string[] args)

{

var buffer = new char[100];

var outputs = new List();

foreach (var file in args)

outputs.Add(new StreamWriter(file));

outputs.Add(Console.Out);

int bytesRead;

do

{

bytesRead = Console.In.ReadBlock(buffer, 0, buffer.Length);

outputs.ForEach(o => o.Write(buffer, 0, bytesRead));

} while (bytesRead == buffer.Length);

outputs.ForEach(o => o.Close());

}

}

}

要使用它,只需将source命令传递给程序,并提供要复制输出的任何文件的路径。例如:

dir | CopyToFiles files1.txt files2.txt

将显示dir的结果,并将结果存储在files1.txt和files2.txt中。

请注意,上面的错误处理方式并不多(任何事情!),实际上可能并不需要支持多个文件。

嗯,什么都不下载tee / cygwin或用我辛苦赚来的现金购买MSVS这样一个小小的节目?这是一个艰难的:-)

你不需要visual studio来编译它,命令行工具实际上是免费的。只是谷歌".net sdk下载"的链接(直接链接似乎改变,但谷歌总是似乎工作)。

Visual Studio Express也是免费的,但我仍然只是使用tee。

自制三通实施?并且必须学习C#?使用tee ..真的。

cygwin很难安装。向你推荐,因为这是我正在寻找的。

我不认为这输出到控制台和文件同时吗?

mjaggard:神点。可以通过添加一个WAS console.out流的附加输出来轻松修改它。

不幸的是没有这样的事情。

Windows控制台应用程序只有一个输出句柄。 (好吧,有两个STDOUT,STDERR但这里没关系)>将通常写入控制台句柄的输出重定向到文件句柄。

如果你想要某种多路复用,你必须使用一个外部应用程序,你可以将输出转移到。然后,此应用程序可以再次写入文件和控制台。

* xix上的tee也是一个单独的应用程序,而不是shell上的某些重定向

虽然它有点难看,但这有效:

dir >_ && type _ && type _ > a.txt

它比其他一些解决方案更灵活,因为它可以逐个语句地工作,因此您也可以使用它进行追加。我在批处理文件中使用这一点来记录和显示消息:

ECHO Print line to screen and log to file.  >_ && type _ && type _ >> logfile.txt

是的,您可以重复ECHO语句(一次用于屏幕,第二次重定向到日志文件),但这看起来一样糟糕,并且有点维护问题。至少这种方式您不必在两个地方对消息进行更改。

请注意,_只是一个简短的文件名,因此您需要确保在批处理文件的末尾删除它(如果您使用的是批处理文件)。

这仅在您希望在进程运行后显示内容时才有用。这不是一个难以解决的问题。

是的,我想这解决了与原始海报所要求的问题略有不同的问题。

+1这就是我一直这样做的方式。我相信这是原始问题的正确答案,应该标记为如此。正如@MTS暗示的那样,诀窍是你实际上写了两个文件:一个是每个命令/行创建的(因此每次都会覆盖一个">"),然后你在屏幕上键入该行(类型),最后,再次键入它并将其输出(所有长的APPENDING)重定向到带有">>"的日志文件。这就是我多年来所做的,虽然我喜欢简单的"临时文件。我总是做"tmp.txt"或者其他东西。是的,之后删除它。

这是一个很好的方法,但我遇到了一些无法捕获的错误。将type命令放在单独的行(在子例程中)固定了。

正是我的申请所需要的。

mtee是一个小型实用程序,可以很好地实现此目的。它是免费的,源是开放的,它只是工作。

您可以在http://www.commandline.co.uk找到它。

在批处理文件中用于显示输出并同时创建日志文件,语法如下所示:

someprocess | mtee /+ mylogfile.txt

其中/ +表示附加输出。

假设您已将mtee复制到PATH中的文件夹中,当然。

在输出到文件或控制台之前,这似乎要等到输出完成。

我同意Brian Rasmussen的观点,unxutils端口是最简单的方法。在他的脚本页面的批处理文件部分中,Rob van der Woude提供了有关使用MS-DOS和CMD命令的大量信息。我认为他可能有一个原生的解决方案来解决你的问题,在那里挖掘后我发现了TEE.BAT,这似乎只是一个MS-DOS批量语言实现的tee。这是一个非常复杂的批处理文件,我的倾向仍然是使用unxutils端口。

那个tee.bat的东西看起来不错。希望OP检查出来。

请注意,在命令完成后将使用TEE.BAT输出,就像附近发布的"dir> a.txt | type a.txt"示例一样。

我想对Saxon Druce的优秀答案进行一些扩展。

如上所述,您可以在当前目录中重定向可执行文件的输出,如下所示:

powershell".\something.exe | tee test.txt"

但是,这仅将stdout记录到test.txt。它也不会记录stderr。

显而易见的解决方案是使用这样的东西:

powershell".\something.exe 2>&1 | tee test.txt"

但是,这不适用于所有something.exe。一些something.exe将2>&1解释为参数并失败。正确的解决方案是在something.exe周围只有撇号,它的开关和参数,如下所示:

powershell".\something.exe --switch1 --switch2 … arg1 arg2 …" 2>&1 | tee test.txt

我在Windows 10上构建pyqt5.7时试过这个,它很慢,控制台输出不是实时的,也许它是缓冲的?但是日志文件看起来不错

所有这一切都是完全错误的。它对我来说根本不起作用。最后一个命令出于显而易见的原因提供'tee' is not recognized as an internal or external command。对于2>&1内部cmd行,任何输出到stderr都会导致PowerShell出错。

可以是对PowerShell Tee-Object cmdlet的引用 - technet.microsoft.com/en-us/library/ee177014.aspx

如果您在Windows环境路径中有cygwin,则可以使用:

dir > a.txt | tail -f a.txt

如果您打算使用Cygwin,它会配备T恤。

dir 1>a.txt 2>&1 | type a.txt

这将有助于重定向STDOUT和STDERR

这不起作用。我尝试使用它来启动JBoss run.bat并在启动期间阻塞并且服务器冻结。这种方法存在问题......

也不适合我

为我工作,thnks

@raja ashok,对我不起作用。我试过python.exe 1> file.txt 2>&1 |输入file.txt

我也在寻找相同的解决方案,经过一番尝试,我成功地在命令提示符中实现了这一点。这是我的解决方案:

@Echo off

for /f"Delims=" %%a IN (xyz.bat) do (

%%a > _ && type _ && type _ >> log.txt

)

@Echo on

它甚至还捕获任何PAUSE命令。

这是我根据其他答案之一使用的样本

@echo off

REM SOME CODE

set __ERROR_LOG=c:\errors.txt

REM set __IPADDRESS=x.x.x.x

REM Test a variable

if not defined __IPADDRESS (

REM Call function with some data and terminate

call :TEE %DATE%,%TIME%,IP ADDRESS IS NOT DEFINED

goto :EOF

)

REM If test happens to be successful, TEE out a message and end script.

call :TEE Script Ended Successful

goto :EOF

REM THE TEE FUNCTION

:TEE

for /f"tokens=*" %%Z in ("%*") do (

>  CON ECHO.%%Z

>>"%__ERROR_LOG%" ECHO.%%Z

goto :EOF

)

我知道这是一个非常古老的话题,但在之前的答案中,并没有完全实现以批处理方式编写的实时Tee。我的解决方案是Batch-JScript混合脚本,它使用JScript部分来获取管道命令的输出,但数据处理在Batch部分完成。这种方法的优点是任何Batch程序员都可以修改该程序以满足特定需求。该程序还正确处理其他批处理文件生成的CLS命令的输出,即在检测到CLS命令输出时清除屏幕。

@if (@CodeSection == @Batch) @then

@echo off

setlocal EnableDelayedExpansion

rem APATee.bat: Asynchronous (real time) Tee program, Batch-JScript hybrid version

rem Antonio Perez Ayala

rem The advantage of this program is that the data management is written in Batch code,

rem so any Batch programmer may modify it to fit their own needs.

rem As an example of this feature, CLS command is correctly managed

if"%~1" equ"" (

echo Duplicate the Stdout output of a command in the screen and a disk file

echo/

echo anyCommand ^| APATee teeFile.txt [/A]

echo/

echo If /A switch is given, anyCommand output is *appended* to teeFile.txt

goto :EOF

)

if"%2" equ":TeeProcess" goto TeeProcess

rem Get the output of CLS command

for /F %%a in ('cls') do set"cls=%%a"

rem If /A switch is not provided, delete the file that receives Tee output

if /I"%~2" neq"/A" if exist %1 del %1

rem Create the semaphore-signal file and start the asynchronous Tee process

echo X > Flag.out

if exist Flag.in del Flag.in

Cscript //nologo //E:JScript"%~F0" |"%~F0" %1 :TeeProcess

del Flag.out

goto :EOF

:TeeProcess

rem Wait for"Data Available" signal

if not exist Flag.in goto TeeProcess

rem Read the line sent by JScript section

set line=

set /P line=

rem Set"Data Read" acknowledgement

ren Flag.in Flag.out

rem Check for the standard"End Of piped File" mark

if"!line!" equ":_EOF_:" exit /B

rem Correctly manage CLS command

if"!line:~0,1!" equ"!cls!" (

cls

set"line=!line:~1!"

)

rem Duplicate the line in Stdout and the Tee output file

echo(!line!

echo(!line!>> %1

goto TeeProcess

@end

// JScript section

var fso = new ActiveXObject("Scripting.FileSystemObject");

// Process all lines of Stdin

while ( ! WScript.Stdin.AtEndOfStream ) {

// Read the next line from Stdin

var line = WScript.Stdin.ReadLine();

// Wait for"Data Read" acknowledgement

while ( ! fso.FileExists("Flag.out") ) {

WScript.Sleep(10);

}

// Send the line to Batch section

WScript.Stdout.WriteLine(line);

// Set"Data Available" signal

fso.MoveFile("Flag.out","Flag.in");

}

// Wait for last"Data Read" acknowledgement

while ( ! fso.FileExists("Flag.out") ) {

WScript.Sleep(10);

}

// Send the standard"End Of piped File" mark

WScript.Stdout.WriteLine(":_EOF_:");

fso.MoveFile("Flag.out","Flag.in");

将输出发送到控制台,附加到控制台日志,删除当前命令的输出

dir  >> usb-create.1 && type usb-create.1 >> usb-create.log | type usb-create.1 && del usb-create.1

小心解释这里发生了什么?

这样的事情应该做你需要的吗?

%DATE%_%TIME% > c:\a.txt & type c:\a.txt

ipconfig >> c:\a.txt & type c:\a.txt

ping localhost >> c:\a.txt & type c:\a.txt

pause

几乎,但它不会同时显示 - 如果你有一个长时间运行的任务,你将很长时间没有结果。

这是MTS先前答案的变体,但它添加了一些可能对其他人有用的功能。这是我使用的方法:

命令被设置为变量,可以在以后的整个代码中使用,输出到命令窗口并附加到日志文件,使用set _Temp_Msg_Cmd=

该命令已使用carrot ^字符转义重定向,因此最初不会评估命令

创建一个临时文件,其文件名类似于正在运行的名为%~n0_temp.txt的批处理文件,该文件使用命令行参数扩展语法%~n0来获取批处理文件的名称。

输出附加到单独的日志文件%~n0_log.txt

这是命令序列:

输出和错误消息将发送到临时文件^> %~n0_temp.txt 2^>^&1

然后临时文件的内容都是:

附加到日志文件^& type %~n0_temp.txt ^>^> %~n0_log.txt

输出到命令窗口^& type %~n0_temp.txt

带有消息的临时文件将被删除^& del /Q /F %~n0_temp.txt

这是一个例子:

set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt

这样,命令可以简单地在批处理文件中的后续命令之后添加,该批处理文件看起来更清晰:

echo test message %_Temp_Msg_Cmd%

这也可以添加到其他命令的末尾。据我所知,当消息有多行时它将起作用。例如,如果出现错误消息,则以下命令输出两行:

net use M: /D /Y %_Temp_Msg_Cmd%

@echo on

set startDate=%date%

set startTime=%time%

set /a sth=%startTime:~0,2%

set /a stm=1%startTime:~3,2% - 100

set /a sts=1%startTime:~6,2% - 100

fullprocess.bat > C:\LOGS\%startDate%_%sth%.%stm%.%sts%.LOG | fullprocess.bat

这将创建一个包含当前日期时间的日志文件,您可以在此过程中使用控制台行

你不是两次用同一个程序调用它吗?

我使用带有"for"语句的批处理子例程来一次获取一行命令输出,并将该行写入文件并将其输出到控制台。

@echo off

set logfile=test.log

call :ExecuteAndTee dir C:\Program Files

Exit /B 0

:ExecuteAndTee

setlocal enabledelayedexpansion

echo Executing '%*'

for /f"delims=" %%a in ('%* 2^>^&1') do (echo.%%a & echo.%%a>>%logfile%)

endlocal

Exit /B 0

我尝试从命令中捕获输出(IE将其置于for中)时也这样做但后来我只是调用我的标准子函数回显到屏幕并写入日志,因为我在整个脚本中使用它来替换使用echo 。不知道为什么有人从其他人那里得到了一个downvote,所以我对它进行了投票。

如果你在CLI上,为什么不使用FOR循环来"DO"你想要的任何东西:

for /F"delims=" %a in ('dir') do @echo %a && echo %a >> output.txt

Windows CMD for循环中的优秀资源:https://ss64.com/nt/for_cmd.html

这里的关键是设置分隔符(delims),它会将每行输出分解为空。这样它就不会破坏默认的空白区域。 %a是一个任意字母,但它在"do"部分中使用,以及...对每行解析的字符执行某些操作。在这种情况下,我们可以使用&符号(&&)执行第二个echo命令来创建或追加(>>)到我们选择的文件。如果在编写文件时出现问题,请更安全地保留DO命令的顺序,我们至少首先将回声传递给控制台。第一个回显前面的at符号(@)禁止控制台显示echo-command本身,而只是显示命令的结果,该命令用于显示%a中的字符。否则你会看到:

echo Volume in drive [x] is Windows Volume in drive [x] is Windows

更新:/ F跳过空白行,只修复是预先过滤输出,为每一行添加一个字符(可能通过命令查找行号)。在CLI中解决这个问题不是很快或很漂亮。此外,我没有包括STDERR,所以这里也捕获错误:

for /F"delims=" %a in ('dir 2^>^&1') do @echo %a & echo %a >> output.txt

重定向错误消息

插入符号(^)用于转义它们后面的符号,因为该命令是一个被解释的字符串,而不是直接在命令行中输入它。

就像unix一样。

dir | tee a.txt

是否有效在Windows XP上,它需要安装mksnt。

它会显示在提示上并附加到文件中。

如果你想要在屏幕上看到的东西,即使批处理文件被重定向到文件,以下内容也会有所帮助。如果重定向到文件,也可以使用设备CON

例:

ECHO first line on normal stdout. maybe redirected

ECHO second line on normal stdout again. maybe redirected

ECHO third line is to ask the user. not redirected  >CON

ECHO fourth line on normal stdout again. maybe redirected

另请参阅良好的重定向说明:http://www.p-dd.com/chapter7-page14.html

How do I display and redirect output

to a file. Suppose if I use dos

command, dir > test.txt ,this command

will redirect output to file test.txt

without displaying the results. how to

write a command to display the output

and redirect output to a file using

DOS i.e., windows command prompt, not

in UNIX/LINUX.

您可能会发现biterscripting(http://www.biterscripting.com)中的这些命令很有用。

var str output

lf > $output

echo $output                            # Will show output on screen.

echo $output >"test.txt"               # Will write output to file test.txt.

system start"test.txt"                 # Will open file test.txt for viewing/editing.

另一种方法是在程序中将stdout发送到stderr:

在java中:

System.setOut(new PrintStream(new TeeOutputStream(System.out, System.err)));

然后,在dos批处理文件中:java program > log.txt

stdout将转到日志文件,stderr(相同的数据)将显示在控制台上。

另一种变化是拆分管道,然后根据需要重新定向输出。

@echo off

for /f"tokens=1,* delims=:" %%P in ('findstr /n"^"') do (

echo.%%Q

echo.%%Q>&3

)

@exit/b %errorlevel%

将以上内容保存为.bat文件。它还将文件流1上的文本输出拆分为文件流3,您可以根据需要重定向。在下面的示例中,我调用了上面的脚本splitPipe.bat ...

dir | splitPipe.bat  1>con  2>&1  3>my_stdout.log

splitPipe.bat 2>nul < somefile.txt

我在大多数机器上安装了perl,所以使用perl:tee.pl来回答

my $file = shift ||"tee.dat";

open $output,">", $file or die"unable to open $file as output: $!";

while()

{

print $_;

print $output $_;

}

close $output;

dir | perl tee.pl

要么

dir | perl tee.pl dir.bat

原油和未经测试。

这实时工作,但也有点难看,性能很慢。还未经过充分测试:

@echo off

cls

SET MYCOMMAND=dir /B

ECHO File called 'test.bat' > out.txt

for /f"usebackq delims=" %%I in (`%MYCOMMAND%`) do (

ECHO %%I

ECHO %%I >> out.txt

)

pause

不,这不是实时,它等到%MYCOMMAND%完成并且在许多情况下失败。它跳过空行,以;开头的行失败,内容如/,ON,OFF或/?。但其余的有时可以工作:-)

试试这个:

dir> test.txt&type test.txt

尝试突出显示关键字并明确其格式有助于为其他人找到答案

你正在重复这个9岁的最佳答案,没有任何新的或更好的方法

@jeb至少我发了一个回复

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值