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

Компьютерный форум 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 | Цитировать


Цитата Tosyk:
с чем может быть связана невероятно низкая скорость работы скрипта? »
очевидно, из-за использования FC.EXE - при наличии одинаковых файлов проводится бинарное (байт за байтом) сравнение содержимого на предмет совпадения - это надёжней, чем сравнение размера, но и существенно медленней, варианты ускорения:

- ограничиться для сравнения размером, но могут встретиться два разных файла одного размера;
- использовать более быстрые альтернативы, чем FC.EXE... например, порт Unix-утилиты DIFF.EXE

Отправлено: 11:40, 18-01-2011 | #21



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

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


Аватара для Tosyk

Старожил


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

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


а если использовать diff.exe, то кинуть его в папку к скрипту, а скрипт будет выглядеть так?:

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

Call :MainExe Material3

EXIT

:MainExe  %folder_name%
::---------------------
 set "set $d="& if "%~1"=="" GoTo:EOF
 for /f "delims=" %%d in ('dir/b/s/ad "%~1.*"') 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!"
))
GoTo:EOF

: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
 diff/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

Отправлено: 12:11, 18-01-2011 | #22


Googler


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

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


конечно нет, у DIFF совсем другие ключи, заменяемая строка будет выглядеть так:
Код: Выделить весь код
diff -q --binary "%~1" "%~2%~n1%$s%%~x1">nul&& (del/f/q "%~1"&& GoTo:EOF||exit/b 3)

Отправлено: 12:28, 18-01-2011 | #23


Аватара для Tosyk

Старожил


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

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


а скажите, как тогда изменится весь скрипт?

так?:

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

Call :MainExe Material3

EXIT

:MainExe  %folder_name%
::---------------------
 set "set $d="& if "%~1"=="" GoTo:EOF
 for /f "delims=" %%d in ('dir/b/s/ad "%~1.*"') 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!"
))
GoTo:EOF

: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
 diff -q --binary "%~1" "%~2%~n1%$s%%~x1">nul&& (del/f/q "%~1"&& GoTo:EOF||exit/b 3)
 set/a "$n+=1"& set "$s=0!$n!"& set "$s=_!$s:~-2!"
GoTo:MoveRen_Loop

Отправлено: 12:44, 18-01-2011 | #24


Googler


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

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


Tosyk, не хочу замусоривать ветку копиями одного и того же кода (и вам не советую)
подсветил заменяемую строку в посте #16

Отправлено: 12:49, 18-01-2011 | #25


Аватара для Tosyk

Старожил


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

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


прошу меня простить, если нужно я почищу ветку

начинаю тестировать, натравил скрипт

Отправлено: 13:53, 18-01-2011 | #26


Аватара для Tosyk

Старожил


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

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


к сожалению скорости особо не прибавилось, после 600-700 элементов начинаются серьёзные задержки - 40-90 сек для каждого файла, и это только файлы размером в 1 кб, однако впереди файлы размером от 1 до 24 мегабайт (56000 элементов),

на самом деле я за надёжность!, но скажите как будет выглядеть скрипт не сравнивающий файлы по-байтно.

p.s.: и скрипт опять остановился на 814-ом файле

Отправлено: 08:22, 19-01-2011 | #27


Googler


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

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


Цитата Tosyk:
к сожалению скорости особо не прибавилось »
у этих утилит разный алгоритм: если FC для выдачи результата должен просканировать файл от начала до конца, то DIFF'у с опцией -Q достаточно дойти до первого отличающегося байта, чтобы выдать отрицательный результат сверки... Если замена не помогла, значит не поможет и "размер файла"... значит, проблема в другом - например, в большом количестве файлов и задержками интерпретатора, или "сдерживанием" скрипта со стороны ОС (тот же антивирус, который полностью отключить невозможно)

Цитата Tosyk:
скрипт опять остановился на 814-ом файле »
это какой-то постоянный файл?.. может у него какое-то особенное имя?.. про лог уже писал выше

Отправлено: 13:29, 19-01-2011 | #28


Аватара для Tosyk

Старожил


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

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


если скрипт применяется к каждому файлу отдельно, то скорее всего дело в задержке его какими-то условиями
Цитата amel27:
стороны ОС »
Цитата amel27:
тот же антивирус, который полностью отключить невозможно »
а как это проверить? ни в службах ни в программах отключенного касперсого нет

Цитата amel27:
это какой-то постоянный файл? »
нет, каждый раз разный, да и мне кажется дело не в имени, никаких специфических символов не используется, только буквы и цифры

Цитата amel27:
Если замена не помогла, значит не поможет и "размер файла" »
я даже не знаю, что поможет, возможно всё таки попробуем этот скрипт, который сверяет размер?

файлов действительно очень много

Отправлено: 13:42, 19-01-2011 | #29


Аватара для Tosyk

Старожил


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

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


amel27, приветствую, поможете мне?

Отправлено: 03:24, 26-01-2011 | #30



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




 
Переход