批量创建日志文件以及条件

时间:2014-02-24 17:26:33

标签: batch-file logging if-statement

我需要在我正在处理的批处理脚本中添加一些函数。这些功能需要执行以下操作。

1)阅读并检查当前日期。

2)为日志文件设置自己的变量。

3)将日志文件命名如下(log%of the the week%.txt)示例:log24.txt

4)条件语句:如果日志文件超过30天,则覆盖它。如果不超过30天,请附加。

我们要做的是每次脚本运行时都将信息写入日志文件。

理想过程

脚本运行,看到今天没有设置日志文件。创建名为log24.txt的日志文件。该文件在当天被多次写入并被附加。

该脚本在第二天(2014年2月25日)运行,并创建一个名为log25.txt的日志文件。该文件在当天被多次写入并被附加。

记录轮换功能

脚本应检查过去30天内创建的所有文件。所以假设现在是03/24/14。该函数应该看到已经有一个log24.txt并用新的03/24/14覆盖该文件中的02/24/14内容。

这个想法是让这些日志可用30天,然后覆盖自己以防止它们变得太大。

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

试试这个:

@echo off
setlocal

Call :RotatingLog "This is a test"
exit /b

:RotatingLog <text>
for /f "tokens=2 delims==" %%a in (
'wmic OS Get localdatetime /value'
) do set "dt=%%a"
set "DD=%dt:~6,2%" & set "MM=%dt:~4,2%"
set "logfile=Log%DD%.txt"
if exist %logfile% (
  for %%a in (%logfile%) do (
    for /f "Tokens=1 delims=/" %%b in ("%%~ta") do (
      if %%b EQU %MM% (echo %~1>>%logfile%
      ) ELSE (
      echo %~1>%logfile%)
    )    
  )
)  
exit /b

答案 1 :(得分:0)

这只能从vista和后来的操作系统本地工作,因为robocopy用于日期操作,检索一天没有问题的Windows本地化(和日期变量内容结构)或需要管理员权限(wmic),以及确定是否需要旋转日志文件。当然,如果需要,您可以从Windows Server 2003资源工具包工具(downloadable from microsoft)获取robocopy的副本,以便在XP中使用。

此代码不用于连续执行,因为日检索和日志轮换仅在批量启动时完成。根据需要进行调整。

@echo off
    setlocal enableextensions disabledelayedexpansion

    :: retrieve log file name, adjust log path and rotate if necessary
    call :getLogFilename logFile
    set "logFile=%cd%\%logFile%"
    call :logRotate "%logFile%"

    :: Now, append to log as needed

    echo %time% Something >> "%logFile%"
    ( for /l %%a in (1 1 10) do echo %time% This is line numer %%a ) >> "%logFile%"

    endlocal
    exit /b

:getLogFilename returnVariable
    setlocal enableextensions enabledelayedexpansion
    set "day=" & for /f "tokens=*" %%a in ('robocopy^|find " : "') do for %%b in (%%a) do if not defined day ( set /a "day=%%b0/10" 2>nul & if !day!==0 set "day=")
    endlocal & if not "%~1"=="" set "%~1=log%day%.txt" & exit /b 

:logRotate logfile
    setlocal enableextensions
    robocopy "%~dp1." "%~dp1." "%~nx1" /njh /njs /ndl /is /minage:27 /l /nocopy | find ":\" >nul 
    if not errorlevel 1 break > "%~f1"
    endlocal & exit /b