(tl;dr 版本:使用温蒂, 像这样:

(tl;dr 版本:使用温蒂, 像这样:

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

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

有人能告诉我该怎么做吗?

答案1

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

将其包含在批处理文件的开始处...

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

:LOG
[ your script goes here ]

答案2

在您的问题中,您提到:

“...它会将输出放入文件中但实际上并不执行它。就我而言,我需要执行它然后将其记录到文件中以供日后参考。”

既然你说程序正在运行,并且它的输出正在被放入文件中,我想你可能是指“显示”, 代替“处决”

如果那不是您的意思,那么如果能提供更好的解释(或许附带一些示例输出),可能会有所帮助。

无论如何,我都会发布这个答案,以防其他人发现这个问题/答案有用。

所以,基本上,这听起来就像您希望将脚本的输出捕获到文件中,并且还能够在脚本运行时在屏幕上看到脚本的输出。

(tl;dr 版本:使用温蒂, 像这样:

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”“2>&1”在此处的命令中:

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”命令,您可以捕获程序的输出,同时将输出显示到屏幕上。

“tee”命令不是Windows的标准命令,但您可以在此处下载适用于Windows的“tee”免费版本: 温蒂。下载的程序名为:"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

答案3

:: befor your bat code use the lines below ::

@echo off && setlocal enabledelayedexpansion

if "!_log!/" == "/" (
     set "_log=%temp%\log_bat.log" 
     2>&1 call "%~f0" >>"!_log!" & exit /b
    )else endlocal

:: your bat code start from here ::

答案4

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

exec >log.txt 2>&1
ls

该日志将不会被执行。

相关内容