我正在使用命令行脚本调整计算机上的多个设置。但是,我希望将整个输出也记录到 .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
该日志将不会被执行。