Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Автозамена при перемещении (http://forum.oszone.net/showthread.php?t=196684)

Tosyk 15-01-2011 09:16 1589095

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

скриптом:

Код:

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

amel27 15-01-2011 13:08 1589210

- ключ /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"
)


Tosyk 15-01-2011 13:13 1589214

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

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

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

Код:

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

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

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

amel27 15-01-2011 19:53 1589432

Цитата:

Цитата 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-й запуск поднимет также и целевую папку, т.к. у них одинаковые имена

Tosyk 15-01-2011 19:55 1589433

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

Tosyk 16-01-2011 14:08 1589846

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

amel27 17-01-2011 11:55 1590522

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


Tosyk 17-01-2011 16:12 1590769

проверил, работает, проверяет, изменяет имя, по крайней мере первого уровня (_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, остальные скрипт не трогает.

forsem 17-01-2011 16:15 1590772

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

Tosyk 17-01-2011 16:22 1590778

Цитата:

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

спасибо, я посмотрел, но с cmd я уже хотя бы более менее разбираюсь, а robocopy для меня сложновато, не нашёл там нужных функция даже

amel27 17-01-2011 16:48 1590790

Цитата:

Цитата Tosyk
а как добавить ещё одну (или несколько) папку в обработку »

оформить как процедуру:
Код:

@echo off
SETLOCAL EnableDelayedExpansion

Call :MainExe Material3
Call :MainExe MaterialConst

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
 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

P.S. имя папки должно быть без расширения (особенность алгоритма)

Tosyk 17-01-2011 16:58 1590805

amel27, не понимаю зависимости, как добавить ещё несколько папок, не разберу из последнего скрипта.

нужно просто добавлять к

Код:

Call :MainExe Material3
Call :MainExe MaterialConst

новые папки
Код:

Call :MainExe Folder01
Call :MainExe Folder02

так ли это?

amel27 17-01-2011 17:13 1590821

Tosyk, да

кстати, зря проигнорировали предложение forsem,
в отличие от XCOPY, у ROBOCOPY есть ключ по перемещению папок

Tosyk 17-01-2011 17:43 1590861

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

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

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

Код:

_export_
              fold01
                        Material3
                        MaterialConst
                        MatsFull
              fold02
                        Material3
                        MaterialConst
                        MatsFull

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

Код:

RD /S/Q _export_
написав её в конце скрипта, но скрипт просто игнорирует её.

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

Tosyk 18-01-2011 06:12 1591198

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

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

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

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

папки с файлами Material3 ещё есть

amel27 18-01-2011 06:32 1591204

Цитата:

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

вариант с удалением успешно перемещенных папок:
Код:

@echo off
SETLOCAL EnableDelayedExpansion

Call :MainExe Material3
Call :MainExe MaterialConst

EXIT

:MainExe  %folder_name%
::---------------------
 set "set $d="& if "%~1"=="" GoTo:EOF
 for /f "delims=" %%d in ('dir/b/s/ad "%~1.*"') do if "%%~xd"=="" (
  set "$e=0"& for /f "delims=" %%f in ('dir/b/s/a-d "%%d"') do (
    set "$d=%%~dpf"& set "$d=!$d:%%~dpd=%%~dpd..\..\!"
    call:MoveRen "%%f" "!$d!"||set/a $e+=1 )
  if !$e!==0 rd /s/q "%%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||exit/b 2
 fc/b "%~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 18-01-2011 06:50 1591210

Спасибо, а как быть с остановившимся процессом, касперский отключил, но ничего не изменилось?

p.s.: последний файл был M01_00.mat

amel27 18-01-2011 07:21 1591219

Цитата:

Цитата Tosyk
как быть с остановившимся процессом »

смотря что хотите, вообще анализ ошибок через запуск:
Код:

script.bat >script.log 2>&1
...и смотрим лог "script.log", только в батнике предварительно поправить 1 строку: "@echo off" -> "@echo on"


P.S. антивирус может блокировать файлы и тем самым препятствовать их удалению/переименованию

Tosyk 18-01-2011 07:34 1591221

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

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

Tosyk 18-01-2011 09:59 1591271

а с чем может быть связана невероятно низкая скорость работы скрипта? без касперского

примерно 2-3 файла в 5-9 минут

виндовс на компе несколько дней, никаких лишних программ не стоит даже офиса нет

amel27 18-01-2011 11:40 1591331

Цитата:

Цитата Tosyk
с чем может быть связана невероятно низкая скорость работы скрипта? »

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

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

Tosyk 18-01-2011 12:11 1591356

а если использовать 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


amel27 18-01-2011 12:28 1591367

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

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

Tosyk 18-01-2011 12:44 1591383

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

так?:

Код:

@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


amel27 18-01-2011 12:49 1591385

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

Tosyk 18-01-2011 13:53 1591438

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

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

Tosyk 19-01-2011 08:22 1592026

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

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

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

amel27 19-01-2011 13:29 1592249

Цитата:

Цитата Tosyk
к сожалению скорости особо не прибавилось »

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

Цитата:

Цитата Tosyk
скрипт опять остановился на 814-ом файле »

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

Tosyk 19-01-2011 13:42 1592257

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

Цитата amel27
стороны ОС »

Цитата:

Цитата amel27
тот же антивирус, который полностью отключить невозможно »

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

Цитата:

Цитата amel27
это какой-то постоянный файл? »

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

Цитата:

Цитата amel27
Если замена не помогла, значит не поможет и "размер файла" »

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

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

Tosyk 26-01-2011 03:24 1597363

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

amel27 26-01-2011 04:06 1597366

Tosyk, увы, мне отсюда не видно,
пост #18 - как получить лог для проблемного запуска (и не забыть убрать @echo off)

Tosyk 26-01-2011 04:36 1597368

Хорошо, сейчас сделаю распаковку, а затем с логом запущу скрипт.

Я всего лишь хотел попросить помочь со скриптом проверяющим только размер. возможно получилось бы, потому что распаковка занимает часа 4, плюс скрипт "по теме" до проблемного места (814 файл) работает около 2 часов

amel27 26-01-2011 05:01 1597374

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

Tosyk 26-01-2011 08:57 1597417

скрипт остановился на 814 файле, на том же самом (M01_00.mat), оказывается он всегда на этом файле останавливается, прошлый раз я был не прав когда сказал, что всегда последний файл другой.

так вот, в "подопытной структуре" остались ещё папки Material3 с примерно сотней файлов *.mat.

насмотря на остановку скрипта, в лог он продолжал записывать, да так много, что script.log вырос до 45 мегабайт, я остановил скрипт. Касперский сходит с ума сейчас.

нужен этот лог?

я посмотрел в него и вот, что выяснил:
- оригинальный файл называется M01.mat
- обработка M01.mat начинается с середины script.log и ему присваивается индекс _00
- далее всем файлам M01.mat отличающимся по содержанию присваивается индекс от _00 до _99
- нашёл папку, на которой останавливается работа скрипта и дальше во всех папках присутствуют необработанные *.mat, наряду с большим количеством (относительно других) M01.mat

вывод, личный, так как не специалист:

скрипт обрабатывает 100 разных файлов M01.mat, затем повторяет операцию над последним файлом снова и снова, что и было замечано в script.log: обработчик поочерёдно пытается одному и тому же файлу присвоить индекс от _00 до _99, после неудачи операция повторяется.

amel27 26-01-2011 09:28 1597430

Цитата:

Цитата Tosyk
скрипт обрабатывает 100 разных файлов M01.mat, затем повторяет операцию над последним файлом снова и снова, что и было замечано в script.log: обработчик поочерёдно пытается одному и тому же файлу присвоить индекс от _00 до _99, после неудачи операция повторяется. »

вполне логично - выделение под номер только двух знаков предполагает, что одинаковых файлов будет не больше 100

Tosyk 26-01-2011 09:31 1597433

а как тогда быть со скриптом? что нужно исправить в нём для добавления индекса с большим числом знаков?

amel27 26-01-2011 09:48 1597442

а сколько знаков хватит?.. три?.. четыре?

Tosyk 26-01-2011 09:55 1597445

на много время обработки вырастет если добавить:
Цитата:

Цитата amel27
три?.. четыре? »

или нет прямой зависимости?

в любом случае нужно не менее 4 символов!

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

amel27 26-01-2011 10:05 1597448

Цитата:

Цитата Tosyk
на много время обработки вырастет если добавить »

От количества знаков скорость не зависит... Кстати, почему такой странный способ определения папки назначения - два уровня вверх относительно текущего расположения? Не проще явно указать путь назначения?.. Скажем, каталог с батником.

Tosyk 26-01-2011 10:25 1597456

Цитата:

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

СХЕМА РАБОТЫ ТАКАЯ:


У МЕНЯ ЕСТЬ СТРУКТУРА:

<root>\extractor.exe
<root>\archives_container\сколь угодно глубокая и сложная структура, содержит архивы
<root>\script.bat

каждый архив содержит одинаковую структуру папок, но разные (в основном) имена файлов:

----- Назову условно структуру - STRUCT01 -----

[strucrt01]
Material3\содержит *.mat файлы
MatInst\содержит *.mat файлы
...
FolderLast\содержит *.tga файлы
[/strucrt01]


РАБОТА СКРИПТА:

1 - распаковка архивов происходит в структуру:

<root>\_extracted\название_1-ого-архива\STRUCT01\файлы
<root>\_extracted\название_2-ого-архива\STRUCT01\файлы
...и т.д.

2 - теперь начинает работать скрипт по поиску и переносу файлов:

например он нашёл файл M01.mat в
<root>\_extracted\название_1-ого-архива\Material3\

и переносит его в папку (используя как раз 2 уровня вверх):
<root>\Material3\

получается у меня в корне будут все нужные мне папки (около 5-6) с файлами, вместо очень большого количества файлов в папке:
<root>\_extracted\

которая после завершения операции должна быть 0 байт

p.s.: надеюсь не слишком тупо написал, хотел как понятнее

amel27 26-01-2011 11:12 1597477

Tosyk, если переносятся ВСЕ подпапки со 2-го уровня, тогда какая разница как они называются - Material3 или еще как?.. или их надо фильтровать по имени на стадии переноса?..
Цитата:

Цитата Tosyk
<root>\script.bat »

Т.е. можно считать, что папкой назначения будет каталог с батником?

Tosyk 26-01-2011 11:17 1597480

Цитата:

Цитата amel27
Т.е. можно считать, что папкой назначения будет каталог с батником? »

да так и есть!

Цитата:

Цитата amel27
Tosyk, если переносятся ВСЕ подпапки со 2-го уровня, тогда какая разница как они называются - Material3 или еще как?.. или их надо фильтровать по имени на стадии переноса?.. »

надо по сути все папки, допустим Material3 слить в одну, не важно где последняя будет находится, но удобнее всего в корне со скриптом

amel27 26-01-2011 13:21 1597586

Цитата:

Цитата Tosyk
по-поводу скрипта проверяющего размер »

как-то так:
Код:

@echo off
set root=.\_export_
if not exist "%root%" echo Can't find root folder!& pause>nul& exit

SETLOCAL EnableDelayedExpansion
for %%a in ("%root%") do set "rpth=%%~fa"

<nul set/p $="Scanning and preparing folders..."
(for /d %%a in ("%rpth%") do for /d %%b in ("%%~a\*") do for /d %%c in ("%%~b\*") do (
xcopy /q/t "%%~c\*" ".\%%~nc\">nul
echo "%%~c"))>"%~dpn0.$~1"
echo OK& <nul set/p $="Scanning files for moving..."
(for /f "usebackq delims=" %%a in ("%~dpn0.$~1") do (
for /f "delims=" %%b in ('dir/b/s/a-d "%%~a\*"2^>nul') do (set "$b=%%b"
echo "!$b:%%~a=%~dp0%%~na!"?"%%~zb"?"!$b!"
)))>"%~dpn0.$~2"
echo OK& <nul set/p $="Sorting file list..."
sort /l "C" "%~dpn0.$~2" /o "%~dpn0.$~3"
echo OK& <nul set/p $="Processing file list..."
set "$a="& set "$b="& set/a "$n1=0,$n2=0,$n3=0"
for /f "usebackq tokens=1-3 delims=?" %%a in ("%~dpn0.$~3") do (
 if not "!$a!"=="%%~a" (
  move "%%~c" "%%~a"
  set "$a=%%~a"& set "$b=%%~b"& set/a "$k=0,$n1+=1"
 ) else if not "!$b!"=="%%~b" (
  set/a "$k+=1,$n2+=1"& set "$k=000!$k!"& set "$b=%%~b"
  move "%%~c" "%%~dpna_!$k:~-4!%%~xa"
  ) else set/a $n3+=1
)
echo OK& <nul set/p $="Deleting source folder..."
set/a "$n0=$n1+$n2+$n3"& rd /s/q "%rpth%"
echo OK& echo(& echo Processed files all: !$n0!, including:& echo(
echo moved        : %$n1%
echo renamed      : %$n2%
echo copies deleted: %$n3%

ENDLOCAL
echo(& echo Script works complited!
pause>nul


Tosyk 26-01-2011 14:25 1597640

ой, а как добавить папки в обработку? или как он работает?

amel27 26-01-2011 16:27 1597718

Цитата:

Цитата Tosyk
как добавить папки в обработку? »

вбить имя своей папки корневого каталога (выделено синим)
Цитата:

Цитата Tosyk
как он работает? »

все подкаталоги 2-го уровня заданной корневой папки поднимает до текущей

Tosyk 26-01-2011 17:07 1597738

говорит
Код:

Непредвиденное появление: \%~na!?%~zb?!$b!.

amel27 26-01-2011 17:18 1597745

Цитата:

Цитата Tosyk
Непредвиденное появление: \%~na!?%~zb?!$b!. »

нужен лог по всем правилам

Tosyk 26-01-2011 18:49 1597808

лог такой:

Код:

Сканирование и подготовка каталогов...OK
Сканирование файлов для переноса...


amel27 27-01-2011 04:05 1598053

Цитата:

Цитата Tosyk
лог такой »

порядок формирования лога в постах #18, #31
для целей отладки пришлось пока пожертвовать скоростью

Tosyk 27-01-2011 05:01 1598059

я серьёзно, именно это
Цитата:

Цитата Tosyk
Сканирование и подготовка каталогов...OK
Сканирование файлов для переноса... »

написано в файле script.log

amel27 27-01-2011 05:25 1598061

Tosyk, обновите батник, уберите "@echo off" и повторите вывод в лог

Tosyk 27-01-2011 05:33 1598062

теперь пишет это:
Код:

F:\il tempo>SETLOCAL EnableDelayedExpansion

F:\il tempo>set root=.\_export_

F:\il tempo>for %a in (".\_export_") do set "rpth=%~fa"

F:\il tempo>set "rpth=F:\il tempo\_export_"

F:\il tempo>set/p $="Сканирование и подготовка каталогов..." 0<nul
Сканирование и подготовка каталогов...
F:\il tempo>(for / %a in ("F:\il tempo\_export_") do @for / %b in ("%a\*") do @for / %c in ("%b\*") do @(
xcopy /q /t "%c\*" ".\%~nc\" 1>nul 2>&1 
 echo %c
) ) 1>"F:\il tempo\script_only_mover_2.$~1"

F:\il tempo>echo OK  & set/p $="Сканирование файлов для переноса..." 0<nul
OK
Сканирование файлов для переноса...
F:\il tempo> echo !$b:%a=F:\il tempo\%~na!?%~zb?!$b!

файл скрипта называется script_only_mover_2.bat
и появился файл в корне script_only_mover_2.$~1

amel27 27-01-2011 05:43 1598065

Цитата:

Цитата Tosyk
теперь пишет это »

это старый код!.. и где сообщение об ошибке?

Tosyk 27-01-2011 05:56 1598068

ааа, скрипт обновлён в прошлом сообщении, сразу не понял, что значит обновить скрипт

вот содержание лога:
Код:

F:\il tempo>set root=.\_export_

F:\il tempo>if not exist ".\_export_" echo Не найден корневой каталог!  & pause1>nul  & exit

F:\il tempo>SETLOCAL EnableDelayedExpansion  & for %a in (".\_export_") do set "rpth=%~fa"

F:\il tempo>set "rpth=F:\il tempo\_export_"

F:\il tempo>set/p $="Сканирование и подготовка каталогов..." 0<nul
Сканирование и подготовка каталогов...
F:\il tempo>type nul  1>"F:\il tempo\script_only_mover_2.$~1"

F:\il tempo>(for / %a in ("F:\il tempo\_export_") do @for / %b in ("%a\*") do @for / %c in ("%b\*") do @(
xcopy /q/t "%c\*" ".\%~nc\" 1>nul 
 echo %c 1>>"F:\il tempo\script_only_mover_2.$~1"
) )

F:\il tempo>echo OK  & set/p $="Сканирование файлов для переноса..." 0<nul
OK
Сканирование файлов для переноса...
F:\il tempo>type nul  1>"F:\il tempo\script_only_mover_2.$~2"

F:\il tempo>>>"F:\il tempo\script_only_mover_2.$~2" echo !$b:%a=F:\il tempo\%~na!?%~zb?!$b!


amel27 27-01-2011 06:46 1598079

Цитата:

Цитата Tosyk
ааа, скрипт обновлён в прошлом сообщении »

с таким подходом мы и к следующему Новому году не управимся
Цитата:

Цитата Tosyk
вот содержание лога »

это уже лучше, но всё равно неверно - нет сообщения об ошибке, значит в команде вывода не указан ключ "2>&1" всё из того же поста #18
одну ошибку исправил - проверяйте

Tosyk 27-01-2011 07:02 1598086

запустил команду script_only_mover_2.bat >script.log 2>&1, убрав "@echo off"

ничего не видно в окне cmd, но размер script.log меняется, плюс создался и меняется такой файл script_only_mover_2.$~1

в общем процесс я так понимаю идёт

amel27 27-01-2011 07:09 1598087

Цитата:

Цитата Tosyk
script_only_mover_2.bat >script.log 2>&1, убрав "@echo off" »

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

Tosyk 27-01-2011 08:22 1598102

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

скрипт создал в корне структуру [struct01] из этого поста #40 и всё, пустые папки, файлы на месте (в .\_export_\)

нужен этот лог?

плюс ещё в корне лежит файл script_only_mover_2.$~1 (536кб)

amel27 27-01-2011 09:29 1598133

Цитата:

Цитата Tosyk
нужен этот лог? »

запакуй лог вместе с временными файлами ($~1 и подобные) и кинь на обменник

Tosyk 27-01-2011 10:09 1598154

http://dl.dropbox.com/u/9919707/scri...nly_mover_2.7z

amel27 27-01-2011 10:55 1598204

Tosyk, ничего особенного - из лога видно, что процесс был прерван вручную комбинацией Ctrl+C, попробуйте сначала прогнать скрипт без лога, либо уменьшите количество папок - с логом скрипт работает в десятки раз медленней

Tosyk 27-01-2011 11:43 1598246

Запустил опять остановился, странно опять остановился на том же самом каталоге на котором останавливался и самый первый скрипт из темы, имя каталога "wp_Zephi_st2_3_Rose". это первый каталог в котором в Material3 присутствует уже упомянутый M01.mat. Сподкнулся он именно на этом файле, т.к в script_only_mover_2.$~1 существует последовательность:

Код:

...
..\_export_\wp_Zephi_st2_1_Sakura\Texture2D
..\_export_\wp_Zephi_st2_1_Sakura\SkeletalMesh
..\_export_\wp_Zephi_st2_1_Sakura\Material3
..\_export_\wp_Zephi_st2_1_Sakura\StaticMesh
..\_export_\wp_Zephi_st2_2_Narcissus\Texture2D
..\_export_\wp_Zephi_st2_2_Narcissus\SkeletalMesh
..\_export_\wp_Zephi_st2_2_Narcissus\Material3
..\_export_\wp_Zephi_st2_2_Narcissus\StaticMesh
..\_export_\wp_Zephi_st2_3_Rose\Texture2D
..\_export_\wp_Zephi_st2_3_Rose\SkeletalMesh

дальше должен быть каталог
Код:

..\_export_\wp_Zephi_st2_3_Rose\Material3
в котором как раз находится первый *.mat - M01.mat! до этого ни в одной папке Material3 нет фалов (результат работы первого скрипта), эти файлы в корне в папке Material3 (напомню их 814)

amel27 27-01-2011 14:31 1598403

Цитата:

Цитата Tosyk
в котором как раз находится первый *.mat - M01.mat! »

Первый блок кода (тот что формирует файл .$~1) вообще игнорирует файлы - он только перечисляет имена подкаталогов 2-го уровня + "вытаскивает" их структуру без файлов (строка с XCOPY)... Вот этот кусок с закомментированной командой XCOPY:
Код:

@echo off
set root=.\_export_
if not exist "%root%" echo Не найден корневой каталог!& pause>nul& exit

SETLOCAL EnableDelayedExpansion
for %%a in ("%root%") do set "rpth=%%~fa"

type nul >"%~dpn0.$~1"
(for /d %%a in ("%rpth%") do for /d %%b in ("%%~a\*") do for /d %%c in ("%%~b\*") do (
 REM xcopy /t "%%~c\*" ".\%%~nc\"
 >>"%~dpn0.$~1" echo %%~c
))

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

Tosyk 27-01-2011 15:05 1598424

запустил скрипт (script_only_structer_4_eng.bat), появилось чёрное окно cmd, во время выполнения появился и рос файл script_only_structer_4_eng.$~1, в нём список папок из _export_

скрипт почему-то проигнорировал 2 последние папки:

Zephi_Yupa2_SS_0038
Zephi_Yupa2_SS_0243

amel27 27-01-2011 16:38 1598493

Цитата:

Цитата Tosyk
в нём список папок из _export_ »

А вот и неправильно! В нём список подпапок папок из _export_, т.е. если папка ".\_export_\Zephi_Yupa2_SS_0038" не содержит подпапок, то в список и включать нечего... Кстати, как там начет XCOPY?.. Например, команда для "wp_Zephi_st2_3_Rose\Material3" должна получиться такой:
Код:

xcopy /t ".\_export_\wp_Zephi_st2_3_Rose\Material3\*" ".\Material3\"

Tosyk 27-01-2011 17:17 1598530

Цитата:

Цитата amel27
В нём список подпапок папок из _export_ »

да-да, верно, я это и имел ввиду

Цитата:

Цитата amel27
т.е. если папка ".\_export_\Zephi_Yupa2_SS_0038" не содержит подпапок, то в список и включать нечего... »

как раз папка содержит всё тоже самое, что и остальные

Цитата:

Цитата amel27
Кстати, как там начет XCOPY? »

т.е. нужно заменить строку из #63
Код:

REM xcopy /t "%%~c\*" ".\%%~nc\"
на
Цитата:

Цитата amel27
xcopy /t ".\_export_\wp_Zephi_st2_3_Rose\Material3\*" ".\Material3\" »

?

amel27 27-01-2011 18:27 1598576

Цитата:

Цитата Tosyk
как раз папка содержит всё тоже самое, что и остальные »

тогда только вывести структуру в файл (dir.txt) и выложить этот файл на обменник:
Код:

dir /b/s/ad .\_export_\* >dir.txt
Цитата:

Цитата Tosyk
т.е. нужно заменить строку из #63 »

как уже сказал - "раскомментировать", т.е. убрать REM

Цитата:

Цитата Tosyk
xcopy /t ".\_export_\wp_Zephi_st2_3_Rose\Material3\*" ".\Material3\"

эту команду можно проверить и без батника

Tosyk 29-01-2011 11:44 1599731

Цитата:

Цитата amel27
тогда только вывести структуру в файл (dir.txt) и выложить этот файл на обменник »

http://dl.dropbox.com/u/9919707/script_working/dir.txt - вот
Цитата:

Цитата amel27
как уже сказал - "раскомментировать", т.е. убрать REM »

процесс идёт!

ДОБАВКА: скрипт меня спросил о замене файла M01.mat в корне\Material3, если я нажму да/всё, он просто всё заменит?

Цитата:

Цитата amel27
xcopy /t ".\_export_\wp_Zephi_st2_3_Rose\Material3\*" ".\Material3\"
эту команду можно проверить и без батника »

по окнчании процесса сделаю!

amel27 29-01-2011 17:20 1599914

Цитата:

Цитата Tosyk
скрипт почему-то проигнорировал 2 последние папки »

да нет, у меня вывел все папки до одной

Цитата:

Цитата Tosyk
скрипт меня спросил о замене файла M01.mat в корне\Material3, если я нажму да/всё, он просто всё заменит? »

батник в посте #63 ничего не должен заменять/спрашивать (даже с XCOPY), т.к. он ничего не копирует - только создаёт структуру пустых каталогов

Tosyk 29-01-2011 18:02 1599939

Цитата:

Цитата amel27
как уже сказал - "раскомментировать", т.е. убрать REM »

Цитата:

Цитата amel27
xcopy /t ".\_export_\wp_Zephi_st2_3_Rose\Material3\*" ".\Material3\" »

всё это работает если в корне нет Material3 с файлами!

извените за ре-пост скрипта, но я уже начинаю запутываться в вариантах, поэтому буду отталкиваться от этого:
Код:

@echo off
set root=.\_export_
if not exist "%root%" echo Can't find root folder!& pause>nul& exit

SETLOCAL EnableDelayedExpansion
for %%a in ("%root%") do set "rpth=%%~fa"

<nul set/p $="Scaning and preparing folders..."
type nul >"%~dpn0.$~1"
(for /d %%a in ("%rpth%") do for /d %%b in ("%%~a\*") do for /d %%c in ("%%~b\*") do (
 xcopy /q/t "%%~c\*" ".\%%~nc\">nul
 >>"%~dpn0.$~1" echo %%~c
))
echo OK& <nul set/p $="Scaning files for moving..."
type nul >"%~dpn0.$~2"
(for /f "usebackq delims=" %%a in ("%~dpn0.$~1") do (
 for /f "delims=" %%b in ('dir/b/s/a-d "%%a\*"') do (set "$b=%%b"
 >>"%~dpn0.$~2" echo !$b:%%a=%~dp0%%~na!?%%~zb?!$b!
)))
echo OK& <nul set/p $="Sorting file list..."
sort /l "C" "%~dpn0.$~2" /o "%~dpn0.$~3"
echo OK& <nul set/p $="Working with file list..."
set "$a="& set "$b="& set/a "$n1=0,$n2=0,$n3=0"
for /f "usebackq tokens=1-3 delims=?" %%a in ("%~dpn0.$~3") do (
 if not "!$a!"=="%%a" (
  move "%%c" "%%a"
  set "$a=%%a"& set "$b=%%b"& set/a "$k=0,$n1+=1"
 ) else if not "!$b!"=="%%b" (
  set/a "$k+=1,$n2+=1"& set "$k=000!$k!"& set "$b=%%b"
  move "%%c" "%%~dpna_!$k:~-4!%%~xa"
  ) else set/a $n3+=1
)
echo OK& <nul set/p $="Deleting source folder..."
set/a "$n0=$n1+$n2+$n3"& rd /s/q "%rpth%"
echo OK& echo.& echo.Processed files all: !$n0!, из них:& echo.
echo.moved    : %$n1%
echo.renamed : %$n2%
echo.copies deleted: %$n3%
ENDLOCAL
echo.& echo Script works complited!
pause>nul

Запустил его, по окончании я отпишу результат

amel27 29-01-2011 18:31 1599954

Цитата:

Цитата Tosyk
всё это работает если в корне нет Material3 с файлами! »

само собой, до запуска скрипта этих папок там не должно быть, этот вариант батника не предусматривает многократный запуск

Цитата:

Цитата Tosyk
я уже начинаю запутываться в вариантах »

дык и не постите код без нужды, вариант-то всего один в посте #43... но если есть проблемы, нужно отлаживать по частям, в посте #63 первая часть баника с формированием 1-го временного файла

Tosyk 29-01-2011 18:44 1599963

скрипт завершил работу: создал все папки (пустые) и 2 файла:

_only_mover_3_eng.$~1
_only_mover_3_eng.$~2 - пустой

что теперь делать?

amel27 30-01-2011 12:24 1600329

Цитата:

Цитата Tosyk
что теперь делать? »

1-й временный файл сформирован, значит 1-я часть батника отработала без ошибок... 2-я часть батника на базе $~1-файла строит список файлов для каждого подкаталога и записывает в файл $~2, вот её код:
Код:

@echo on
set root=.\_export_
if not exist "%root%" echo Can't find root folder!& pause>nul& exit

SETLOCAL EnableDelayedExpansion
for %%a in ("%root%") do set "rpth=%%~fa"

type nul >"%~dpn0.$~2"
(for /f "usebackq delims=" %%a in ("%~dpn0.$~1") do (
for /f "delims=" %%b in ('dir/b/s/a-d "%%~a\*"2^>nul') do (set "$b=%%b"
>>"%~dpn0.$~2" echo "!$b:%%a=%~dp0%%~na!"?"%%~zb"?"!$b!"
)))

имя скрипта и $~1-файла должны совпадать, например:
Код:

_only_mover_test.$~1
_only_mover_test.bat

запуск с выводом в лог:
Код:

_only_mover_test.bat >_only_mover_test.log 2>&1

Tosyk 30-01-2011 13:59 1600411

Не понимаю, а разве скрипт из #70 не должен был ничего переносить? В нём ведь написано moved и.т.д

amel27 30-01-2011 14:36 1600434

Tosyk, если файл .$~2 пустой, значит спискок файлов для перемещения не сформирован - либо в подкаталогах из .$~1 скрипт не нашел файлов, либо какая-то другая ошибка - вот это и надо теперь выяснить...

P.S. все эти движения называются отладкой (частей) кода скрипта на реальных данных

Tosyk 30-01-2011 15:24 1600454

http://dl.dropbox.com/u/9919707/scri...over_3_eng.log

вот лог

_only_mover_3_eng.$~2 пустой

amel27 31-01-2011 12:49 1601094

Цитата:

Цитата Tosyk
вот лог »

странно, но я не смог воспроизвести эту ошибку у себя на XP/2003, ведь если тупо:

- копируем в любой каталог два файла:
Код:

_only_mover_test.$~1 - результат работы 1-й части скрипта (пост #63)
_only_mover_test.bat - скрипт из поста #73

- создаём в этом же каталоге папку "_export_" (пустую);
- запускаем скрипт:
Код:

_only_mover_test.bat >_only_mover_test.log 2>&1
в результате должен создаться пустой _only_mover_test.$~2 (файлов нет), но БЕЗ ОШИБОК

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

Tosyk 09-02-2011 05:30 1608123

попробовал с изменённым скриптом из поста #73, всё сработало, по крайней мере _only_mover_3_eng.$~2 теперь не пустой, приложил к посту файлы:

_only_mover_3_eng.$~1 -- 320 kb
_only_mover_3_eng.$~2 -- 19000 kb
_only_mover_3_eng.log -- 8500 kb

http://dl.dropbox.com/u/9919707/scri...ipt_working.7z

add:
распаковал снова всё в папку "./_export_/". Может быть теперь попробуем какую-то полную версию скрипта?

Tosyk 10-02-2011 07:45 1609047

amel27, возможно ли продолжить наше обсуждение? вроде как в нужном направлении идём, хотелось бы закончить

amel27 11-02-2011 12:21 1610149

Tosyk, за неделю уже забыл о чем речь....

3-й этап (требуется наличие файла .$~2):
читать дальше »
Код:

@echo off
set root=.\_export_
if not exist "%root%" echo Can't find root folder!& pause>nul& exit

SETLOCAL EnableDelayedExpansion
for %%a in ("%root%") do set "rpth=%%~fa"

<nul set/p $="Sorting file list..."
sort /l "C" "%~dpn0.$~2" /o "%~dpn0.$~3"

echo OK


4-й этап (требуется наличие файла .$~3):
читать дальше »
Код:

@echo off
set root=.\_export_
if not exist "%root%" echo Can't find root folder!& pause>nul& exit

SETLOCAL EnableDelayedExpansion
for %%a in ("%root%") do set "rpth=%%~fa"

<nul set/p $="Processing file list..."
set "$a="& set "$b="& set/a "$n1=0,$n2=0,$n3=0"
for /f "usebackq tokens=1-3 delims=?" %%a in ("%~dpn0.$~3") do (
 if not "!$a!"=="%%~a" (
  move "%%~c" "%%~a"
  set "$a=%%~a"& set "$b=%%~b"& set/a "$k=0,$n1+=1"
 ) else if not "!$b!"=="%%~b" (
  set/a "$k+=1,$n2+=1"& set "$k=000!$k!"& set "$b=%%~b"
  move "%%~c" "%%~dpna_!$k:~-4!%%~xa"
  ) else set/a $n3+=1
)

echo OK& echo(& echo Processed files all: !$n0!, including:& echo(
echo moved          : %$n1%
echo renamed        : %$n2%
echo copies detected: %$n3%


P.S. все изменения отразил в посте #43

Tosyk 13-02-2011 06:05 1611516

спасибо, сейчас хочу запустить этот глобальный скрипт из поста #43, как я понял он то и сделает всю работу, так вот возможно ли сделать вывод в лог с отображением процесса в окне cmd?

add: в принципе не принципиально, я понял, что там особой информации нет в процессе.

Tosyk 13-02-2011 08:45 1611538

Ну что ж, скрипт работу завершил, вот последние строки:

Код:

Deleting source folder...OK

Processed files all: 75748, including:

moved        : 12518
renamed      : 5812
copies deleted: 57418

Script works complited!

папка _export_ удалена, все нужные с проверенными\переименованными файлами папки создались. Скрипт отработал примерно 1:20 никаких зависаний работы либо системы не было.

не сочтите за наглость, в довершение вот, что хотелось бы:

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

уже есть первый файл:

F:\il tempo\SkeletalMesh\sm.bmp

второй файл распологается в:

F:\il tempo\_export_\01_SenLab_02bossarea\SkeletalMesh\sm.bmp"

он прошёл проверку на "разность" и копируется в папку с первым файлом с именем sm_0001.bmp, а можно ли к этому имени добавить папку его содержащую, чтобы было так:

F:\il tempo\SkeletalMesh\sm_0001_01_SenLab_02bossarea.bmp

?

amel27 13-02-2011 08:49 1611539

Цитата:

Цитата Tosyk
сейчас хочу запустить этот глобальный скрипт из поста #43, как я понял он то и сделает всю работу »

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

Цитата:

Цитата Tosyk
возможно ли сделать вывод в лог с отображением процесса в окне cmd? »

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

P.S. уж если и модернизировать скрипт, то в сторону применения DIFF вместо размера

Цитата:

Цитата Tosyk
можно ли к этому имени добавить папку его содержащую »

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

Tosyk 13-02-2011 09:01 1611545

Цитата:

Цитата amel27
не советую поддаваться соблазну запускать сразу на рабочих данных »

на самом деле у меня несколько копий всегда одного и того же перепакованных в разные места

Цитата:

Цитата amel27
можно, а зачем тогда цифры, по идее одноименные файлы только и отличаются, что папкой »

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

amel27 13-02-2011 09:56 1611573

Цитата:

Цитата Tosyk
отличаются именем и содержанием »

Тогда возникает логичный вопрос: зачем что-то вообще удалять, если можно просто добавить к имени файла имя папки и проблема с дублями будет решена?.. а если удалять, то какую папку из множества дублей добавлять к имени?... это я к тому, что даже небольшое изменение в условии может в корне изменить всю постановку задачи... ;)
Цитата:

Цитата Tosyk
это будет сложнее чем просто добавить имя в уже готовом скрипте »

еще не знаю, пока важней понять что нужно

Tosyk 13-02-2011 10:25 1611588

Цитата:

Цитата amel27
просто добавить к имени файла имя папки и проблема с дублями будет решена? »

дело в том, что не хотелось бы хранить эти копии на жёстком диске пускай они и имеют разные имена, наверное обратили внимание, что было удалено около 60 тысяч копий файлов, это мягко говоря не мало.
скрипт в том состоянии, что есть сейчас делает свою работу превосходно, и спасибо вам за это!, единственное что хотелось добавить это как раз добавление к скопированным и перемещённым "копиям" имя расположения для упрощения идентификации и дальнейшей работы с файлами, а вот оставлять 60000 копий файлов совсем не хотеловь бы :)

amel27 14-02-2011 11:37 1612506

пришлось внести изменения в каждый шаг:
Код:

@echo off
set root=.\_export_
if not exist "%root%" echo Can't find root folder!& pause>nul& exit

SETLOCAL EnableDelayedExpansion
for %%a in ("%root%") do set "rpth=%%~fa"
<nul set/p $="Scanning and preparing folders..."
(for /d %%a in ("%rpth%\*") do for /d %%b in ("%%~a\*") do (
if not exist ".\%%~nb\" md ".\%%~nb\"
echo "%%~b"?"%%~na"
))>"%~dpn0.$~1"
echo OK& <nul set/p $="Scanning files for moving..."
(for /f "usebackq tokens=1,2 delims=?" %%A in ("%~dpn0.$~1") do (
 for %%b in ("%%~A\*") do (set "$b=%%b"
 echo "!$b:%%~A=%~dp0%%~nA!"?"%%~zb"?"!$b!"?%%~B
)))>"%~dpn0.$~2"
echo OK& <nul set/p $="Sorting file list..."
sort /l "C" "%~dpn0.$~2" /o "%~dpn0.$~3"
echo OK& <nul set/p $="Processing file list..."
set "$a="& set "$b="& set/a "$n1=0,$n2=0,$n3=0"
for /f "usebackq tokens=1-4 delims=?" %%a in ("%~dpn0.$~3") do (
 if not "!$a!"=="%%~a" (
  move "%%~c" "%%~a"
  set/a $n1+=1
 ) else if not "!$b!"=="%%~b" (
  move "%%~c" "%%~dpna_%%~d%%~xa"
  set/a $n2+=1
 ) else set/a $n3+=1
 set "$a=%%~a"& set "$b=%%~b"
)
echo OK& <nul set/p $="Deleting source folder..."
rd /s/q "%rpth%"
set/a "$n0=$n1+$n2+$n3"
echo OK& echo(& echo Processed files all: !$n0!, including:& echo(
echo moved        : %$n1%
echo renamed      : %$n2%
echo copies deleted: %$n3%

ENDLOCAL
echo(& echo Script works complited!
pause>nul


Tosyk 14-02-2011 16:25 1612739

всё прошло успешно, скажите, а по какому шаблону она переименовывает копии?

Код:

...
Перемещено файлов:        1.
Перемещено файлов:        1.
OK
Deleting source folder...OK

Processed files all: 75748, including:

moved        : 12518
renamed      : 5812
copies deleted: 57418

Script works complited!


amel27 14-02-2011 16:42 1612763

Цитата:

Цитата Tosyk
а по какому шаблону она переименовывает копии? »

не совсем понял, как заказано в посте #82 - для копий добавляется имя каталога

кстати, у меня MOVE не выдаёт сообщения о копировании, чтобы их подавить нужно добавить ">NUL":
Код:

move "%%~c" "%%~a">nul

Tosyk 14-02-2011 16:58 1612775

Цитата:

Цитата amel27
MOVE не выдаёт сообщения о копировании »

о перемещении т.е., сделаю!

вообщем-то всё отлично сработало и достаточно быстро, около 40 минут. спасибо огромное, всё такие командный интерпритатор ещё способен на многое!

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

немного лирики: не нравится чёрное возникающее окно при исполнении скрипта, хочется чего то более "native to user" и очень хочу прогресс-бара. определённо добиться этого можно только в среде программирования, но какой? возможно вы знаете и подскажете? пока я остановился на delphi, взял у друга, delphi v7.3.3.3

amel27 14-02-2011 17:25 1612795

Цитата:

Цитата Tosyk
всё отлично сработало »

ссылка в подписи
Цитата:

Цитата Tosyk
только в среде программирования, но какой? возможно вы знаете и подскажете? »

ИМХО проще начать с AutoIT

P.S. многовато отличий, если не секрет - какая ОС и локализация?
Цитата:

Цитата Tosyk
хотел бы вернуться к разговору об определении типа файла и его модификации »

это другая тема

Tosyk 14-02-2011 17:33 1612805

Цитата:

Цитата amel27
ссылка в подписи »

всё таки хотелось бы оттестить ещё на нескольких массивах файлов, хотя пожалуй можно же отменить решение

Цитата:

Цитата amel27
ИМХО проще начать с AutoIT »

я его конечно чейчас посмотри, но то ли это другой вопрос

Цитата:

Цитата amel27
многовато отличий, если не секрет - какая ОС и локализация? »

не совсем понял вопрос о локализации, вот так называется файл который взял у друга:
Код:

Delphi7_Lite_Full_Setup_v7.3.3.3v3(Build_2010-02-02).exe
но он у меня не устанавливается, система у меня не x86, а если вопрос про ось. то у меня 7 ultimate - x64 rus

add: даже нашёл первый урок схожей тематики

amel27 15-02-2011 01:15 1613127

Цитата:

Цитата Tosyk
у меня 7 ultimate - x64 rus »

это и хотел узнать, спасибо

P.S. AutoIT - скриптовый язык, для продвинутого кодинга есть бесплатный Microsoft Visial Studio Express

Tosyk 15-02-2011 05:09 1613173

Цитата:

Цитата amel27
P.S. AutoIT - скриптовый язык »

с его помощью возможно реализовать мои задумки:
Цитата:

Цитата Tosyk
не нравится чёрное возникающее окно при исполнении скрипта, хочется чего то более "native to user" и очень хочу прогресс-бару»

?

и если да, то могу я опубликовать ваш скрипт (тут #87) в ветке с Autoit?

amel27 15-02-2011 05:24 1613177

Цитата:

Цитата Tosyk
с его помощью возможно реализовать мои задумки »

AFAIK возможно
Цитата:

Цитата Tosyk
могу я опубликовать ваш скрипт (тут #87) в ветке с Autoit? »

нет смысла, от CMD скорее всего придется отказаться, это уже будет "другая песня",
для экономии времени на обсуждение задачи можно дать линк на этот топик

Tosyk 15-02-2011 05:29 1613179

Цитата:

Цитата amel27
для экономии времени на обсуждение задачи можно дать линк на этот топик »

но тут 100 сообщений, не проще ли объяснить суть задачи, дать скрипт и описать его работу?

amel27 15-02-2011 05:49 1613180

Tosyk, "объяснить суть задачи" и "описать его работу" - обязательное требование к оформлению любого топика, сам батник тут лишний - тот, кто пишет на AutoIT не обязан знать CMD, но линк дать можно...

Tosyk 15-02-2011 05:56 1613182

Цитата:

Цитата amel27
"объяснить суть задачи" и "описать его работу" »

тогда так получается, спасибо :)

Tosyk 04-06-2012 09:16 1927627

amel27, приветствую, после сотен применений вашего скрипта появилась проблема: не создаётся ФАЙЛ.$~3.
Соответственно скрипт об это уведомляет и ничего переносить не хочет.
скрипт использован из поста #87

ошибка такая:
Код:

Scanning and preparing folders...OK
Scanning files for moving...OK
Sorting file list...'sort' is not recognized as an internal or external command,
operable program or batch file.
OK
Processing file list...The system cannot find the file C:\Users\1\Downloads\g\_converting_work\TESTFOLDER\unpacker.$~3.
OK
Deleting source folder...OK

Processed files all: 0, including:

moved        : 0
renamed      : 0
copies deleted: 0

Script works complited!


Вопрос: с чем может быть связано сие?

p.s.: прошу прощения за поднятие старой темы, но информация обновилась

Tosyk 07-06-2012 12:25 1929972

проверил наличие файла C:\WINDOWS\SYSTEM32\sort.exe, он на месте.

проблема решена

в PATH переменных сред не было пути к C:\Windows\System32

после добавления его всё заработало, тема закрыта


Время: 15:25.

Время: 15:25.
© OSzone.net 2001-