Копировать структуру папок, но только последний файл - PullRequest
0 голосов
/ 01 июля 2019

У меня есть много пронумерованных каталогов, каждый из которых содержит набор файлов:

Folder_abc  
   index.xml
   000001.doc
   000002.doc
   000003.doc
   000004.doc

Folder_bdf
   index.xml
   000001.xls
   000002.xls 

Folder_...

желаемый результат (только последняя версия)

Folder_abc
  index.xml
  000004.doc
Folder_bdf
  index.xml
  000002.xls 
Folder_...

В каждом каталоге есть index.xml, это, конечно, можно скопировать с robocopy, отдельно при необходимости .

Я ищу решение в или , идеально было бы использовать , хотя я не вижу подхода.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

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

@echo off
rem // Define constants here:
set "ROOT=D:\Path\To\Source"
set "DEST=D:\Path\To\Destination"
set "NAME=Folder_*"  & rem // (name/mask of source sub-directories)
set "FILE=index.xml" & rem // (name of file that must always be copied)

rem // Loop over all sub-directories in the root source directory:
for /D %%D in ("%ROOT%\%NAME%") do (
    rem // Reset variable that will hold name of file to copy later:
    set "LAST="
    rem /* Get all files in sorted manner, except the one that must always be copied;
    rem    store the name in a variable, which will hold the last file name finally;
    rem    `/O:D` regards the last modification date; add `/T:C` for the creation date;
    rem    to sort by name rather than by date, replace `/O:D` by `/O:N` or `/O:NE`: */
    for /F "delims= eol=|" %%F in ('
        2^> nul dir /B /A:-D /O:D "%%~D\*.*" ^| findstr /I /V /C:"%FILE%"
    ') do set "LAST=%%F"
    rem /* Create destination sub-directory with the same name as the source sub-directory;
    rem    potential error message in case the sub-directory already exists are suppressed: */
    2> nul md "%DEST%\%%~nxD"
    rem // Copy the file that always needs to be copied, if there is such:
    if exist "%%~D\%FILE%" copy /-Y "%%~D\%FILE%" "%DEST%\%%~nxD\"
    rem // Copy the previously determined last file, if any has been found:
    if defined LAST call copy /-Y "%%~D\%%LAST%%" "%DEST%\%%~nxD\"
)
0 голосов
/ 02 июля 2019

Я предполагаю, что самый последний файл может иметь произвольное число дней?Это правда?

Если все ваши каталоги имеют только 1 слой в одной корневой папке, то:

 @(
   SetLocal EnableDelayedExpansion
   Echo Off
 )
 SET "_Root=C:\Some\Folder\Path"
 SET "_NewRoot=C:\Some\New\Folder"

 For /D %%A In ("_Root") Do (
   MD "%_NewRoot%\%%A"
   Copy  "%_Root%\%%A\index.xml" "%_NewRoot%\%%A\index.xml"
   For /F "Tokens=*" %%a IN ('DIR /A-D /B /OD "_Root\%%A\" ^| FindStr /I /V /C:"index\.xml$"') Do (
     SET "_File=%%a"
   )
  Copy  "%_Root%\%%A\!_File!" "%_NewRoot%\%%A\!_File!"
)

Итак, по сути, нам нужно зациклить структуру каталогов и установитьзначение переменной _File для найденных файлов и, если мы упорядочим их по дате в порядке возрастания, последним найденным значением будет самая новая папка, поэтому, когда мы выходим из этого цикла, переменная заполняется требуемым значением.

, так как индекс всегда нужен, я сразу создаю папки и копирую индекс и создаю вторую копию файла только после того, как найдено совпадение, мы игнорируем «Index.xml», так как он уже скопирован и не является соответствующим новымв любом случае файл для совпадения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...