Пакетное копирование и переименование последнего файла из всех подкаталогов - PullRequest
0 голосов
/ 09 ноября 2018

Я застрял в этом сценарии, я пытаюсь написать, где я могу выполнить отдельные его части, я не могу соединить его.

В папке есть много подпапок с файлами .mp4, в которых новый файл генерируется очень часто в любом из подкаталогов. Сценарий должен иметь возможность циклически проходить по каждой папке, определять, какой файл из всех них является самым последним, и копировать его в указанную папку, переименовывая его в «Current.mp4»

То, что у меня пока есть, это беспорядок: Это скопирует файл в подкаталог, но не перебирает все остальные

REM Copy the most recent database backups from their folders 
@echo off

REM Copy File in one destination to another --------------------------------------------

setlocal
set srcDir=P:\
set destdir=D:\
set lastmod=



pushd %srcDir%
for /f "tokens=*" %%a in ('dir /S *.mp4 /D /b /o-d /a-d /t:c') do set lastmod=%%a
:::
copy "%lastmod%" "%destDir%"

Между тем, похоже, что этот цикл зациклен, но относится только к последнему файлу в каталоге .bat.

setlocal
set destdir=D:\
SET srcDir=P:\

pushd %srcDir%

FOR /F "delims=" %%I in ('dir /ad /s') do (
     pushd "%%~I"
     pushd %srcDir%
     FOR /F "delims=*" %%G IN ('DIR *=.mp4 /B /A:-D /O:D') DO SET NewestFile=%%G
     popd
)
popd

:::
copy "%NewestFile%" "%destdir%"

И, наконец, переименовав, я подумал, что смогу выяснить, как это сделать в последний раз. У меня был опыт работы с c ++, но пакет для меня относительно новый. Любая помощь будет оценена!

Спасибо

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Пакетный режим не подходит для сортировки по границам папок для общих атрибутов.

Я бы использовал для этого PowerShell, завернутый в пакет (не проверено):

:: Q:\Test\2018\11\09\SO_53230483.cmd
@echo off & setlocal
set "srcDir=P:\"
set "destdir=D:\"
set "lastmod="

For /f "usebackq delims=" %%a in (`
  powershell -NoP -C "(Get-ChildItem -Path '%srcDir%' -Filter '*.mp4' -File -Recurse | Sort-Object LastWriteTime -Descending | Select-Object -First 1).FullName"
`) Do Set "lastmod=%%a"

If defined lastmod (
   copy "%lastmod%" "%destDir%Current.mp4"
) else (
   Echo couldn't obtain lastmod file
)
0 голосов
/ 10 ноября 2018

WMIC можно использовать, если вы предпочитаете не использовать PowerShell:

@For /F "EOL=L Tokens=1*" %%A In ('
    "WMIC DataFile Where (Drive='P:' And Extension='mp4') Get LastModified,Name 2>Nul|Sort /R"
') Do @Call:CopyIt %%B&GoTo :X
:X
@Exit/B
:CopyIt
@If Not "%*"=="" Copy /Y "%*" "D:\current.mp4"&Exit/B

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

0 голосов
/ 09 ноября 2018

Еще не совсем, но я нашел, как сканировать ОДИН каталог и скопировать последний файл при его переименовании. Мне просто нужно, чтобы он сканировал все подкаталоги.

pushd P:\
for /f "tokens=*" %%a in ('dir /b /od') do set newest=%%a
copy "%newest%" "D:\Current.mp4
popd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...