Показать полную графическую версию : [решено] Копирование папок с файлами с сохранением директорий по маскам
Всем привет. Нужно скопировать с сетевого диска "R" на диск "D:\1" все папки содержащие в названии ключевые слова "КМ" и "КЖ" со всеми подпапками и файлами, которые есть в этих папках независимо от их названия. При копировании необходимо сохранить директории.
Код есть и он работает, но не совсем правильно, копируются только папки содержащие файлы с масками "КМ" и "КЖ", а мне нужно копировать папку с вложенными файлами по данной маске.
SETLOCAL EnableDelayedExpansion
for /f %%i in ('dir /b/s/ad "!r:\" ^| findstr /i "*КМ* *КЖ*"') do (
set "d=%%i"
xcopy /q/s/y/r/h/z "!d!" "!r:\!\"
)
xcopy /q/s/y/r/h/z "r:\*КМ*" "d:\1\"
xcopy /q/s/y/r/h/z "r:\*КЖ*" "d:\1\"
Нудно на диске D повторить структуру каталогов с R, но содержимое оставить только в директориях КМ/КЖ?
Или найти такие директории и покидать их в корень D ?
Нудно на диске D повторить структуру каталогов с R, но содержимое оставить только в директориях КМ/КЖ?
Или найти такие директории и покидать их в корень D ? »
Первое, необходимо повторить на диске D структуру каталогов с R но содержимое оставить только в директориях с КМ/КЖ.
Одно но, повторять структуру каталогов нужно только не для всех папок, а только для копируемых т.е. для папок содержащих в названии буквы КЖ/КМ.
Мой код это делает, но ищет не папки, а файлы...
megaloman
21-06-2018, 11:39
@Echo Off
cls
Set "BoxIn=R:"
Set "MaskIn="*КЖ*.*" "*КМ*.*""
Set "BoxOut=Z:\Box_Out"
Pushd "%BoxIn%\"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %MaskIn% /B /A:D`) DO (
Echo %%d
>nul xcopy "%BoxIn%\%%d\*.*" "%BoxOut%\%%d\" /E /Q /Y /R /H /Z
)
Popd
pause
GoTo :Eof
buntr, попробуйте так:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFolder=r:\
set sDestFolder=d:\1
set sMask="*КМ*.*" "*КЖ*.*"
if exist "%sSourceFolder%\." (
if exist "%sDestFolder%\." (
pushd "%sSourceFolder%" && (
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:d %sMask%`) do (
if not exist "%sDestFolder%\%%~i\." md "%sDestFolder%\%%~i"
xcopy.exe "%%~i\*.*" "%sDestFolder%\%%~i\" /e /f /h /r /y
)
popd
)
) else (
echo Can't find destination folder [%sDestFolder%].
exit /b 2
)
) else (
echo Can't find source folder [%sSourceFolder%].
exit /b 1
)
endlocal
exit /b 0
Код: »
Ничего не происходит.
Код: »
Не работает, окно сразу закрывается.
Вы сохранили код в 866 кодировке? Пути свои указали? Переименуйте свой командный файл в txt и предоставьте его. »
Да, я перекодировал в 866. Файл выложил. Пути указал вот:
@Echo On
cls
Set "BoxIn=r:"
Set "MaskIn="*КЖ*.*" "*КМ*.*""
Set "BoxOut=d:\1"
Pushd "%BoxIn%\"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %MaskIn% /B /A:D`) DO (
Echo %%d
>nul xcopy "%BoxIn%\%%d\*.*" "%BoxOut%\%%d\" /E /Q /Y /R /H /Z
)
Popd
pause
GoTo :Eof
В командном окне проделайте »
Прикладываю. Хочу добавить, что R это сетевой диск, я имею доступ только для чтения.
megaloman
21-06-2018, 12:28
Я неверно понял задачу: считал, что ваши КМ КЖ папки только в корне R:
Попробуйте так: @Echo Off
cls
Set "BoxIn=R:"
Set "MaskIn="*КЖ*.*" "*КМ*.*""
Set "BoxOut=Z:\Box_Out"
Pushd "%BoxIn%\"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %MaskIn% /B /S /A:D`) DO (
Echo %%d
>nul xcopy "%%d\*.*" "%BoxOut%%%~pnxd\" /E /Q /Y /R /H /Z /D
)
Popd
pause
GoTo :Eof
Не работает, окно сразу закрывается. »
Работает. Открываете командную строку и исполняете пакетный файл в ней.
Прикладываю. »
Ну, и где в именах каталогов:
Архив
Технический архив
…содержащие в названии ключевые слова "КМ" и "КЖ" »
?!
Ну, и где в именах каталогов: »
Может я не совсем правильно описал задачу, но папки с наименованиями с ключевыми словами КМ КЖ находятся глубже в директориях диска R. Наверно в коде сначала необходимо выполнить поиск таких папок потом уже копирование.
Я неверно понял задачу: считал, что ваши КМ КЖ папки только в корне R:
Попробуйте так: »
Нехочет...
но папки с наименованиями с ключевыми словами КМ КЖ находятся глубже в директориях диска R »
На каком именно уровне вложенности они находятся?
На каком именно уровне вложенности они находятся? »
Уровни совершенно разные...от 2 до 10 и более вложений.
Друзья, подождите! Кажется процесс идет, надо было просто подождать.
megaloman
21-06-2018, 13:01
Этот вариант надёжнее, но он работать у Вас скорее всего не будет: похоже, нет указанных папок, так как dir даже не выходит на Echo для отображения имени папки. Возможно, дело в именах папок: допустим, Вы считаете, что К -русская, а на самом деле -K -латинская. У меня работает с разными уровнями вложенности, ИМХО, это для моего кода не принципиально, лишь бы длина полного имени файла была не слишком большая@Echo Off
cls
Set "BoxIn=r:"
Set "MaskIn="*КЖ*.*" "*КМ*.*""
Set "BoxOut=Z:\Box_Out"
Pushd "%BoxIn%\" &&(
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %MaskIn% /B /S /A:D`) DO (
Echo %%d
>nul xcopy "%%d\*.*" "%BoxOut%%%~pnxd\" /E /Q /Y /R /H /Z /D
)
Popd)
pause
GoTo :Eof
Попробуйте проделать
dir R:\*КЖ* R:\*КМ* /B /S /A:D >D:\txt2.txt
Вы увидите в файле D:\txt2.txt искомые папки?
Этот вариант надёжнее »
Ваш предыдущий код работает, просто нужно подождать минут 5 и процесс начинается.
Попробуйте проделать
dir R:\*КЖ* R:\*КМ* /B /S /A:D >D:\txt2.txt
Вы увидите в файле D:\txt2.txt искомые папки? »
Проделал, да, искомые папки находит. Благодарю.
Еще один вопрос, могу ли я добавить новые ключевые фразы для поиска?
нужно подождать минут 5 »
хмм... попробуйте powershell:
$src='R:\'
$dst='D:\1'
$regexp = '(кж|км)[^\\]*$'
if (!(test-path $dst -patht container)){md $dst|out-null}
copy ((dir "$src\*" -dir -rec -force) -match $regexp).fullname $dst -rec -force
megaloman
21-06-2018, 14:43
buntr, могу ли я добавить новые ключевые фразы для поиска? »Можете. НапримерSet "MaskIn="*КЖ*.*" "*КМ*.*" "*kuku*" "тра ля ля-????-*""
Друзья спасибо, задача выполнена, вы настоящие гении!
Отдельную благодарность выражаю: megaloman и Iska
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC