2015-05-20 4 views
0

У меня есть пакетный файл, который я бы хотел получить в новом «манифестном» файле, поэтому я надеялся, что смогу использовать цикл for для этого, но я не уверен в правильном синтаксисе.Получить абсолютный путь к последнему файлу, содержащему строку в имени файла в пакетном скрипте

Это то, что у меня есть:

for /R %imagePath% %%F in (*.manifest.*) do (set manFile=%%F) 

Что делает правильные вещи, чтобы вернуться «C: /some/path/to/file.manifest.ext», но не обязательно самый новый. Я вижу другие вопросы, подобные этому, которые используют dir, но тогда я не получаю весь путь. Моя попытка сделать это с dir выглядит следующим образом:

for /R %imagePath% %%F in ('dir /od *.manifest.*.*') do (set manFile=%%F) 

Это не дает мне выход я ожидал.

Каков наилучший способ для этого?

ответ

0
set "manFile=" 
for /f "tokens=2,*" %%a in (' 
    robocopy "%imagePath%" "%temp%" *.manifest.* /is /l /nocopy /s /njh /njs /ndl /nc /ns /ts 
    ^| sort /r 
') do if not defined manFile set "manFile=%%b" 

Это использует for /f для обработки выходных данных robocopy команды, которая будет генерировать список совпадающих файлов с UTC времени, который будет обратный отсортированных поэтому новейший файл будет первым в списке.

+0

Это потрясающе. Я не думаю, что когда-либо думал использовать «robocopy» для перечисления файлов. Спасибо огромное! –

0

Решение MC ND является умным. Но когда я попробовал это, используя «.», в качестве файловой маски я получил неправильный результат. Причины этого в том, что robocopy перечислены соответствующие файлы от и исходная папка и целевая папка (фиктивная), в данном случае %TEMP%. Вы можете исправить это, добавив переключатель /xx в robocopy или просто используйте пустую целевую папку. Поскольку я не уверен на 100%, что переключатель /xx всегда будет работать, я прибегал к указанию случайного имени для папки назначения (которая, надеюсь, не будет существовать).

Второй недостаток исходного кода заключается в том, что цикл FOR будет излишне выполнять до конца списка файлов, которые могут быть произвольными.

Следующий код исправляет проблему целевой папки, ярлыки цикла после того, как результат получен, а в экспорте аддитивных как имя файла и временную метку младшего файла в дереве:

@echo off 
setlocal 

set "srcpath=%~1" 
if not DEFINED srcpath set srcpath=%CD% 
set /A skip=%2 - 1 
set opt= 
if DEFINED skip if %skip%0 GTR 0 set "opt=skip=%skip%" 

set MASK=*.manifest.* 
for /f "%opt% tokens=1,2*" %%a in (' 
    robocopy "%srcpath%" %RANDOM%_%RANDOM% %MASK% /l /s /ts /njh /njs /ndl /nc /ns ^| sort /r 
') do set "tstamp=%%a %%b" & set "youngestfile=%%c" & goto :ex 

:ex 
echo %youngestfile% %tstamp% 

Скрипт может принимать до 2 аргументов. Первый аргумент - это исходная папка, которая по умолчанию относится к текущей папке, если она опущена. Второй аргумент является числовым и позволяет искать n-й младший файл. Так, например, «lastfile. 2» вернет второй самый младший файл в дереве, укорененном в текущей папке. Это побочный эффект цикла FOR, начинающегося в верхней части списка с самыми младшими файлами.