Копирование каталога с исключениями и переименованием
Добрый день.
Нужно скопировать содержимое каталога (Папка0) за исключением одной папки (из-за её большого веса), при этом каждая новая копия этого каталога должна переименовываться (Папка1-Папка2-ПапкаN, всего 29 копий) и создать для копий основного каталога символическую ссылку на исключенную из копирования папку (название не меняется), находящуюся в оригинальном каталоге (Папка0).
Можно, конечно, собрать все расширения и названия папок, имеющихся в каталоге, и использовать множество повторяющихся команд, но должно быть более элегантное решение.
И ещё в вдогонку: нужно скопировать каталог (Папка0) с переименованием каждой новой копии (Папка1-Папка2-ПапкаN, всего 29 копий).
Помогите, пожалуйста, реализовать это любым работающим способом.
|
Цитата:
Цитата Hollou
скопировать содержимое каталога (Папка0) »
|
Куда конкретно скопировать?
Что потом, после 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 запусков поведение пакетного файла будет непредсказуемым.
|
C:\Catalog - каталог
C:\Catalog\Folder0 - папка, которую нужно размножить 29 раз в каталоге, исключив при этом подпапку с большим весом, и для копий создав символические ссылки на исключенную папку
C:\Catalog\Folder0\Parameters - папка с большим весом, на которую нужно создать символическую ссылку в каждой копии Folder1-29
C:\Catalog\Folder1...29 - копии папки Folder0
Скоро опробую ваш вариант.
|
Hollou, озвучьте конечную цель Ваших действий.
|
Из каждой скопированной папки Folder1...29 запускается приложение, которому нужны файлы папки Parameters, находящейся в папке Folder0 (файлов очень много, разных расширений, под 100 Гб). Предоставить эти файлы для каждой копии не представляется возможным, поэтому нужна символическая ссылка - так у каждой копии будет папка Parameters. Копировать и переименовывать папку Folder0, а так же создавать ссылки в ручную - слишком долго.
Не так объяснил? Извините, если что.
|
Hollou, действие по созданию тридцати копий папки «Folder0» — однократное?
|
Цитата:
Цитата Iska
Hollou, действие по созданию тридцати копий папки «Folder0» — однократное? »
|
Да.
|
И правильно ли я понял, что копии «Folder1...29» должны создаваться в том же каталоге, что и «Folder0»?
|
Цитата:
Цитата Iska
И правильно ли я понял, что копии «Folder1...29» должны создаваться в том же каталоге, что и «Folder0»? »
|
Совершенное верно. Извините за размывчатую формулировку вопросов.
Порядок при переименовании:
Folder0 - копируемая папка
Folder1 - копия папки Folder0
Folder2 - копия папки Folder0
Folder3 - копия папки Folder0
Folder4 - копия папки Folder0
Folder5 - копия папки Folder0
...
Folder29 - копия папки Folder0
|
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 ==========================================================================
|
Скопировало успешно, но символьная ссылка для копий на папку Parameters не создалась. Папка Parameters лежит в Folder0 и ссылка на неё нужна для всех копий. Ругается на неправильный синтакс команды mklink, ошибок команды копирования нет.
Вроде должно быть так (для коппи папки)
cd C:\Catalog\FolderN
mklink /d Parameters "C:\Ctalog\Folder0\Parameters"
|
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 ║
║ [ Исходное ] [ Текущее ] [ Сброс ] ║
╟──────────────────────────────────────────────────────────────╢
║ [ ] Обрабатывать вложенные папки ║
╟──────────────────────────────────────────────────────────────╢
║ { Установить } [ Системные свойства ] [ Отмена ] ║
╚══════════════════════════════════════════════════════════════╝
Попробуйте прочитать справку и поправить код так, чтобы ссылка корректно создавалась.
Ну, или выложите результат:
— посмотрим.
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 ............
|
|

Но толку то от этой пикчи. :) Я не очень силён в написании батников. Попробую разобраться.
Ещё вопрос: можете ли вы состряпать батник с простым копированием папок без исключений и символьных ссылок. Теже 29 копий папки Folder0 в одном с ней каталоге.
|
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, тогда я бессилен, пока не доберусь до машины с более свежей ОС.
|
Большое спасибо за приложенные усилия и потраченное время. Но не забывайте про мой вопрос, пожалуйста. Сам вряд ли допилю.
|
Допилил для 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%"
Пашет только с отрабатыванием из копированной папки.
|
Hollou, добрался, проверил.
При исполнении «mklink.exe» на Windows Server 2008 R2 вижу сообщение об ошибке:
Код:
Ошибка в синтаксисе команды.
Hollou, уберите в пакетном файле из #10 точку и расширение у mklink:
Код:
mklink.exe /d "%sDestFolder%\%LastPartName:~0,-1%%%i\%sExcludeFolder%" "%sSourceFolder%\%sExcludeFolder%"
И всё заработает.
|
Из письма в ПМ:
Цитата:
Цитата Hollou
Не могли бы вы переделать скриптец под создание 64-ёх копий папки?
|
Навскидку — заменить «29» в
Код:
for /l %%i in (1, 1, 29) do (
на «64». Не проверялось.
|
Время: 04:46.
© OSzone.net 2001-