2014-02-25 110 views
0

所以我有一個小的腳本,我正在開發將所有最新日誌從幾個目錄一起拉下來的基礎。這個過程的僞代碼如下:批處理腳本:獲取文件,比較日期和獲取文件名(從最新修改日期)

  • 去父目錄
  • 對於每一個目錄檢查該文件夾「日誌」中是否存在
    • IF「日誌」是到該目錄目前去
    • VAR FNAME VAR FDATE(最最新文件)
    • 對於每一個文件F中的 「日誌」
      • IF FNAME是空FNAME = F FDATE =的Fd
      • ELSE IF的Fd> FDATE FNAME = F FDATE =的Fd
    • END FOR
  • 複印日誌文件(FNAME)到 「所有日誌」
  • END FOR

下面是迄今爲止我已經得到的批處理代碼的摘錄,它涵蓋了比較文件日期的主要過程:

FOR /d %%d in (*) DO (
    CD %%d 

    IF /I EXIST logs (
    CD logs 

    SET fname 
    SET fdate 

    FOR /f %%f in ('dir /b !CD!\!d!') DO (
     IF [%fname%]==[] (
     %fname%=%%f 
     %fdate%=%%~tf 
    ) ELSE (
     REM Compare modified dates to determine which is the latest file. 
     IF %%~tf GTR %fdate% (
      %fdate%=%%~tf 
      %fname%=%%f 
     ) 
    ) 
    REM Copy the log file ... 
    REM ... 
    ) 
    CD %pdir% 
) 

:END 
CD %wdir% 

我想我已經開始跑步了,但它並不完美,我遇到的麻煩是,當%%〜tf被調用時,文件實際上是打開的;並且存儲和比較日期的結構已關閉(我正在考慮作爲程序員而不是腳本編寫者!)。有人可以請這些問題的建議,並提供任何反饋意見等。

回答

1

這可以大大簡化。試試這個:

@echo off 
setlocal enabledelayedexpansion 

for /d %%a in (*) do (
    if /i exist !cd!\%%a\logs (
    Call :getlatestfile "!cd!\%%a\logs" latest 
    echo copy "%%a\logs\!latest!" "C:\path\to\copy\to" 
) 
) 
exit /b 

:getlatestfile <path> <return> 
setlocal 
for /f %%b in ('dir "%~1" /b /o-d /tw') do set "latest=%%b" & goto :out 
:out 
endlocal & set "%~2=%latest%" 

一旦你看到可接受的結果,從複製行中刪除回聲。

+0

感謝您的回覆,它確實大大簡化了,並進一步幫助我進一步理解批處理腳本編寫中的方法。再次感謝您的幫助。 ...您可能也注意到我更新了代碼 - 因爲「複製」命令沒有指向文件的正確位置。 – user1092809

+0

我可以問最後一個問題嗎?正如我現在想要將所有文件合併在一起,我將如何去實現這一目標?到目前爲止,我已經嘗試將副本更改爲指向文件而不是目錄,但是這只是使用找到的最後一個日誌文件更新文件,而不是附加它們。 – user1092809

+0

如果所有的文件都具有相同的擴展名,你可以執行'copy log * .txt newlogfile.txt' –

相關問題