Копирование папок с файлами с сохранением директорий по маскам
Всем привет. Нужно скопировать с сетевого диска "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 ?
|
Цитата:
Цитата Busla
Нудно на диске D повторить структуру каталогов с R, но содержимое оставить только в директориях КМ/КЖ?
Или найти такие директории и покидать их в корень D ? »
|
Первое, необходимо повторить на диске D структуру каталогов с 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 /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
|
Не работает, окно сразу закрывается.
|
Вложений: 1
Цитата:
Цитата megaloman
Вы сохранили код в 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
|
Вложений: 1
Цитата:
Цитата megaloman
В командном окне проделайте »
|
Прикладываю. Хочу добавить, что R это сетевой диск, я имею доступ только для чтения.
|
Я неверно понял задачу: считал, что ваши КМ КЖ папки только в корне 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
|
Цитата:
Цитата buntr
Не работает, окно сразу закрывается. »
|
Работает. Открываете командную строку и исполняете пакетный файл в ней.
Ну, и где в именах каталогов:
Код:
Архив
Технический архив
Цитата:
Цитата buntr
…содержащие в названии ключевые слова "КМ" и "КЖ" »
|
?!
|
Цитата:
Цитата Iska
Ну, и где в именах каталогов: »
|
Может я не совсем правильно описал задачу, но папки с наименованиями с ключевыми словами КМ КЖ находятся глубже в директориях диска R. Наверно в коде сначала необходимо выполнить поиск таких папок потом уже копирование.
|
Вложений: 1
Цитата:
Цитата megaloman
Я неверно понял задачу: считал, что ваши КМ КЖ папки только в корне R:
Попробуйте так: »
|
Нехочет...
|
Цитата:
Цитата buntr
но папки с наименованиями с ключевыми словами КМ КЖ находятся глубже в директориях диска R »
|
На каком именно уровне вложенности они находятся?
|
Цитата:
Цитата Iska
На каком именно уровне вложенности они находятся? »
|
Уровни совершенно разные...от 2 до 10 и более вложений.
Друзья, подождите! Кажется процесс идет, надо было просто подождать.
|
Этот вариант надёжнее, но он работать у Вас скорее всего не будет: похоже, нет указанных папок, так как 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 и процесс начинается.
Цитата:
Цитата megaloman
Попробуйте проделать
dir R:\*КЖ* R:\*КМ* /B /S /A:D >D:\txt2.txt
Вы увидите в файле D:\txt2.txt искомые папки? »
|
Проделал, да, искомые папки находит. Благодарю.
Еще один вопрос, могу ли я добавить новые ключевые фразы для поиска?
|
Цитата:
Цитата buntr
нужно подождать минут 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
|
buntr,
Цитата:
Цитата buntr
могу ли я добавить новые ключевые фразы для поиска? »
|
Можете. Например
Код:
Set "MaskIn="*КЖ*.*" "*КМ*.*" "*kuku*" "тра ля ля-????-*""
|
Друзья спасибо, задача выполнена, вы настоящие гении!
Отдельную благодарность выражаю: megaloman и Iska
|
Время: 16:59.
© OSzone.net 2001-