Пакетный скрипт для выбора имени файла из текстового файла и поиска последнего файла
Сценарий: у нас есть несколько выпусков продукта, и для каждого выпуска в главной папке создается папка. Файл справки изменяется в различных выпусках. У меня есть все имена файлов справки, перечисленные в текстовом файле. Мне нужен скрипт для:
- Взять каждое имя файла из файла filenames.txt
- Поиск файла по этому имени во всем каталоге (во всех выпусках)
- Найти последний файл
- Скопируйте его в указанную папку
Я получил помощь от различных частей кода, которые я нашел в 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