【问题标题】:Its possible to log all commands and their output to file? [cmd]是否可以将所有命令及其输出记录到文件中? [命令]
【发布时间】:2022-10-24 14:09:58
【问题描述】:

我正在尝试创建应用程序脚本的静默安装日志,我需要记录命令并输出到日志文件。

这就是它的样子——它是我的 .cmd 文件的一部分。 现在我需要为每一行创建变量(SET SETUP_0X=),但这个解决方案不是最好的,因为我可以编写更多命令。

SET LogPath=C:\Logs
SET LogFile=%LogPath%\App_Install.log 2>&1

call :Loguj --------------------------------------------------------------------------------
call :Loguj --------------------------------LOG-Install-START-------------------------------
call :Loguj --------------------------------------------------------------------------------
ECHO. >>%LogFile%

:Commands
SET SETUP_01=App.exe /S
SET SETUP_02=regedit /s SomeReg.reg
SET SETUP_03=DIR
SET SETUP_04=...


(...)
(goto Installation)

:Installation
call :Loguj %SETUP_01%
%SETUP_01% >> %LogFile%

call :Loguj %SETUP_02%
%SETUP_02% >> %LogFile%

call :Loguj %SETUP_03%
%SETUP_03% >> %LogFile%

call :Loguj %SETUP_04%
%SETUP_04% >> %LogFile%



:Finishing
Do other commands, but don't log this.

ECHO. >>%LogFile%
call :Loguj --------------------------------------------------------------------------------
call :Loguj --------------------------------LOG-Install-STOP--------------------------------
call :Loguj --------------------------------------------------------------------------------

因此可以改进它以不创建变量,而是记录从步骤:安装到步骤:完成到日志文件的所有命令和输出?

【问题讨论】:

    标签: windows batch-file logging cmd


    【解决方案1】:

    使用for /f 循环遍历变量并将整个内容放入代码块中,以一次性重定向所有输出:

    :Installation
    (for /f "tokens=2 delims==" %%a in ('set setup_') do (
      call :loguj %%a
      %%a
    )) >> %LogFile% 2>&1
    

    或不设置变量:

    :Installation
    (for  %%a in ("app.exe /s" "regedit /s somereg.reg" "dir" "...") do (
      call :loguj %%a
      %%~a
    )) >> %LogFile% 2>&1
    goto :eof
    :loguj
    echo --- %~1 ---
    

    注意:如果有很多命令,您可能会达到cmd 行限制。

    你可以把它写得更具可读性:

    :Installation
    (for  %%a in (
       "app.exe /s"
       "regedit /s somereg.reg"
       "dir"
       "..."
      ) do (
        call :loguj %%a
        %%~a
    )) > log.txt 2>&1
    

    【讨论】:

    • 你好@斯蒂芬。谢谢您的答复。您的解决方案只工作了一半,因为它的日志只输出。我正在努力使用该命令的 put to log 命令 + 输出。最简单的例子: Log Line1: DIR C: Log Line2: Output of above command
    • 第一个 sn-p 确实(我对第二个 sn-p 的 :loguj 部分很懒惰)。另一种方法是在打开( 之前将echo on 更改为for@for@echo off
    • 你说的对。我之前错过的第一个选项几乎可以工作。我几乎写了,因为当我在一个日志文件中定义了所有内容时,然后在 CMD 窗口上我会显示消息“该进程无法访问该文件,因为它正在被另一个进程使用”并且在日志中只存储输出(没有命令),所以我通过从你的第一个 sn-p 创建第二个日志文件和最后一行来为此做了一个小的“解决方法”:“)) >> %LogPath%App_Install_Details.log 2>&1”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多