Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Копирование папок с файлами с сохранением директорий по маскам (http://forum.oszone.net/showthread.php?t=335417)

buntr 21-06-2018 07:31 2818915

Копирование папок с файлами с сохранением директорий по маскам
 
Всем привет. Нужно скопировать с сетевого диска "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\"


Busla 21-06-2018 10:04 2818947

Нудно на диске D повторить структуру каталогов с R, но содержимое оставить только в директориях КМ/КЖ?
Или найти такие директории и покидать их в корень D ?

buntr 21-06-2018 11:16 2818961

Цитата:

Цитата Busla
Нудно на диске D повторить структуру каталогов с R, но содержимое оставить только в директориях КМ/КЖ?
Или найти такие директории и покидать их в корень D ? »

Первое, необходимо повторить на диске D структуру каталогов с R но содержимое оставить только в директориях с КМ/КЖ.
Одно но, повторять структуру каталогов нужно только не для всех папок, а только для копируемых т.е. для папок содержащих в названии буквы КЖ/КМ.
Мой код это делает, но ищет не папки, а файлы...

megaloman 21-06-2018 11:39 2818964

Код:

@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


Iska 21-06-2018 11:47 2818966

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


buntr 21-06-2018 11:52 2818968

Цитата:

Цитата megaloman
Код: »

Ничего не происходит.

buntr 21-06-2018 11:56 2818971

Цитата:

Цитата Iska
Код: »

Не работает, окно сразу закрывается.

buntr 21-06-2018 12:02 2818974

Вложений: 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


buntr 21-06-2018 12:24 2818983

Вложений: 1
Цитата:

Цитата megaloman
В командном окне проделайте »

Прикладываю. Хочу добавить, что R это сетевой диск, я имею доступ только для чтения.

megaloman 21-06-2018 12:28 2818984

Я неверно понял задачу: считал, что ваши КМ КЖ папки только в корне 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


Iska 21-06-2018 12:33 2818986

Цитата:

Цитата buntr
Не работает, окно сразу закрывается. »

Работает. Открываете командную строку и исполняете пакетный файл в ней.

Цитата:

Цитата buntr
Прикладываю. »

Ну, и где в именах каталогов:
Код:

Архив
Технический архив

Цитата:

Цитата buntr
…содержащие в названии ключевые слова "КМ" и "КЖ" »

?!

buntr 21-06-2018 12:37 2818987

Цитата:

Цитата Iska
Ну, и где в именах каталогов: »

Может я не совсем правильно описал задачу, но папки с наименованиями с ключевыми словами КМ КЖ находятся глубже в директориях диска R. Наверно в коде сначала необходимо выполнить поиск таких папок потом уже копирование.

buntr 21-06-2018 12:40 2818988

Вложений: 1
Цитата:

Цитата megaloman
Я неверно понял задачу: считал, что ваши КМ КЖ папки только в корне R:
Попробуйте так: »

Нехочет...

Iska 21-06-2018 12:44 2818989

Цитата:

Цитата buntr
но папки с наименованиями с ключевыми словами КМ КЖ находятся глубже в директориях диска R »

На каком именно уровне вложенности они находятся?

buntr 21-06-2018 12:47 2818990

Цитата:

Цитата Iska
На каком именно уровне вложенности они находятся? »

Уровни совершенно разные...от 2 до 10 и более вложений.

Друзья, подождите! Кажется процесс идет, надо было просто подождать.

megaloman 21-06-2018 13:01 2818992

Этот вариант надёжнее, но он работать у Вас скорее всего не будет: похоже, нет указанных папок, так как 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 искомые папки?

buntr 21-06-2018 13:27 2818994

Цитата:

Цитата megaloman
Этот вариант надёжнее »

Ваш предыдущий код работает, просто нужно подождать минут 5 и процесс начинается.
Цитата:

Цитата megaloman
Попробуйте проделать
dir R:\*КЖ* R:\*КМ* /B /S /A:D >D:\txt2.txt
Вы увидите в файле D:\txt2.txt искомые папки? »

Проделал, да, искомые папки находит. Благодарю.

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

YuS_2 21-06-2018 13:55 2818998

Цитата:

Цитата 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


megaloman 21-06-2018 14:43 2819003

buntr,
Цитата:

Цитата buntr
могу ли я добавить новые ключевые фразы для поиска? »

Можете. Например
Код:

Set "MaskIn="*КЖ*.*" "*КМ*.*" "*kuku*" "тра ля ля-????-*""

buntr 22-06-2018 07:03 2819063

Друзья спасибо, задача выполнена, вы настоящие гении!
Отдельную благодарность выражаю: megaloman и Iska


Время: 16:59.

Время: 16:59.
© OSzone.net 2001-