Elroir
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору vmix Задачка оказалась нетривиальная... change_fs.cmd: Код: @echo off setlocal enabledelayedexpansion :: First part - changing the paths set "loc_dir=c:\loc" set "num_of_letters=6" del /q /f "chfs_tmp.txt" 2>nul for /f "tokens=*" %%a in (loc_fs.txt) do ( set "fpath=%%~dpa" set "fpath=!fpath:~%num_of_letters%!" for /f "tokens=*" %%b in ('type rem_fs.txt ^| find /i "!fpath!"') do set "rpath=%%~dpb" set "file_path=!rpath!%%~nxa" echo !file_path!>>chfs_tmp.txt ) :: Second part - moving files for /f "tokens=*" %%a in (rem_fs.txt) do ( for /f "tokens=*" %%b in ('type chfs_tmp.txt ^| find /i "%%~nxa"') do set "move_to=%%~dpb" echo move "%%a" "!move_to!" ) del /q /f "chfs_tmp.txt" 2>nul | Файл rem_fs.txt со структурой файлов до изменений, должен быть на диске - в той же директории, что и батник. Предполагается, что локальная директория, в которой производились изменения - известна. Присваиваем переменной loc_dir полный путь к этой директории. В переменной num_of_letters будет число символов в этом пути. В третьей с конца строчке, я поставил echo перед командой move - вместо того, чтобы перемещать файлы, батник показывает команду перемещения. Проверь - если все в порядке, то echo нужно убрать. Батник работает очень медленно. Если файлов очень много - этот код не лучшее решение. All Не могу найти нормальное (быстрое и красивое) решение для задачки vmix-а . Если есть время посмотрите... Вкратце задачка: Есть список файлов на диске (с полными путями). В некой директории создаем структуру директорий и файлов с нулевым размером по этому списку (то есть выкидываем букву диска и просто создаем путь и файлы). Перемещаем созданные файлы внутри этой структуры. Создаем список файлов нашей структуры директорий. Задача - сопоставить оба списка и переместить настоящие файлы в соответствии с тем, как они были перемещены в созданной структуре. Приведу еще раз пример vmix-а: Реальные файлы: c:\dir1\file1, c:\dir2\file2. Созданная структура: d:\loc\dir1\file1, d:\loc\dir2\file2. Переместили файлы в структуре: d:\loc\dir1\file2, d:\loc\dir2\file1. Соответственно реальный список: c:\dir1\file1 c:\dir2\file2 список из структуры: d:\loc\dir1\file2 d:\loc\dir2\file1 нужно получить: move c:\dir1\file1 c:\dir2\ move c:\dir2\file2 c:\dir1\
---------- "В интернете есть все, но не всегда" |
|