Войти

Показать полную графическую версию : [решено] Копирование каталога с исключениями и переименованием


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

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

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

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

Iska
24-02-2012, 07:44
скопировать содержимое каталога (Папка0) »
Куда конкретно скопировать?

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

Iska
24-02-2012, 08:47
Hollou, озвучьте конечную цель Ваших действий.

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

Iska
24-02-2012, 09:05
Hollou, действие по созданию тридцати копий папки «Folder0» — однократное?

Hollou
24-02-2012, 09:06
Hollou, действие по созданию тридцати копий папки «Folder0» — однократное? »
Да.

Iska
24-02-2012, 09:07
И правильно ли я понял, что копии «Folder1...29» должны создаваться в том же каталоге, что и «Folder0»?

Hollou
24-02-2012, 09:08
И правильно ли я понял, что копии «Folder1...29» должны создаваться в том же каталоге, что и «Folder0»? »
Совершенное верно. Извините за размывчатую формулировку вопросов.

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

Iska
24-02-2012, 09:19
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
Попробуйте так: »

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

Iska
24-02-2012, 10:49
Hollou, я в любом случае не смогу проверить работу оригинальной утилиты «mklink.exe» по той простой причине, что у меня Windows XP (то есть — создать Symbolic Link я могу, могу посмотреть, куда она указывает, а вот воспользоваться ею возможности нет). Синтаксис утилиты я брал отсюда: Mklink (http://technet.microsoft.com/en-us/library/cc753194(WS.10).aspx) и отсюда: NTFS symbolic link - Wikipedia, the free encyclopedia (http://en.wikipedia.org/wiki/NTFS_symbolic_link#Syntax).

Вот полученный мною результат:
╔═════════════════════════ 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
http://i31.fastpic.ru/thumb/2012/0224/1b/95a735fd89bc295524b882aed71d031b.jpeg (http://fastpic.ru/view/31/2012/0224/95a735fd89bc295524b882aed71d031b.png.html)
Но толку то от этой пикчи. :) Я не очень силён в написании батников. Попробую разобраться.

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

Iska
24-02-2012, 11:08
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
Нет, но символическая ссылка не появляется. Выводится тоже самое, что и у вас.

Iska
24-02-2012, 11:21
Hollou, тогда я бессилен, пока не доберусь до машины с более свежей ОС.

Hollou
24-02-2012, 11:25
Большое спасибо за приложенные усилия и потраченное время. Но не забывайте про мой вопрос, пожалуйста. Сам вряд ли допилю.

Hollou
24-02-2012, 11:51
Допилил для 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
Hollou, добрался, проверил.

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

Hollou, уберите в пакетном файле из #10 (http://forum.oszone.net/post-1865541.html#post1865541) точку и расширение у mklink:
mklink.exe /d "%sDestFolder%\%LastPartName:~0,-1%%%i\%sExcludeFolder%" "%sSourceFolder%\%sExcludeFolder%"

И всё заработает.

Iska
21-03-2012, 16:12
Из письма в ПМ:
Не могли бы вы переделать скриптец под создание 64-ёх копий папки?
Навскидку — заменить «29» в
for /l %%i in (1, 1, 29) do (
на «64». Не проверялось.




© OSzone.net 2001-2012