批处理脚本将日志记录在文件中,并在屏幕上显示

14 浏览
0 Comments

批处理脚本将日志记录在文件中,并在屏幕上显示

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

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

我该如何编写一个命令,在Windows命令提示符中既显示输出,又将输出重定向到文件,类似于Unix上的tee命令?

0
0 Comments

问题:如何将批处理脚本的日志同时输出到文件和屏幕上?

原因:用户在Stack Overflow上提问,希望能够将批处理脚本的日志同时输出到文件和屏幕上。

解决方法:根据回答,可以使用PowerShell来实现这个需求。可以使用以下命令将输出重定向到文件并同时在屏幕上显示:

powershell "dir | tee test.txt"

如果要重定向当前目录下可执行文件的输出,需要在文件名前添加`.\`,例如:

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

这是最接近的答案,可以在大多数计算机和服务器上使用默认安装的PowerShell来实现。

这是最好的答案!简单且“开箱即用”。

尽管它可以工作,但是文件中不会包含所有的输出。

可以使用以下命令来更好地演示tee命令的作用:

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"

使用`2>&1`会导致任何stderr输出显示为“NativeCommandError”,与实际输出混在一起。为了避免这种情况,请使用以下命令将错误记录转换为纯文本,然后再发送给`tee`:

powershell ".\something.exe 2>&1 | foreach {\"$_\"} | tee test.txt"

这样可以在Windows 10中将输出写入文件。

根据经验,`powershell "ping -n 10 localhost | tee test.txt"`会实时返回输出。但是`powershell "&\"C:\Program Files\Windows Defender\MpCmdRun.exe\" -Scan -ScanType 3 -File "%CD%" -DisableRemediation | tee -FilePath antivirusLog.txt"`不会,它只在扫描完成后返回输出。(为什么会这样?也许`tee`命令在传递输出之前会以某种方式缓存输出?)

我的评论是不正确的(已删除),我的实验有缺陷。如果源进程刷新其输出流,`Tee`会立即获取数据块。也许你的示例中的进程不会刷新输出流?例如,在Python中:`print("foo", flush=True)`。

您还可以将此封装在一个单行批处理文件中,例如`tee.bat`:

-command "$Input | tee '%~f1'"

然后将其添加到您的路径中。然后您只需要使用以下命令:

do_the_thing.exe | tee ".\Zhu Li.log"

以上是关于如何在批处理脚本中将日志同时输出到文件和屏幕上的解决方法。

0
0 Comments

问题:如何在批处理脚本中将日志输出同时写入文件和屏幕上?

原因:默认情况下,批处理脚本只能将输出重定向到文件或屏幕上的其中一个。使用管道(|)将输出重定向到文件并显示在屏幕上,但是输出会在命令完成后显示,而不是在生成数据时显示。此外,对于需要从标准输入读取输入的命令,使用管道会导致命令无法继续执行。

解决方法:可以使用以下命令实现将日志输出同时写入文件和屏幕上:

dir > a.txt & type a.txt

其中,`dir`是需要重定向输出的命令,`a.txt`是存储输出的文件。这个命令会将输出重定向到文件,并使用`type`命令将文件内容显示在屏幕上。这样可以同时实现输出到文件和屏幕的效果。

对于某些命令(如`ping`或`7z.exe`)的输出,需要使用`&`代替`|`,例如:

ping www.example.com > output.txt & type output.txt

然而,对于需要交互输入的命令,如`chkdsk /f c: > log.txt & type log.txt`,该方法无法正常工作,因为系统报告文件被其他进程锁定。

此外,该方法似乎无法处理标准错误输出(stderr)。标准错误输出会打印到控制台上,但不会保存在文件中。要将标准错误输出与标准输出混合保存到文件中,可以使用以下命令:

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

使用`2>&1`将标准错误输出重定向到标准输出,然后将输出重定向到文件,并使用`type`命令将文件内容显示在屏幕上。

对于长时间输出,使用管道(|)可能无法完整打印重定向的内容,因为管道不会等待命令完成。在这种情况下,可以使用`&`代替管道,因为`&`会等待命令完成。例如:

dir > a.txt & type a.txt

然而,这种方法仍然会导致输出在命令完成后显示,而不是在生成数据时显示。

如果希望在将输出写入日志文件的同时实时显示在屏幕上,可以使用像`tee`这样的工具。但这需要在Windows上安装类似于Linux的实用工具包,因为在Windows本身没有原生支持。

需要注意的是,如果命令的返回值(errorlevel)对脚本很重要,使用上述方法将输出传递给`type`命令可能会覆盖返回值。例如,如果第一个命令返回非零值,使用这种方法仍会返回0,因为文件存在。

总结起来,要在批处理脚本中将日志输出同时写入文件和屏幕上,可以使用重定向操作符(`>`和`2>&1`)将输出重定向到文件,并使用`type`命令将文件内容显示在屏幕上。但这样做会导致输出在命令完成后显示,而不是在生成数据时显示。要实现实时显示输出,需要使用第三方工具。

0