ROBOCOPY - копирование содержимого папок в одну папку - PullRequest
7 голосов
/ 31 декабря 2011

Вот некоторый код, который я сделал:)

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

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

Я хочу скопировать все в R: \Contracts \ Sites \ и выравнивание структуры папок.

Все хорошо копируется, но также структура папок.

Спасибо

Ответы [ 4 ]

9 голосов
/ 13 февраля 2015

Вы можете сделать это с одним вкладышем PowerShell.В этом примере я отфильтрую все файлы с расширением .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
9 голосов
/ 01 января 2012

Ни одна команда не сгладит иерархию для вас; вам придется использовать несколько команд. Это можно сделать просто с помощью FOR / R для обхода иерархии в сочетании с выбранной вами командой копирования / перемещения (перемещение, копирование, 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
0 голосов
/ 23 августа 2015

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

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

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

Это скопирует все из c: \ контрактов и внизу в c: \ sites

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

Берегите дубликаты и то, как вы хотите с ними обращаться. Хотите переписать или обработать другим способом.

0 голосов
/ 12 сентября 2014

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

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.bat

@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%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...