批处理文件命令,用于比较最新的文件和输出差异

时间:2014-02-04 12:31:56

标签: batch-file cmd compare diff

我有以下代码,有人给了我但我不知道如何将它放在一个bat文件中,以便它成功运行。

目的是在c:/中找到最新的(最后修改过的)文件,并将其与c:/2.txt进行比较,并将差异输出到c:/786.txt

 cd /d c:\
 for /f %%a in ('dir /b /o-d /a-d /tw') do (set latest=%%a & goto :eof)

 for /f "tokens=1*" %%a in (
  'diff c:\%latest% c:\2.txt ^| findstr /r /c:"^<" /c:"^>"'
 ) do @echo %%b >>c:\786.txt

有人可以帮我把这段代码放在一起。

1 个答案:

答案 0 :(得分:1)

cd /d c:\
set "latest="
for /f %%a in ('dir /b /o-d /a-d /tw') do (set "latest=%%a" & goto :found)
:found
if not defined latest exit /b
for /f "tokens=1,*" %%a in (
    'diff "c:\%latest%" "c:\2.txt" ^| findstr /r /c:"^<" /c:"^>"'
) do (
    >> "c:\786.txt" echo(%%b
)

按日期降序排序,最新文件是第一个,因此在第一次迭代时分配文件名并退出for循环。

然后检查是否找到了任何文件。它不是,脚本的结尾

如果我们有一个文件,请将最新文件与指定文件进行比较,然后将过滤后的行发送到最终文件。

编辑 - 重构代码以使其更有用并适应评论。搜索文件夹中的最后一个文件移动到子例程。

@echo off

    setlocal enableextensions disabledelayedexpansion

    call :getLatestFileInFolder "c:\" latestC
    call :getLatestFileInFolder "d:\" latestD

    if not defined latestC ( echo NO File in C & exit /b )
    if not defined latestD ( echo NO File in D & exit /b )

    for /f "tokens=1,*" %%a in (
        'diff "%latestC%" "%latestD%" ^| findstr /r /c:"^<" /c:"^>"'
    ) do (
        >> "c:\786.txt" echo(%%b
    )

    endlocal
    exit /b

:getLatestFileInFolder folderToSearch variableToReturn
    setlocal
    set "folder=%~1" & if not defined folder set "folder=%cd%"
    set "latest="
    pushd "%folder%"
    for /f "tokens=*" %%a in ('dir /b /o-d /a-d /tw 2^>nul') do (set "latest=%%~fa" & goto :latestFileFound)
    :latestFileFound
    popd
    endlocal & set "%~2=%latest%" & goto :eof