CMD/BAT - [решено] Автозамена при перемещении

Ответить
 • Просмотры: 2
Аватара пользователя
amel27

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение amel27 »

Цитата Tosyk:



с чем может быть связана невероятно низкая скорость работы скрипта?
CMD/BAT - [решено] Автозамена при перемещении




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



- ограничиться для сравнения размером, но могут встретиться два разных файла одного размера;

- использовать более быстрые альтернативы, чем FC.EXE... например, порт Unix-утилиты DIFF.EXE
Аватара пользователя
Tosyk

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение Tosyk »

Работает чётко! Спасибо



а как сделать чтобы после перемещения удалялась исходная папка?



Допустим такая структура:





Код:

Код: Выделить всё

_export_
               fold01
                         Material3
                         MaterialConst
                         MatsFull
               fold02
                         Material3
                         MaterialConst
                         MatsFull

получается в папке _export_ после завершения операции 0 байт, я пробую удалить её командой





Код:

Код: Выделить всё

RD /S/Q _export_

написав её в конце скрипта, но скрипт просто игнорирует её.



p.s.: я не проигнорировал упоминание ROBOCOPY, просто во-первых я "тупо не шарю", извените за сленг, а во-вторых я считаю, что если взялся за что-то одно, его нужно завершить.
Аватара пользователя
Tosyk

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение Tosyk »

такая непонятность:



скрипт завис (не крашился а завис) на 814 файле и не идёт дальше.



касперский негодует



в диспетчере задач постоянно выскакивает и пропадает процесс
fc.exe




папки с файлами Material3 ещё есть
Аватара пользователя
amel27

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение amel27 »

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



так?:





Код:

Код: Выделить всё

@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
Аватара пользователя
Tosyk

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение Tosyk »

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

подсветил заменяемую строку в посте
CMD/BAT - [решено] Автозамена при перемещении
Аватара пользователя
Tosyk

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение Tosyk »

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



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

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение Tosyk »

Отключил антивирус, запустил скрипт снова, перемещено 3 500 файлов (вкупе 4 папки), полёт нормальный, в первый раз ошибок не заметил, постоянно наблюдал, на экране написано 1 file(s) moved - много раз.



p.s.: осталась самая полновесная папка - 56 000 элементов.
Аватара пользователя
Tosyk

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение Tosyk »

Цитата Tosyk:



к сожалению скорости особо не прибавилось
CMD/BAT - [решено] Автозамена при перемещении




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




Цитата Tosyk:



скрипт опять остановился на 814-ом файле
CMD/BAT - [решено] Автозамена при перемещении




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

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение Tosyk »

если скрипт применяется к каждому файлу отдельно, то скорее всего дело в задержке его какими-то условиями
Цитата amel27:



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





Цитата amel27:



тот же антивирус, который полностью отключить невозможно
CMD/BAT - [решено] Автозамена при перемещении




а как это проверить? ни в службах ни в программах отключенного касперсого нет




Цитата amel27:



это какой-то постоянный файл?
CMD/BAT - [решено] Автозамена при перемещении




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




Цитата amel27:



Если замена не помогла, значит не поможет и "размер файла"
CMD/BAT - [решено] Автозамена при перемещении




я даже не знаю, что поможет, возможно всё таки попробуем этот скрипт, который сверяет размер?



файлов действительно очень много
Аватара пользователя
amel27

Re: CMD/BAT - [решено] Автозамена при перемещении

Сообщение amel27 »

конечно нет, у DIFF совсем другие ключи, заменяемая строка будет выглядеть так:



Код:

Код: Выделить всё

diff -q --binary "%~1" "%~2%~n1%$s%%~x1">nul&& (del/f/q "%~1"&& GoTo:EOF||exit/b 3)
Ответить

Вернуться в «Скриптовые языки администрирования Windows»