【问题标题】:How to get files that have been added/modifed in a batch file如何获取已在批处理文件中添加/修改的文件
【发布时间】:2012-09-27 19:27:40
【问题描述】:

我有以下批处理文件,它连接文件夹中以 .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

【问题讨论】:

    标签: windows shell command-line


    【解决方案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%
    

    第二部分稍微复杂一点,需要多行命令,延迟扩展和比较:

    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
    

    确保不要在多行部分输入任何额外的空格。希望这会有所帮助。

    【讨论】:

    • 除了最后一行(If 子句)外,我已经完成了大部分工作。我将“setlocal enabledelayedexpansion”更改为“setlocal enableextensions enabledelayedexpansion”,并在 if 之后添加了“endlocal”。 InstallScript.sql 中没有添加任何内容
    • @ChrisL:我的建议:添加一些echo 调试命令,检查值(月/日的顺序可能因您的本地设置而异),并使用固定测试“IF”子句值,看看它是否正常工作。
    • 我发现了问题,显然日期时间/数字太长 -> 数字中的 YYYYMMDDHHMM 太长,LSS 无法测试,所以我只将年份缩短为两位数。 YYMMDDHHMM,一切似乎都正常。但是,我在上午/下午的 12 小时内恢复了小时 (HH)
    • 我试过这个:如果不是 %SvnFileDate:PM=%==%SvnFileDate% set hours= hours+12 (from here: stackoverflow.com/questions/7005951/…) 如果字符串中存在“PM”添加12 到小时。
    • @ChrisL:您是否在数字周围添加了引号“,就像我上面写的那样?没有引号,我以前遇到过和您一样的问题。AFAIK 使用引号导致命令外壳使用字符串比较而不是数字比较,只要字符串长度相等,这是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多