2014-02-24 53 views
0

我需要在批處理腳本中添加一些函數,我已經在處理這些文件。這些功能需要執行以下操作。創建日誌文件以及批處理條件

1)閱讀並檢查當前日期。

2)爲日誌文件自己設置一個變量。

3)將日誌文件名如下(日誌%日的星期幾%.txt)的例子:log24.txt

4)條件語句:如果日誌文件是超過30天,然後覆蓋它。如果不超過30天,請附加到它。

我們試圖做的是每次腳本運行時將信息寫入日誌文件。

運行腳本理想的過程,看到有今天沒有設置日誌文件。創建一個名爲log24.txt的日誌文件。該文件在當天被寫入多次並被追加。

腳本第二天運行(02/25/14),並創建一個名爲log25.txt的日誌文件。該文件在當天被寫入多次並被追加。

登錄旋轉功能

腳本應該檢查在過去30天內創建的任何文件。現在假設它現在是2014年3月24日。該函數應該看到已經有一個log24.txt文件,並用新的03/24/14覆蓋該文件中的02/24/14內容。

想法是讓這些日誌可用30天,然後覆蓋自己以防止它們變得太大。

任何想法,將不勝感激。

回答

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 
0

這隻會從Vista本身及更高版本的操作系統,如ROBOCOPY用於日期操作,以獲取當天的數量沒有問題與Windows本地化(和日期變量內容structute )或所需的管理權限(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