ROBOCOPY-копирование содержимого папок в одну папку

вот какой код я сделал:)

@echo off
set source="R:Contracts"
set destination="R:ContractsSites"
ROBOCOPY %source% %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0 /S
for /r %source in (*) do @copy "%destination" .

R:Contracts полон папок, в которых есть файлы.

Я хочу скопировать все в R:ContractsSites и сгладить структуру папок.

все копии хорошо, но и структуру папок.

спасибо

4 ответов


ни одна команда не сгладит иерархию для вас; вам придется использовать несколько команд. Это можно сделать просто с помощью FOR/R, чтобы ходить по иерархии, в сочетании с вашей копией / переместить команду выбора (move, copy, xcopy, robocopy). Поскольку место назначения находится в исходной иерархии, вам нужно IF, чтобы предотвратить назначение от источника.

прежде чем продолжить, Вы должны остановиться и подумать о том, что произойдет, если одно и то же имя файла появится в нескольких источниках папки. В папке назначения может быть только одна версия. Вы можете гарантировать, что дубликатов имен не существует? Если нет, то какой файл следует сохранить? Как вы можете структурировать команду, чтобы сохранить файл, который вы хотите? Это осложнение, вероятно, является причиной того, что никогда не было написано команды, чтобы просто сгладить иерархию.

вот ваша команда ROBOCOPY интегрирована с решением FOR/R.

@echo off
set source="R:\Contracts"
set destination="R:\Contracts\Sites"

::Not sure if this is needed
::It guarantees you have a canonical path (standard form)
for %%F in (%destination%) do set destination="%%~fF"

for /r %source% %%F in (.) do if "%%~fF" neq %destination% ROBOCOPY "%%F" %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0

Вы можете сделать это с помощью PowerShell one liner. В этом примере я отфильтровываю все файлы с помощью .расширение txt из всех подпапок. А затем отправьте их командлету Move-Item.

объедините командлеты get-Childitem (GCI для краткости),- recurse, maby-filter и передайте результат командлету Move-Item. Сначала используйте-WhatIf, чтобы проверить, что вывод является тем, что вы ожидали.

переместить в текущую папку

get-Childitem -recurse -filter *.txt | Move-Item -WhatIf

переместить в другую папку

get-Childitem -recurse -filter *.txt | Move-Item -Destination c:\temp -WhatIf

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

C:\files\somefiles\file.txt

C:\files\otherfiles\file.txt

назначения C:\newdir\ файлы создаются как

C:\newdir\somefiles-file.txt

C:\newdir\otherfiles-file.txt

вот код, пакетный файл 1 проходит через файлы, пакетный файл 2 переименовывает и перемещает их (также можно скопировать, если вы хотите сохранить источник:

@echo off
for /r %%f in (*.*pr) do @renameandmovefilespart2.bat "%%f" "%%~ff" "%%~xf"

renameandmovefilespart2.летучая мышь!--5-->

@echo off
Setlocal EnableDelayedExpansion
rem set the whole file path
set origWhole=%1
set origPathOnly=%2
set extension=%3
rem here you can set where the directory to hold the flattened hierarchy is
set destDir=c:\destinationDir\
rem  set the directory to do a string replace
rem make this the starting directory, that you dont want in the newly renamed files
set startingDir=C:\starting\directory\
set nothing=
set slash=\
rem here you can set what the character to represent the directory indicator \ in the new files 
set reaplcementDirectoryCharacter=--
set quote="
rem cut out the starting part of the directory
call set newname=%%origWhole:!startingDir!=!nothing!%%
rem replace slashes with new character
call set newname=%%newname:!slash!=!reaplcementDirectoryCharacter!%%
rem remove quotes
call set newname=%%newname:!quote!=!nothing!%%
rem @echo shortened: %newname%
rem @echo source path: %origPathOnly% newPath: %startingDir%
rem @echo extension: %extension%
rem rename the files
ren %origWhole% %newname%
rem prepare to move the file, clean up the source path
call set origPathOnly=%%origPathOnly:!quote!=!nothing!%%
move "%origPathOnly%%newname%" "%destDir%"

есть старая утилита PCMag под названием Sweep.exe, который может работать с той же командой в текущем и подкаталоге. Я бы не поставил назначение в качестве подкаталога исходного каталога. Ставить цели в другом месте.

http://www.rarewares.org/files/case/Sweep.zip

cd c:\contracts sweep copy *.* c:\sites

это скопирует все из c:\contracts а под ним ... c:\sites

Я использую аналогичную команду для сглаживания иерархии a справочник.

позаботьтесь о дубликатах и о том, как вы хотите их обрабатывать. Вы хотите перезаписать или обработать по-другому.