Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Kalust
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 8
1

Групповое переименование файлов

31.10.2016, 15:08. Просмотров 2000. Ответов 15
Метки нет (Все метки)

Прошу прощения, если повторюсь и где-то уже дан ответ на этот вопрос, но я, к сожалению, не нашёл.
Итак, суть проблемы.
Есть папка с файлами:
Name 001.txt
Name 002.txt
Name 003.txt
и т.д. (нумерация идёт не подряд, то есть каких-то промежуточных номеров может не быть)
Нужно переименовать файлы, чтобы нумерация сохранилась:
New 001.txt
New 002.txt
New 003.txt
и т.д.

Пользуясь советами, набросал вот такой скрипт:
Windows Batch file
1
2
3
4
5
6
7
Set "Pattern=Name"
Set "Replace=NewName"
 
For %%# in ("%~dp0\Folder\*.txt") Do (
Set "File=%%~nx#"
Ren "%%#" "!File:%Pattern%=%Replace%!"
)
Но, видимо, где-то закралась ошибка, скрипт не работает.
Помогите, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2016, 15:08
Ответы с готовыми решениями:

Групповое переименование файлов по маске
Доброго времени суток! В написании командных скриптов только разбираюсь....

Групповое переименование csv-файлов
Приветствую всех и прошу помощи в написании батника. Исходные данные: ...

Групповое переименование файлов через командную строку
Здравствуйте! Мне нужно создать bat-файл со скриптом, который переименует все...

Подправить скрипт. Групповое переименовывание файлов
скрипт, позволяющие переименовать все файлы, имена которых совпадают с...

Переименование PDF-файлов в имена, берущиеся из содержимого этих файлов
Всем доброго времени суток!:) Подскажите, пожалуйста, как переименовать файл с...

15
ComSpec
3407 / 1951 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
31.10.2016, 15:43 2
Лучший ответ Сообщение было отмечено vavun как решение

Решение

Цитата Сообщение от Kalust Посмотреть сообщение
Но, видимо, где-то закралась ошибка, скрипт не работает.


Забыли в начале кода написать команду-инструкцию
Windows Batch file
1
SETLOCAL ENABLEDELAYEDEXPANSION
.
1
Kalust
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 8
31.10.2016, 22:22  [ТС] 3
ComSpec,
большое Вам спасибо!
Ох уж моя невнимательность...

Добавлено через 5 часов 51 минуту
ComSpec,
Столкнулся ещё с одной проблемой. В названиях директорий у меня попадаются восклицательные знаки (например, "!(1989) The World of Great Legends"). В таких случаях скрипт не отрабатывает. Проверял различные вариации, и пришёл к выводу, что проблема именно в восклицательном знаке.
Можно ли как-то это обойти?
0
ComSpec
3407 / 1951 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
31.10.2016, 23:26 4
Лучший ответ Сообщение было отмечено vavun как решение

Решение

Цитата Сообщение от Kalust Посмотреть сообщение
Можно ли как-то это обойти?


Можно. Только для этого нужен такой код (заметьте, уже без SETLOCAL ENABLEDELAYEDEXPANSION):

Windows Batch file
1
2
3
4
5
6
7
8
set "Pattern=Name"
set "Replace=NewName"
set "Folder=!(1989) The World of Great Legends"
 
for /f "delims=" %%# in ('2^>nul dir/a-d/b "%~dp0%Folder%\*.txt"') do (
 set "File=%%~n#"
 cmd/v/c ren "%~dp0%Folder%\%%#" "!File:%Pattern%=%Replace%!%%~x#"
)
.
1
Kalust
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 8
01.11.2016, 10:37  [ТС] 5
ComSpec,
Большое спасибо! Всё заработало!
0
Kalust
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 8
04.11.2016, 16:30  [ТС] 6
ComSpec,
чтобы не открывать новую тему, спрошу здесь, потому что ответа в других ветках не нашёл.
При переименовании директории получаю ошибку:
"Имя файла или его расширение имеет слишком большую длину".
Знаю, что команду ввожу правильно, т.к. для других папок всё работает.
Есть ли возможность обойти длину названия файла (папки) при переименовании?
0
alpap
1501 / 1204 / 396
Регистрация: 26.04.2015
Сообщений: 4,241
04.11.2016, 18:15 7
Цитата Сообщение от Kalust Посмотреть сообщение
обойти длину
вряд-ли, чикать надо, тут можно посмотреть и тут.
0
volodin661
1838 / 895 / 152
Регистрация: 10.12.2013
Сообщений: 3,035
04.11.2016, 18:35 8
Kalust,
а какие такие задачи тобой решаются,
для которых длина имени файла в 255 символов является недостаточно
информативной и требуется её увеличить ?
До какой величины увеличить, кстати, до 2555 символов ?
0
ComSpec
3407 / 1951 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
04.11.2016, 19:16 9
Цитата Сообщение от Kalust Посмотреть сообщение
Есть ли возможность обойти длину названия файла (папки) при переименовании?


В некоторых случаях это возможно.





Цитата Сообщение от Kalust Посмотреть сообщение
При переименовании директории...
Цитата Сообщение от Kalust Посмотреть сообщение
...команду ввожу правильно...


Приведите пример имени этой директории и полностью эту команду.
0
Kalust
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 8
04.11.2016, 22:02  [ТС] 10
volodin661,
веду раздачу. Решил сделать батник, который несколько изменит структуру, чтобы пользователи не заморачивались.

Windows Batch file
1
move "%~dp0\(1985 - 2011) CU - After Crisis\One-shots & Limited Series\!Batman Group\(2003) Batgirl Year One" "%~dp0\(1985 - 2011) CU - After Crisis\One-shots & Limited Series\!Batman Group\(2003) Batgirl - Year One"
Выше по дереву идёт путь: d:\_Torrents\DC_Comics_RUS\

Всё то же самое работает нормально, если папку вынести на несколько уровней выше. Но мне надо переименовать именно в этом месте.
0
ComSpec
3407 / 1951 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
04.11.2016, 22:56 11
Цитата Сообщение от Kalust Посмотреть сообщение
Но мне надо переименовать именно в этом месте.


Попробуйте:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
setlocal
 
set "Folder=(1985 - 2011) CU - After Crisis\One-shots & Limited Series\!Batman Group\(2003) Batgirl Year One"
set "NewName=(2003) Batgirl - Year One"
 
pushd "%~dp0"
for %%i in ("%Folder:\=" "%") do pushd %%i&& set/a n+=1&& set Subfolder=%%i
 
popd
move %Subfolder% "%NewName%"
 
for /l %%i in (1 1 %n%) do popd
 
endlocal
.
0
Kalust
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 8
04.11.2016, 23:12  [ТС] 12
ComSpec,
к сожалению, та же самая ошибка
0
ComSpec
3407 / 1951 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
05.11.2016, 00:28 13
Лучший ответ Сообщение было отмечено Kalust как решение

Решение

Цитата Сообщение от Kalust Посмотреть сообщение
...та же самая ошибка


А так:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
setlocal
 
set "Folder=(1985 - 2011) CU - After Crisis\One-shots & Limited Series\!Batman Group\(2003) Batgirl Year One"
set "NewName=(2003) Batgirl - Year One"
 
pushd "%~dp0"
 
for %%i in ("%Folder%") do (
 set $path=%%~dpi
 cmd/v/c subst $: "!$path:~,-1!"
 pushd $:\
 move "%%~nxi" "%NewName%"
 popd
 subst/d $:
)
 
popd
 
endlocal
?
3
Kalust
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 8
05.11.2016, 00:42  [ТС] 14
ComSpec,
заработало!!!
Да Вы просто Мастер!!!
Спасибо большое!!!

Ещё вопросик (надеюсь, не надоел).
Если у меня несколько таких каталогов по разным путям, то мне можно это повторить в рамках одной процедуры setlocal-endlocal, используя разные переменные, или каждый раз надо заново открывать setlocal и закрывать endlocal?
0
ComSpec
3407 / 1951 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
05.11.2016, 02:18 15
Лучший ответ Сообщение было отмечено vavun как решение

Решение

Цитата Сообщение от Kalust Посмотреть сообщение
...или каждый раз надо заново открывать setlocal и закрывать endlocal?


Во избежание различных недоразумений при выполнении пакетного файла это делать желательно.

А для множественных переименований я посоветую вот такой код, в котором нет именнованных переменных, кроме вспомогательной переменной $path:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
goto calls
 
:sub
 setlocal
 pushd "%~dp0"
 for %%i in ("%~1") do (
  set $path=%%~dpi
  cmd/v/c subst $: "!$path:~,-1!"
  pushd $:\
  move "%%~nxi" "%~2"
  popd
  subst/d $:
 )
 popd
 endlocal
 exit/b
 
:calls
 call :sub "(1985 - 2011) CU - After Crisis\One-shots & Limited Series\!Batman Group\(2003) Batgirl Year One" "(2003) Batgirl - Year One"
 call :sub "................................................................................................" "........................."
 call :sub "................................................................................................" "........................."
 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::и т. д.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.

Вместо точек впишите старые и новые имена других папок по аналогии с первой командой CALL.
1
Kalust
0 / 0 / 0
Регистрация: 31.10.2016
Сообщений: 8
05.11.2016, 16:06  [ТС] 16
ComSpec,
всё отработало именно так, как и нужно было! Огромнейшее спасибо!!!
0
05.11.2016, 16:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2016, 16:06

Переименование файлов в папках с добавлением к именам этих файлов имён этих папок
Есть 4 папки с архивом записей с камеры видеонаблюдения с именами 13 14 15 16....

Переименование файлов
Есть некоторое количество файлов в папке как переименовать все файлы , что бы...

Переименование файлов
@echo off setlocal enabledelayedexpansion chcp 1251 set /p k=Введите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru