记录整个批处理文件的输出


11

我正在使用命令行脚本来调整计算机上的多个设置。但是,我希望将整个输出也记录到.txt或.log文件中。

当我使用日志系统的基本知识时,它将把输出放在一个文件中,但实际上不执行它。就我而言,我需要执行它,然后登录到文件中以供以后参考。

有人可以告诉我该怎么做吗?

提前致谢!登普西


您甚至都没有指定操作系统!
迈克尔·汉普顿

Answers:


10

如果问题要求脚本“执行”并且整个批处理文件输出到Windows 8.1中的日志文件,那么这里是简单的答案:

在批处理文件的开头添加此内容...

@echo off
set LOGFILE=batch.log
call :LOG > %LOGFILE%
exit /B

:LOG
[ your script goes here ]

非常好,谢谢!(当然,这里实际上并不需要%LOGFILE%。:P)
Andrew

1
我的脚本提出了一个问题-如果使用此命令,我看不到它。如何记录所有内容并在执行时在屏幕上查看?
西蒙(Simon)

是的,您将如何操作以便在屏幕上看到它?
karl-police

3

在您的问题中,您提到:

“ ...它将把输出放在一个文件中,但实际上不执行它。就我而言,我需要将其执行然后登录到文件中以供以后参考。”

既然您说程序正在运行并且其输出正在放入文件中,所以我认为您的意思可能是“ displayed”而不是“ executed”

如果这不是您的意思,那么如果对它进行更好的解释(也许提供一些示例输出),可能会有所帮助。

无论如何,我会发布此答案,以防其他人认为此问题/答案有帮助。

因此,基本上,这听起来像是希望将脚本的输出捕获到文件中,并且还希望在脚本运行时在屏幕上看到脚本的输出。

(tl; dr版本:使用wintee,如下所示:

script 2>&1 | wtee logfile.txt


在本文中,我将使用一个小的测试批处理文件,但是您的脚本可能既大又复杂,也可能很简单:

C:\>type a.cmd
@echo off

echo Command: "dir /b a*"
dir /b a*
echo.

echo Command: "dir /b non-existant-file"
dir /b non-existant-file
echo.


这是运行此批处理脚本时发生的情况:

C:\>a.cmd
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

请注意,在测试脚本中,“ dir”命令的第一次执行成功,而第二次失败。我这样做只是为了显示运行脚本时“错误消息”会发生什么。

如果我运行脚本并使用重定向(“>”)捕获输出,我将看到此信息

C:\>a.cmd > log.txt
File Not Found

C:\>type log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"

C:\>

请注意,运行脚本时,屏幕上显示错误消息“找不到文件”,但实际上未捕获到文件中。这是因为“>”捕获已发送到STDOUT流的“正常输出”。通常将“错误消息”发送到STDERR流。

要捕获“正常输出”和“错误消息”,还需要捕获STDERR流,该流由以下命令中“ 2>&1”中的“ 2”指示:

C:\>a.cmd > log.txt 2>&1
C:\>type log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

在unix中,有一个标准命令: "tee"

使用“ tee”命令,您可以捕获程序的输出,也可以同时将输出显示在屏幕上。

Windows并不标配“ tee”命令,但是您可以在Windows上下载免费版本的“ tee”: wintee。下载的程序名为:"wtee.exe"

如下所示,使用“ wtee.exe”程序。

这将捕获脚本输出到"log.txt"以前命名的文件,并且还将在脚本运行时将输出显示在屏幕上:

C:\>a.cmd 2>&1 | wtee log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

C:\>type log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

0

该脚本将执行ls并将其输出记录到名为log.txt的文件中:

exec >log.txt 2>&1
ls

该日志将不会执行。


1
请注意,这是假设使用Unix / Linux,但是我的猜测是OP谈论Windows。它也没有运行脚本,而是记录您输入的命令的输出,并忽略了如何停止疯狂的关键信息……
Sven 2014年

我确实在谈论Windows。不过谢谢:)
Dempsey FoxDie Van Assche 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.