imho.ws |
|
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
18.03.2015, 23:07 | # 1 |
Member
Регистрация: 25.08.2002
Сообщения: 207
|
Файл .BAT для стековой перенумерации файлов - нужен совет
Проблема такая. Есть директория, в которой находятся файлы с различными расширениями, а имена этих файлов имеют одинаковую структуру: они начинаются с цифры от 1 до 9, за ней идет подчеркивание, далее неважно что, и расширение, то есть такие файлы, например:
3_abcd.txt 4_sadghj_70.zip 9_ddddddddddddd.jpg Файлов в директории может быть от 2 до 9. BAT файл должен знать переменную, которая определяет глубину стека - ее можно установить тоже от 2 до 9. Пусть это будет set STACKDEPTH=7 - глубина стека равна 7. В таком случае, BAT прежде всего должен удалить из директории все файлы, первый знак в имени которых >=STACKDEPTH, если такие файлы есть (это файлы 7_*.*, 8*.* и 9*.*). Это будет DEL по маске в цикле, например, и хорошо бы проверять что-то вроде if exist. Далее, нужно перенумеровать файлы, т. е. изменить только цифры в начале имени файла, сохранив всю последующую информацию, начиная с подчеркивания и заканчивая расширением файла. При этом первую цифру в каждом имени файла нужно увеличить на 1, примерно так: 6_*.* должен стать 7_*.* и т. д., до 1*.* должен стать 2_*.* Для этого дела как бы напрашивается цикл с токенами типа такого: for /f "tokens=*" %%i ... do ( rename "%...%\%%i" ) Ограничение: НЕЛЬЗЯ удалять или переименовывать файлы, которые начинаются не с цифры и подчеркивания. То есть файл типа Read.me должен сохраниться. Вроде как оно теоретически понятно, но в целом не складывается. Если кому-то не очень трудно, был бы весьма признателен за кусок кода. Думаю, что не я один нашел бы применение такому стеку. Можно в плане развития идеи сделать стек и от 01 до 99, обязательно с лидирующим нулем, но вряд ли это нужно рядовому юзеру, а нерядовой имеет другие инструменты. Спасибо. P. S. Собственно, это мне нужно как замена стека nnBackup, в связи с переходом на архивацию от zip на 7z, из-за ограничений по размеру архива у zip в моей конкретной ситуации. Да, nnBackup может работать с внешним архиватором, но не всегда хочет. Не принципиально для BAT, но работать ему предстоит на Win7 32 или 64. Спасибо. |
19.03.2015, 01:37 | # 2 |
СуперМод
IMHO Консультант 2005-2009 Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 422
|
Вкратце примерно так:
rename_it.cmd Код:
set /a STACKDEPTH=7 set /a BIGDIGIT=%STACKDEPTH%-1 set "WORKDIR=x:\any dir" pushd "%WORKDIR%" for /l %%A in (%STACKDEPTH%,1,9) do del /q "%%A_*.*" for /l %%B in (%BIGDIGIT%,-1,1) do ( for /f %%C in ('dir /b "%%B_*.*"') do call :RENAMEFILE "%%C" ) popd goto :EOF :RENAMEFILE set "OLDNAME=%~1" SET /a NEWDIGIT=%OLDNAME:~0,1%+1 ren "%OLDNAME%" "%NEWDIGIT%_%OLDNAME:~2%" goto :EOF P.S. Не тестируйте его на рабочей директории... С ведущим нулём морочиться просто лень...
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила! Распространенье наше по планете Особенно заметно вдалеке: В общественном парижском туалете Есть надписи на русском языке В. Высоцкий Последний раз редактировалось Borland; 19.03.2015 в 12:31. Причина: ашыпке :) |
19.03.2015, 02:38 | # 3 |
Member
Регистрация: 25.08.2002
Сообщения: 207
|
Borland, спасибо.
Ведущий ноль - это излишество, Вы правы. Удаление лишних файлов работает, как надо, это вообще хорошо. Переименование пока не идет, но попробую разобраться. В переменные попадает мусор, но это пройдет со временем, надеюсь. Спасибо. |
19.03.2015, 09:47 | # 4 |
СуперМод
IMHO Консультант 2005-2009 Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 422
|
Возможно, надо добавить в процедуру переименования setlocal ENABLEDELAYEDEXPANSION и соответственно заменить "%" на "!" при разыменовании переменных OLDNAME и NEWDIGIT. Проблема, скорее всего, именно в этом...
Можно попробовать вообще включить ENABLEDELAYEDEXPANSION в начале файла и использовать "!" вместо "%". Нету времени на эксперименты... И ещё тщательно проверьте скрипт на отсутствие лишних пробелов в конце строк. Это общая рекомендация с руборда для кода, скопипащенного с Web.
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила! Распространенье наше по планете Особенно заметно вдалеке: В общественном парижском туалете Есть надписи на русском языке В. Высоцкий |
19.03.2015, 12:26 | # 5 |
Member
Регистрация: 25.08.2002
Сообщения: 207
|
Borland, спасибо еще раз. Похоже, дело не все-таки не в "%" и "!". Если бы мусор в пременных был в виде фрагментов имен файлов - то да, а сейчас переменные принимают такие значения, например:
set "OLDNAME=Том" set "OLDNAME=Серийный" set "OLDNAME=Содержимое" set "OLDNAME=18.03.2015" - это явно из описания тома или папки, но не имена файлов, а как бы на уровень выше. Путь задаю явно в полном виде: set "WORKDIR=d:\Test\Stack\" И без последнего слэша то же самое. В именах файлов русских букв не бывает, да и спецсимволов тоже, и пробелов. Но все уже близко к успеху. P. S. Не могу поставить плюс в репутацию - сначала нужно поставить кому-то другому... |
19.03.2015, 12:32 | # 6 |
СуперМод
IMHO Консультант 2005-2009 Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 422
|
Проверил-таки код.
Не работал он из-за пары ошибок: пропущенной опции "/b" в команде dir и пропущенного "%" в команде переименования. Исправил, теперь должно работать как надо. Тем не менее - прежде, чем использовать в работе - как следует проверьте, что он делает именно то, что требуется. P.S. Для имён файлов и папок с пробелами тоже должно работать. Язык имён файлов может быть хоть китайский: в командах батника и масках файлов в данном случае используется исключительно латиница, цифры и знак подчёркивания, которые во всех кодовых страницах имеют одни и те же коды.
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила! Распространенье наше по планете Особенно заметно вдалеке: В общественном парижском туалете Есть надписи на русском языке В. Высоцкий |
19.03.2015, 16:53 | # 7 | ||
Member
Регистрация: 25.08.2002
Сообщения: 207
|
Borland, это прекрасно работает, спасибо за Ваше время.
Думаю, этот скрипт будет очень полезен еще много кому, просто эпическая сила. И да, имена с пробелами обрабатывает без проблем. Такой скрипт можно в учебнике по cmd публиковать.
|
||