Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Автозамена при перемещении

Ответить
Настройки темы
CMD/BAT - [решено] Автозамена при перемещении

Аватара для Tosyk

Старожил


Сообщения: 166
Благодарности: 0

Профиль | Отправить PM | Цитировать


У меня есть много одинаковых (по имени - Material3) папок в различных под папках, очень много, в эти папках находятся *.mat файлы, среди *.mat файлов попадаются одинаковые

скриптом:

Код: Выделить весь код
for /f "tokens=*" %%b in ('dir /b /s Material3') do move /y "%%b" "%%~dpb../.."
перемещаю все эти папки в одно место, т.о. все папки должны слиться в одну, а все файлы *.mat переместиться в эту папку с заменой соответсвенно, но несмотря на использование ключа /y (пробовал и /Y) скрипт постоянно спрашивает о замене, как сделать автозамену в скрипте?

Отправлено: 09:16, 15-01-2011

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


- ключ /Y работает только для файлов, а не для папок;
- в каталоге батника не должно быть папки "Material3", иначе DIR просто выдаст её содержимое;

вариант через XCOPY и RD:
Код: Выделить весь код
if not exist Material3 for /f "delims=" %%a in ('dir /b/s/ad Material3') do (
  xcopy /q/s/y/h/r "%%a\*" "%%~dpb..\..\Material3\" && rd /q/s "%%a"
)

Отправлено: 13:08, 15-01-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Tosyk

Старожил


Сообщения: 166
Благодарности: 0

Профиль | Отправить PM | Цитировать


дело в том, что общий объём файлов может составлять до 50 гб, поэтому и хотел использовать именно move, так как нет возможности копировать такое количество мегабайт

add:
ваш вариант работает

add2:
а как работает скрипт?

Код: Выделить весь код
находит папку -> копирует в нужное место -> удаляет оригинал
так?
либо
Код: Выделить весь код
находит папку -> копирует в нужное место -> находит папку -> копирует в нужное место -> ...находит и копирует все папки... -> удаляет оригиналы
так?

если первый вариант, то это вполне нормально (на диске единовременно не будет очень много скопированной информации)

Последний раз редактировалось Tosyk, 15-01-2011 в 13:36.


Отправлено: 13:13, 15-01-2011 | #3


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Tosyk:
как работает скрипт? »
в цикле перебираются все папки, которые поочередно копируются и сразу удаляются

Цитата Tosyk:
хотел использовать именно move »
тогда только пофайлово:
Код: Выделить весь код
@echo off
SETLOCAL EnableDelayedExpansion

for /f "delims=" %%d in ('dir /b/s/ad "Material3.*"') do if "%%~xd"=="" (
  for /f "delims=" %%f in ('dir /b/s/a-d "%%d"') do (
    set "$d=%%~dpf"& set "$d=!$d:%%~dpd=%%~dpd..\..\!"
    if not exist "!$d!" md "!$d!"
    if exist "!$d!" move "%%f" "!$d!"
))
- исходные папки после перемещения файлов не удаляются;
- операция одноразовая, скрипт поднимает на два уровня каждую папку Material3, 2-й запуск поднимет также и целевую папку, т.к. у них одинаковые имена
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:53, 15-01-2011 | #4


Аватара для Tosyk

Старожил


Сообщения: 166
Благодарности: 0

Профиль | Отправить PM | Цитировать


Большое спасибо, всё работает!

Отправлено: 19:55, 15-01-2011 | #5


Аватара для Tosyk

Старожил


Сообщения: 166
Благодарности: 0

Профиль | Отправить PM | Цитировать


появилась проблема, иногда файлы в папках Material3 имеют одинаковое имя, но разный размер (т.е по сути это другие файлы), как сделать так чтобы перед заменой файлов проводилась проверка размера, и если файл *.mat в папке имеет то же имя, но другой размер то к имени нового файла добалялось бы "01,02,03...и.т.д"

Отправлено: 14:08, 16-01-2011 | #6


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Tosyk, как-то так:
Код: Выделить весь код
@echo off
SETLOCAL EnableDelayedExpansion

for /f "delims=" %%d in ('dir/b/s/ad "Material3.*"') do if "%%~xd"=="" (
  for /f "delims=" %%f in ('dir/b/s/a-d "%%d"') do (
    set "$d=%%~dpf"& set "$d=!$d:%%~dpd=%%~dpd..\..\!"
    call:MoveRen "%%f" "!$d!"
))

:MoveRen  %source_file% %destin_folder%
::-------------------------------------
 set "$s="& set "$n="& if "%~1"=="" GoTo:EOF
 if not exist "%~2" md "%~2"||exit/b 1
:MoveRen_Loop
 if not exist "%~2%~n1%$s%%~x1" move "%~1" "%~2%~n1%$s%%~x1"& GoTo:EOF
 fc/b "%~1" "%~2%~n1%$s%%~x1">nul&&(del/f/q "%~1"& GoTo:EOF)
 set/a "$n+=1"& set "$s=0!$n!"& set "$s=_!$s:~-2!"
GoTo:MoveRen_Loop
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:55, 17-01-2011 | #7


Аватара для Tosyk

Старожил


Сообщения: 166
Благодарности: 0

Профиль | Отправить PM | Цитировать


проверил, работает, проверяет, изменяет имя, по крайней мере первого уровня (_01.mat)

а как добавить ещё одну (или несколько) папку в обработку помимо Material3, пытаюсь сделать:


Код: Выделить весь код
@echo off
SETLOCAL EnableDelayedExpansion

for /f "delims=" %%d in ('dir/b/s/ad "Material3.*"') do if "%%~xd"=="" (
  for /f "delims=" %%f in ('dir/b/s/a-d "%%d"') do (
    set "$d=%%~dpf"& set "$d=!$d:%%~dpd=%%~dpd..\..\!"
    call:MoveRen "%%f" "!$d!"
))

:MoveRen  %source_file% %destin_folder%
::-------------------------------------
 set "$s="& set "$n="& if "%~1"=="" GoTo:EOF
 if not exist "%~2" md "%~2"||exit/b 1
:MoveRen_Loop
 if not exist "%~2%~n1%$s%%~x1" move "%~1" "%~2%~n1%$s%%~x1"& GoTo:EOF
 fc/b "%~1" "%~2%~n1%$s%%~x1">nul&&(del/f/q "%~1"& GoTo:EOF)
 set/a "$n+=1"& set "$s=0!$n!"& set "$s=_!$s:~-2!"
GoTo:MoveRen_Loop


for /f "delims=" %%d in ('dir/b/s/ad "MaterialConst.*"') do if "%%~xd"=="" (
  for /f "delims=" %%f in ('dir/b/s/a-d "%%d"') do (
    set "$d=%%~dpf"& set "$d=!$d:%%~dpd=%%~dpd..\..\!"
    call:MoveRen "%%f" "!$d!"
))

:MoveRen  %source_file% %destin_folder%
::-------------------------------------
 set "$s="& set "$n="& if "%~1"=="" GoTo:EOF
 if not exist "%~2" md "%~2"||exit/b 1
:MoveRen_Loop
 if not exist "%~2%~n1%$s%%~x1" move "%~1" "%~2%~n1%$s%%~x1"& GoTo:EOF
 fc/b "%~1" "%~2%~n1%$s%%~x1">nul&&(del/f/q "%~1"& GoTo:EOF)
 set/a "$n+=1"& set "$s=0!$n!"& set "$s=_!$s:~-2!"
GoTo:MoveRen_Loop
но получается только Material3, остальные скрипт не трогает.

Отправлено: 16:12, 17-01-2011 | #8


Новый участник


Сообщения: 48
Благодарности: 0

Профиль | Отправить PM | Цитировать


попробуйте программу robocopy . это типа xcopy и просто copy , так же она от Microsoft и имеет КУЧУ пользных и гибких ключей , для копирование и т.п.

Отправлено: 16:15, 17-01-2011 | #9


Аватара для Tosyk

Старожил


Сообщения: 166
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата forsem:
попробуйте программу robocopy . это типа xcopy и просто copy , так же она от Microsoft и имеет КУЧУ пользных и гибких ключей , для копирование и т.п. »
спасибо, я посмотрел, но с cmd я уже хотя бы более менее разбираюсь, а robocopy для меня сложновато, не нашёл там нужных функция даже

Отправлено: 16:22, 17-01-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Автозамена при перемещении

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Проблема с переносом разрешений при перемещении данных alnimo Microsoft Windows NT/2000/2003 5 21-12-2010 12:22
2003/XP/2000 - Изменение даты письма при перемещении между папками faktroot Microsoft Office (Word, Excel, Outlook и т.д.) 0 26-02-2010 17:58
Треск звука при перемещении мыши Dr. MefistO Непонятные проблемы с Железом 9 07-12-2008 14:26
Интерфейс - Неправильное отображение иконки файла при перемещении kopylovsergey Microsoft Windows 2000/XP 3 19-08-2008 11:24
[решено] Странная загрузка процессора при перемещении мыши DMGaster Microsoft Windows 2000/XP 12 13-09-2006 18:17




 
Переход