2012-09-27 27 views
1

我有以下批處理文件,它將具有.sql結尾的文件夾中的所有文件連接起來。如何獲取在批處理文件中添加/修改過的文件

set func=%~dp0%Stored Procedures\*.sql 
for %%i in (%func%) do type "%%i" >>InstallScript.sql 

我們使用SVN作爲我們的倉庫,我們使用分支。目前該腳本連接了所有的.sql文件,甚至連那些沒有改變的文件。我想改變它,所以它只連接在創建分支後修改和/或創建的文件。我們可以通過查看每個文件夾中的.svn文件夾的日期時間(有一個存儲過程,視圖,函數子文件夾)來實現。但我不知道如何用批處理文件來做到這一點。

理想情況下是這樣的(僞代碼):

set func=%~dp0%Stored Procedures\*.sql 
set branchDateTime=GetDateTime(%~dp0%.svn) <- Gets the datetime when the .svn folder was created 

for %%i in (%func%) 
{ 
    if(%%i.LastModifiedOrCreated > branchDateTime) 
    do type "%%i" >> InstallScript.sql 
} 

感謝布朗博士,我最終得到這個(任何人需要類似的東西):

@echo off 
cls 

echo --Install Script Generated For MMH Database %DATE% %TIME% > InstallScript.sql 

set branch=%~dp0.svn 
for %%i in (%branch%) do set SvnFileDate=%%~ti 
set year=%SvnFileDate:~8,2% 
set month=%SvnFileDate:~0,2% 
set day=%SvnFileDate:~3,2% 
set hours=%SvnFileDate:~11,2% 
set minutes=%SvnFileDate:~14,2% 
set datetime=%year%%month%%day%%hours%%minutes% 

:: Folder for Functions 
set func=%~dp0%Functions\*.sql 

setlocal enableextensions enabledelayedexpansion 

@for %%i in (%func%) do set FuncFileDate=%%~ti&^
set year2=!FuncFileDate:~8,2!&^
set month2=!FuncFileDate:~0,2!&^
set day2=!FuncFileDate:~3,2!&^
set hours2=!FuncFileDate:~11,2!&^
set minutes2=!FuncFileDate:~14,2!&^
set datetime2=!year2!!month2!!day2!!hours2!!minutes2!&^

if "!datetime!" LSS "!datetime2!" type "%%i" >> InstallScript.sql 

:: I would add similiar code for each folder, one for Views, Stored Procs, etc... 

endlocal 


pause 

回答

1

的第一步,獲取.svn文件夾的日期時間如下所示:

for %%i in (.svn) do set FileDate=%%~ti 

您可能必須重新排序該行以相當的日期 - 時間格式的結果:

for %%i in (.svn) do set FileDate=%%~ti 
set year=%FileDate:~6,4% 
set month=%FileDate:~3,2% 
set day=%FileDate:~0,2% 
set hours=%FileDate:~11,2% 
set minutes=%FileDate:~14,2% 
set datetime=%year%%month%%day%%hours%%minutes% 
echo %datetime% 

第二部分是一點點更復雜,你需要mutiline命令,推遲擴張和比較:

setlocal enabledelayedexpansion 

@for %%i in (*.sql) do set FileDate=%%~ti&^
set year2=!FileDate:~6,4!&^
set month2=!FileDate:~3,2!&^
set day2=!FileDate:~0,2!&^
set hours2=!FileDate:~11,2!&^
set minutes2=!FileDate:~14,2!&^
set datetime2=!year2!!month2!!day2!!hours2!!minutes2!&^
if "!datetime!" LSS "!datetime2!" type "%%i" >> InstallScript.sql 

確保不在多行部分輸入任何額外的空格。希望這可以幫助。

+0

除了最後一行(If子句)之外,我已經掌握了大部分工作。我將「setlocal enabledelayedexpansion」更改爲「setlocal enableextensions enabledelayedexpansion」,並在if後添加「endlocal」。什麼都沒有被添加到InstallScript.sql –

+0

@ChrisL:我的建議:添加一些'echo'命令進行調試,檢查值(月/日的順序可能取決於您的本地設置),並測試「IF」子句固定值來查看它是否按原樣工作。 –

+0

我發現這個問題,顯然日期時間/數字太長 - >數字中的YYYYMMDDHHMM對於LSS測試來說太長,所以我只將年份縮短爲兩位數。 YYMMDDHHMM和一切似乎工作。不過,我在12小時內收到AM/PM的小時(HH) –

相關問題