Компьютерный форум 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=228649)

Hollou 24-02-2012 06:35 1865498

Копирование каталога с исключениями и переименованием
 
Добрый день.
Нужно скопировать содержимое каталога (Папка0) за исключением одной папки (из-за её большого веса), при этом каждая новая копия этого каталога должна переименовываться (Папка1-Папка2-ПапкаN, всего 29 копий) и создать для копий основного каталога символическую ссылку на исключенную из копирования папку (название не меняется), находящуюся в оригинальном каталоге (Папка0).

Можно, конечно, собрать все расширения и названия папок, имеющихся в каталоге, и использовать множество повторяющихся команд, но должно быть более элегантное решение.

И ещё в вдогонку: нужно скопировать каталог (Папка0) с переименованием каждой новой копии (Папка1-Папка2-ПапкаN, всего 29 копий).

Помогите, пожалуйста, реализовать это любым работающим способом.

Iska 24-02-2012 07:44 1865510

Цитата:

Цитата Hollou
скопировать содержимое каталога (Папка0) »

Куда конкретно скопировать?

Цитата:

Цитата Hollou
всего 30 копий »

Что потом, после 30, делать?

Попробуйте так:
читать дальше »
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=E:\Песочница\0122\Source
set sDestFolder=E:\Песочница\0122\Destination
set sExcludeFolder=02

for /l %%i in (1, 1, 30) do if not exist "%sDestFolder%\Source%%i" if not defined sCount set sCount=%%i

call :GetLastPartName "%sSourceFolder%"

call :GetTemporaryName
>"%TemporaryName%" echo %sSourceFolder%\%sExcludeFolder%

xcopy.exe "%sSourceFolder%" "%sDestFolder%\%LastPartName%%sCount%\" /e /f /h /r /k /y /exclude:%TemporaryName%
mklink.exe /d "%sDestFolder%\%LastPartName%%sCount%\%sExcludeFolder%" "%sSourceFolder%\%sExcludeFolder%"

>nul del /f /q "%TemporaryName%"

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:GetLastPartName
    setlocal enableextensions enabledelayedexpansion

    set sLastPart=%~nx1
    set sProcName=%~0

    endlocal & set %sProcName:~4%=%sLastPart%
    exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
    setlocal enableextensions enabledelayedexpansion

:NextName
    set sTempName=%temp%\temp%random%.tmp

    if exist "%sTempName%" goto :NextName

    set sProcName=%~0

    endlocal & set %sProcName:~4%=%sTempName%
    exit /b 0
rem ==========================================================================


где: «sSourceFolder» — откуда копировать («Папка0»), «sDestFolder» — куда копировать, sExcludeFolder — имя исключаемой папки («за исключением одной папки»). Поправьте на свои данные и пробуйте, не забывая, что после двенадцати часов карета превратится … после 30 запусков поведение пакетного файла будет непредсказуемым.

Hollou 24-02-2012 08:41 1865525

C:\Catalog - каталог
C:\Catalog\Folder0 - папка, которую нужно размножить 29 раз в каталоге, исключив при этом подпапку с большим весом, и для копий создав символические ссылки на исключенную папку
C:\Catalog\Folder0\Parameters - папка с большим весом, на которую нужно создать символическую ссылку в каждой копии Folder1-29
C:\Catalog\Folder1...29 - копии папки Folder0
Скоро опробую ваш вариант.

Iska 24-02-2012 08:47 1865528

Hollou, озвучьте конечную цель Ваших действий.

Hollou 24-02-2012 09:00 1865534

Из каждой скопированной папки Folder1...29 запускается приложение, которому нужны файлы папки Parameters, находящейся в папке Folder0 (файлов очень много, разных расширений, под 100 Гб). Предоставить эти файлы для каждой копии не представляется возможным, поэтому нужна символическая ссылка - так у каждой копии будет папка Parameters. Копировать и переименовывать папку Folder0, а так же создавать ссылки в ручную - слишком долго.
Не так объяснил? Извините, если что.

Iska 24-02-2012 09:05 1865537

Hollou, действие по созданию тридцати копий папки «Folder0» — однократное?

Hollou 24-02-2012 09:06 1865538

Цитата:

Цитата Iska
Hollou, действие по созданию тридцати копий папки «Folder0» — однократное? »

Да.

Iska 24-02-2012 09:07 1865539

И правильно ли я понял, что копии «Folder1...29» должны создаваться в том же каталоге, что и «Folder0»?

Hollou 24-02-2012 09:08 1865540

Цитата:

Цитата Iska
И правильно ли я понял, что копии «Folder1...29» должны создаваться в том же каталоге, что и «Folder0»? »

Совершенное верно. Извините за размывчатую формулировку вопросов.

Порядок при переименовании:
Folder0 - копируемая папка
Folder1 - копия папки Folder0
Folder2 - копия папки Folder0
Folder3 - копия папки Folder0
Folder4 - копия папки Folder0
Folder5 - копия папки Folder0
...
Folder29 - копия папки Folder0

Iska 24-02-2012 09:19 1865541

Hollou, ясно. Попробуйте так:
читать дальше »
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=C:\Catalog\Folder0
set sDestFolder=C:\Catalog
set sExcludeFolder=Parameters

call :GetLastPartName "%sSourceFolder%"

call :GetTemporaryName
>"%TemporaryName%" echo %sSourceFolder%\%sExcludeFolder%

for /l %%i in (1, 1, 29) do (
        xcopy.exe "%sSourceFolder%" "%sDestFolder%\%LastPartName:~0,-1%%%i\" /e /f /h /r /k /y /exclude:%TemporaryName%
        mklink.exe /d "%sDestFolder%\%LastPartName:~0,-1%%%i\%sExcludeFolder%" "%sSourceFolder%\%sExcludeFolder%"
)

>nul del /f /q "%TemporaryName%"

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:GetLastPartName
    setlocal enableextensions enabledelayedexpansion

    set sLastPart=%~nx1
    set sProcName=%~0

    endlocal & set %sProcName:~4%=%sLastPart%
    exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
    setlocal enableextensions enabledelayedexpansion

:NextName
    set sTempName=%temp%\temp%random%.tmp

    if exist "%sTempName%" goto :NextName

    set sProcName=%~0

    endlocal & set %sProcName:~4%=%sTempName%
    exit /b 0
rem ==========================================================================


Hollou 24-02-2012 09:43 1865557

Цитата:

Цитата Iska
Попробуйте так: »

Скопировало успешно, но символьная ссылка для копий на папку Parameters не создалась. Папка Parameters лежит в Folder0 и ссылка на неё нужна для всех копий. Ругается на неправильный синтакс команды mklink, ошибок команды копирования нет.
Вроде должно быть так (для коппи папки)
cd C:\Catalog\FolderN
mklink /d Parameters "C:\Ctalog\Folder0\Parameters"

Iska 24-02-2012 10:49 1865575

Hollou, я в любом случае не смогу проверить работу оригинальной утилиты «mklink.exe» по той простой причине, что у меня Windows XP (то есть — создать Symbolic Link я могу, могу посмотреть, куда она указывает, а вот воспользоваться ею возможности нет). Синтаксис утилиты я брал отсюда: Mklink и отсюда: NTFS symbolic link - Wikipedia, the free encyclopedia.

Вот полученный мною результат:
читать дальше »
Код:

╔═════════════════════════ C:\Catalog ═══╤══════╤════════╤═════╗
║и                Имя                  │Размер│  Дата  │Время║
║⌂..                                    │ Вверх│24.02.12│08:18║
║├Folder0                                │ Папка│24.02.12│08:09║
║├Folder1                                │ Папка│24.02.12│08:18║
║├Folder2                                │ Папка│24.02.12│08:18║
║├Folder3                                │ Папка│24.02.12│08:18║
║├Folder4                                │ Папка│24.02.12│08:18║
║├Folder5                                │ Папка│24.02.12│08:18║
║├Folder6                                │ Папка│24.02.12│08:18║

Код:

╔═════════════════════ C:\Catalog\Folder1 ══════╤════════╤═════╗
║и                Имя                  │Размер│  Дата  │Время║
║⌂..                                    │ Вверх│24.02.12│08:18║
║├01                                    │ Папка│24.02.12│08:18║
║├02                                    │ Папка│24.02.12│08:18║
║├03                                    │ Папка│24.02.12│08:18║
║├Parameters                            │Ссылка│24.02.12│08:18║
║¿7-zip                              chm│ 92392│18.04.11│20:43║
║░Descript                            ion│    22│24.02.12│08:08║
║                                        │      │        │    ║

Код:

╔══════════════════════════ Атрибуты ══════════════════════════╗
║                  Изменить файловые атрибуты                  ║
║                          Parameters                          ║
║ Ссылка:      C:\Catalog\Folder0\Parameters                  ║
╟──────────────────────────────────────────────────────────────╢
║ Владелец:    @@@@@@@@@@                                      ║
╟──────────────────────────────────────────────────────────────╢
║ [ ] Только для чтения        [ ] Неиндексируемый            ║
║ [ ] Архивный                  [ ] Разреженный                ║
║ [ ] Скрытый                  [ ] Временный                  ║
║ [ ] Системный                [ ] Автономный                ║
║ [ ] Сжатый                    [x] Точка повторной обработки  ║
║ [ ] Зашифрованный            [ ] Виртуальный                ║
╟──────────────────────────────────────────────────────────────╢
║                                    ДД.ММ.ГГГГГ чч:мм:сс.мс  ║
║ Время последней записи:            24.02.2012  08:18:39.812 ║
║ Время создания:                    24.02.2012  08:18:39.812 ║
║ Время последнего доступа:          24.02.2012  08:18:39.812 ║
║ Время изменения:                    24.02.2012  08:18:39.812 ║
║              [ Исходное ] [ Текущее ] [ Сброс ]              ║
╟──────────────────────────────────────────────────────────────╢
║ [ ] Обрабатывать вложенные папки                            ║
╟──────────────────────────────────────────────────────────────╢
║      { Установить } [ Системные свойства ] [ Отмена ]      ║
╚══════════════════════════════════════════════════════════════╝



Попробуйте прочитать справку и поправить код так, чтобы ссылка корректно создавалась.

Ну, или выложите результат:
Код:

mklink.exe /?
— посмотрим.

P.S. Вот ещё результат:
читать дальше »
Код:

C:\Catalog\Folder1>fsutil.exe reparsepoint query Parameters
Цитата:

Код:

Значение тега повторной обработки: 0xa000000c
Значение тега: Майкрософт
Значение тега: Суррогат имени
GUID: {00420000-0044-003A-0000-00005C003F00}
Длина данных: 0x0000008c
Данные повторной обработки:
0000:  3f 00 5c 00 43 00 3a 00 5c 00 43 00 61 00 74 00  ?.\.C.:.\.C.a.t.
0010:  61 00 6c 00 6f 00 67 00 5c 00 46 00 6f 00 6c 00  a.l.o.g.\.F.o.l.
0020:  64 00 65 00 72 00 30 00 5c 00 50 00 61 00 72 00  d.e.r.0.\.P.a.r.
0030:  61 00 6d 00 65 00 74 00 65 00 72 00 73 00 00 00  a.m.e.t.e.r.s...
0040:  43 00 3a 00 5c 00 43 00 61 00 74 00 61 00 6c 00  C.:.\.C.a.t.a.l.
0050:  6f 00 67 00 5c 00 46 00 6f 00 6c 00 64 00 65 00  o.g.\.F.o.l.d.e.
0060:  72 00 30 00 5c 00 50 00 61 00 72 00 61 00 6d 00  r.0.\.P.a.r.a.m.
0070:  65 00 74 00 65 00 72 00 73 00 00 00 00 00 00 00  e.t.e.r.s.......
0080:  00 00 00 00 00 00 00 00 00 00 00 00              ............



Hollou 24-02-2012 10:59 1865579


Но толку то от этой пикчи. :) Я не очень силён в написании батников. Попробую разобраться.

Ещё вопрос: можете ли вы состряпать батник с простым копированием папок без исключений и символьных ссылок. Теже 29 копий папки Folder0 в одном с ней каталоге.

Iska 24-02-2012 11:08 1865582

Hollou, аналогично.

Я добавил в код «echo» для визуальной проверки строки с «mklink.exe»:
Код:

        …
        echo mklink.exe /d "%sDestFolder%\%LastPartName:~0,-1%%%i\%sExcludeFolder%" "%sSourceFolder%\%sExcludeFolder%"
        mklink.exe /d "%sDestFolder%\%LastPartName:~0,-1%%%i\%sExcludeFolder%" "%sSourceFolder%\%sExcludeFolder%"
)

Вижу при исполнении:
Цитата:

Код:


mklink.exe /d "C:\Catalog\Folder1\Parameters" "C:\Catalog\Folder0\Parameters"


У Вас «mklink.exe» выводит какие-либо сообщения об ошибках?

Hollou 24-02-2012 11:19 1865588

Нет, но символическая ссылка не появляется. Выводится тоже самое, что и у вас.

Iska 24-02-2012 11:21 1865589

Hollou, тогда я бессилен, пока не доберусь до машины с более свежей ОС.

Hollou 24-02-2012 11:25 1865592

Большое спасибо за приложенные усилия и потраченное время. Но не забывайте про мой вопрос, пожалуйста. Сам вряд ли допилю.

Hollou 24-02-2012 11:51 1865601

Допилил для 2ой задачи.
Вот >>
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=
set sDestFolder=

call :GetLastPartName "%sSourceFolder%"

call :GetTemporaryName

for /l %%i in (1, 1, 29) do (
        xcopy.exe "%sSourceFolder%" "%sDestFolder%\%LastPartName:~0,-1%%%i\" /e /f /h /r /k /y
)

endlocal
PAUSE
rem ==========================================================================

rem ==========================================================================
:GetLastPartName
    setlocal enableextensions enabledelayedexpansion

    set sLastPart=%~nx1
    set sProcName=%~0

    endlocal & set %sProcName:~4%=%sLastPart%
    exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
    setlocal enableextensions enabledelayedexpansion

:NextName
    set sTempName=%temp%\temp%random%.tmp

    if exist "%sTempName%" goto :NextName

    set sProcName=%~0

    endlocal & set %sProcName:~4%=%sTempName%
    exit /b 0
rem ==========================================================================



Вроде всё порядком.

Кривоватое решение для первой задачи (слегка изменил строку с мклинк):
Код:

rem        echo mklink.exe /d "%sDestFolder%\%LastPartName:~0,-1%%%i\%sExcludeFolder%" "%sSourceFolder%\%sExcludeFolder%"
cd "%sDestFolder%\%LastPartName:~0,-1%%%i"
mklink /d %sExcludeFolder% "%sSourceFolder%\%sExcludeFolder%"

Пашет только с отрабатыванием из копированной папки.

Iska 24-02-2012 16:52 1865789

Hollou, добрался, проверил.

При исполнении «mklink.exe» на Windows Server 2008 R2 вижу сообщение об ошибке:
Код:

Ошибка в синтаксисе команды.
Hollou, уберите в пакетном файле из #10 точку и расширение у mklink:
Код:

        mklink.exe /d "%sDestFolder%\%LastPartName:~0,-1%%%i\%sExcludeFolder%" "%sSourceFolder%\%sExcludeFolder%"
И всё заработает.

Iska 21-03-2012 16:12 1883977

Из письма в ПМ:
Цитата:

Цитата Hollou
Не могли бы вы переделать скриптец под создание 64-ёх копий папки?

Навскидку — заменить «29» в
Код:

for /l %%i in (1, 1, 29) do (
на «64». Не проверялось.


Время: 04:46.

Время: 04:46.
© OSzone.net 2001-