Пакетное резервное копирование файлов в Windows, воссоздание вложенных папок / файлов - PullRequest
0 голосов
/ 26 марта 2012

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

Проблема в том, что я хотел бы, чтобы командный файл воссоздал структуру файла в папке A, и я не совсем уверен, как это сделать. Вот код:

echo off
echo REM :- THE FOLLOWING FILES ARE OLDER THAN 7 DAYS AND CAN BE MOVED TO BACKUP -:
pause
forfiles /p c:\test\one /s /m *.gif  /c "cmd /c dir /b/s/t:w @path"
echo.
echo REM :- CONTINUE TO MOVE THOSE FILES TO THE BACKUP LOCATION -:
pause
forfiles /p c:\test\one /s /m *.gif  /c "cmd /c mkdir c:\test\two\@relpath"
echo.
pause
forfiles /p c:\test\one /s /m *.gif  /c "cmd /c copy /-y @path c:\test\two\@relpath"
pause
echo.
echo REM :- THE FOLLOWING FILES EXIST IN THE BACKUP LOCATION -:
echo.
pause
dir "c:\test\two" /a/s/b /o:gn
echo.
echo REM :- CONTINUE TO DELETE THOSE BACKUPS -:
pause
rd /s "c:\test\two"
echo.
pause

Проблема в том, что @relpath, кажется, берет весь путь и имя файла, поэтому в папке B я получаю каждое имя файла в папке с собственным именем (например, «filename.gif» внутри папки с тем же именем). Как я могу удалить имя файла из пути, создать файловую структуру в папке B на основе этого, а затем скопировать файл в правильное место?

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Вы можете использовать xcopy для воссоздания структуры файла с помощью переключателя /T.Вам также потребуется использовать переключатель /E для копирования пустых каталогов и подкаталогов.

В командной строке cmd введите xcopy /? для получения справки по всем коммутаторам.Надеюсь, это поможет!

0 голосов
/ 04 февраля 2015

Вы могли бы написать это как:

forfiles /p c:\test\one /s /m *.gif /c "cmd /c mkdir c:\test\two\@relpath\.."

Это создаст резервную копию полученного пути к родительской папке, предотвращая использование имени файла.

...