Пакетный скрипт для выбора имени файла из текстового файла и поиска последнего файла

Сценарий: у нас есть несколько выпусков продукта, и для каждого выпуска в главной папке создается папка. Файл справки изменяется в различных выпусках. У меня есть все имена файлов справки, перечисленные в текстовом файле. Мне нужен скрипт для:

  1. Взять каждое имя файла из файла filenames.txt
  2. Поиск файла по этому имени во всем каталоге (во всех выпусках)
  3. Найти последний файл
  4. Скопируйте его в указанную папку

Я получил помощь от различных частей кода, которые я нашел в Stack Overflow, и объединил их, чтобы получить этот код:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
echo.
FOR /F "usebackq delims=" %%a in ("filenames.txt") do (
      SET "x=%%a"
      ECHO '!x!'
      SET FFPath=C:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLN
      SET NewPath=C:\Lavanya\extracted
      SET NewestDate=20160824
      ECHO Recursively searching %FFPath%
      FOR /F %%I in ('DIR %FFPath%\ !x! /a:-d /s /b') DO (
          SET FullDate=%%~tI
          ECHO %FFPath%
          REM Set CurrDate to yyyymmdd format.  Note:  Will fail if regional settings changed.
          SET CurrDate=!FullDate:~6,4!!FullDate:~0,2!!FullDate:~3,2!

          If !CurrDate! gtr !NewestDate! (
              SET NewestDate=!CurrDate!
              SET NewestFile=%%~fI )
          ECHO Copying %NewestFile% to %NewPath%
          ECHO.
          COPY /Y "%NewestFile%" "%NewPath%"
          ECHO. 
      )
)
PAUSE

Этот код не работает. И я не могу понять ошибку.

1 ответ

Вот скрипт для поиска последнего измененного файла, используя wmic команда для получения даты / времени последнего изменения независимо от локали (например, 20160824115500.000000+060).

Таким образом, для каждого имени файла читать из списка файлов .\filenames.txt, дерево каталогов направляется в каталог C:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLN выполняется поиск соответствующих файлов рекурсивно, и собирается соответствующая отметка даты / времени изменения. Из-за своего формата, просто больше, чем (GTR) можно сделать сравнение, определив, действительно ли это более поздний момент времени, чем кешированный; если критерий выполняется, кэш обновляется соответствующим образом.

Верхний регистр REM а также ECHO Команды представляют собой заполнители только для реального действия над файлами. Расширьте сценарий там, как вам нравится. переменная !LASTFILE! содержит полный путь к каждому найденному файлу

Итак, вот код:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "LOCATION=C:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLN"
set "FILELIST=.\filenames.txt"
set "WMICPROP=LastModified" & rem // {CreationDate | LastAccessed | LastModified}

pushd "%LOCATION%" || exit /B 1
for /F "usebackq eol=| delims=" %%L in ("%FILELIST%") do (
    set "LASTFILE="
    set "LASTFAGE=00000000000000.000000+000"
    for /F "eol=| delims=" %%F in ('dir /B /S /A:-D "%%~L"') do (
        set "FILE=%%F"
        setlocal EnableDelayedExpansion
        set "FILE=!FILE:\=\\!"
        for /F "tokens=2 delims==" %%J in ('
            2^> nul wmic DataFile WHERE ^(Name^="!FILE!"^) GET %WMICPROP% /VALUE ^|^| ^
                2^> nul wmic DataFile WHERE Name^="!FILE!" GET %WMICPROP% /VALUE
        ') do for /F %%I in ("%%J") do (
            endlocal
            set "FAGE=%%I"
            setlocal EnableDelayedExpansion
            if !FAGE! GTR !LASTFAGE! (
                endlocal
                set "LASTFILE=%%F"
                set "LASTFAGE=%%I"
                setlocal EnableDelayedExpansion
            )
        )
        endlocal
    )
    if defined LASTFILE (
        setlocal EnableDelayedExpansion

        REM Do whatever you want with the file here...
        ECHO Newest file: "!LASTFILE!"

        endlocal
    )
)
popd

endlocal
exit /B
Другие вопросы по тегам