Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Kseon12
61 / 3 / 1
Регистрация: 22.12.2011
Сообщений: 99
1

Пакетное переименования файлов по маске

26.05.2015, 00:15. Просмотров 2075. Ответов 6
Метки нет (Все метки)

Такого рода вопросы уже естественно были, однако я в них не нашел ответа.

Вот моя проблема: в папке имеется N количество субтитров, поименованные по определенной маске соответственно, пример "сериал - XX .str" где XX - номер серии.
Задача состоит в том, что бы переименовать файл по новой маске с сохранением номера эпизода. Пример:
Было : "сериал - 1.str"
Стало : "serial - 1 [realise group].str"

Фактически мне нужно менять старую маску на новую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2015, 00:15
Ответы с готовыми решениями:

Пакетное переименование файлов
Уважаемые форумчане, подскажите пожалуйста решение. Имеется множество файлов...

Пакетное переименование файлов по заданному шаблону
Нужен bat файл, который переименнует все файлы по указанному пути, вот так:...

Пакетное объединение pdf файлов с условиями
Здравствуйте! Есть задача сканировать подписанные договоры в pdf и загружать...

Цикл переименования файлов
Здравствуйте! Нужна помощь: Делаю скрипт для переименования определённых...

Скрипт для переименования файлов
Друзья, добрый день! Подскажите пожалуйста скрипт для переименования файла...

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

Решение

Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
 
set "dir=C:\Test"
set "old=^сериал - (\d+)\.str$"
set "new=serial - $1 [realise group].str"
 
powershell "gci '%dir%\*.str' -fo|%%{rni ($_.Name -replace '%old%','%new%') -l $_ -fo}"
 
exit/b 0
.


Пакетный файл сохранить в кодировке "OEM-866".
2
Kseon12
61 / 3 / 1
Регистрация: 22.12.2011
Сообщений: 99
28.05.2015, 17:58  [ТС] 3
Цитата Сообщение от ComSpec Посмотреть сообщение
Windows Batch file
1
2
3
4
5
6
@echo off
set "dir=C:\Test"
set "old=^сериал - (\d+)\.str$"
set "new=serial - $1 [realise group].str"
powershell "gci '%dir%\*.str' -fo|%%{rni ($_.Name -replace '%old%','%new%') -l $_ -fo}"
exit/b 0
Пакетный файл сохранить в кодировке "OEM-866".
Большое спасибо, есть пара вопросов :

1) Можно ли скрипт преобразовать и для работы с директориями ?
2)
Windows Batch file
1
"gci '%dir%\*.str'
Это получается перебор всех файлов с расширением ".str" ? Если файлы имеют расширение ".ass", в этой строчке нужно изменить выходит ?
3)
Windows Batch file
1
2
set "old=^сериал - (\d+)\.str$"
set "new=serial - $1 [realise group].str"
Здесь ".str" это расширение файла, или же часть названия ?
4)
Windows Batch file
1
set "old=^сериал - (\d+)\.str$"
Что означают символы "^" и "$" ? И почему их нету в новой меске
И (\d+) - это что то вроде обозначения последовательно увеличивающегося числового значения ?
5)
Windows Batch file
1
set "new=serial - $1 [realise group].str"
$1 - метка место которой подставится значение с предыдущей маски ?
0
ComSpec
3407 / 1951 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
29.05.2015, 04:33 4
Лучший ответ Сообщение было отмечено Kseon12 как решение

Решение

Цитата Сообщение от Kseon12 Посмотреть сообщение
...есть пара вопросов :
1) ...
2) ...
3) ...
4) ...
5) ...





Цитата Сообщение от Kseon12 Посмотреть сообщение
1) Можно ли скрипт преобразовать и для работы с директориями ?

Можно. Только что Вы имеете в виду? Рекурсивное переименование файлов в древе каталогов или переименование самих каталогов?



Цитата Сообщение от Kseon12 Посмотреть сообщение
2)
Windows Batch file
1
"gci '%dir%\*.str'
Это получается перебор всех файлов с расширением ".str" ? Если файлы имеют расширение ".ass", в этой строчке нужно изменить выходит ?

Именно так. А Вам нужно, чтобы попадающие под шаблон имени файлы переименовывались независимо от расширения?



Цитата Сообщение от Kseon12 Посмотреть сообщение
3)
Windows Batch file
1
2
set "old=^сериал - (\d+)\.str$"
set "new=serial - $1 [realise group].str"
Здесь ".str" это расширение файла, или же часть названия ?

Поскольку расширение файла также может переименовываться, то его включение в шаблон оправдано. Но можно написать шаблон, подходящий к случаям любого расширения или даже его отсутствия.



Цитата Сообщение от Kseon12 Посмотреть сообщение
4)
Windows Batch file
1
set "old=^сериал - (\d+)\.str$"
Что означают символы "^" и "$" ? И почему их нету в новой маске...

Эти символы означают соответственно начало и конец строки. Применяются только в шаблоне (регулярном выражении). В строке, которая должна заменять найденное совпадение с шаблоном, они уже не нужны (как и другие специальные символы регулярных выражений). Ведь если совпадение с шаблоном уже найдено, то должна происходить точная замена на заданную подстроку (она, в отличие от шаблона, -- не "маска").



Цитата Сообщение от Kseon12 Посмотреть сообщение
...И (\d+) - это что то вроде обозначения последовательно увеличивающегося числового значения ?

Нет. "\d" -- это одна любая цифра, а "+" означает повтор предыдущего символа (в данном случае -- цифры) один и более раз.



Цитата Сообщение от Kseon12 Посмотреть сообщение
5)
Windows Batch file
1
set "new=serial - $1 [realise group].str"
$1 - метка место которой подставится значение с предыдущей маски ?

Это переменная для группы символов, соответствующих группе из регулярного выражения и не подлежащих замене. Таких групп может быть несколько, и им по порядку будут соответствовать переменные "$1", "$2", "$3" и т. д.



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


Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
 
set "dir=C:\Test"
set "old=('^'+([RegEx]::Escape('сериал - '))+'(\d+)((\.[^\.]*)?)$')"
set "new='serial - $1 [realise group]$2'"
 
powershell "gci '%dir%\*' -fo|%%{rni ($_.Name -replace %old%,%new%) -l $_ -fo}"
 
exit/b 0

.
2
Kseon12
61 / 3 / 1
Регистрация: 22.12.2011
Сообщений: 99
29.05.2015, 17:38  [ТС] 5
Цитата Сообщение от ComSpec Посмотреть сообщение
Windows Batch file
1
2
3
4
5
6
@echo off
set "dir=C:\Test"
set "old=('^'+([RegEx]::Escape('сериал - '))+'(\d+)((\.[^\.]*)?)$')"
set "new='serial - $1 [realise group]$2'"
powershell "gci '%dir%\*' -fo|%%{rni ($_.Name -replace %old%,%new%) -l $_ -fo}"
exit/b 0
Думал написать, что не работает, перепроверил кодировку - а она сбилась. Переставил все работает. Кодировка OEM-866 обязательна, даже если файлы имеют англ. название ?

Можно. Только что Вы имеете в виду? Рекурсивное переименование файлов в древе каталогов или переименование самих каталогов?
Имел виду то, что в папке есть N под папок, тоже поименованных по определенной маске.
Уже разобрался как сделать - банально убрать из маски кусок с расширением - и ваш код стал захватывать папки .


И спасибо за разъяснения "парочки" вопросов

Добавлено через 3 часа 9 минут
И еще такой вопрос, только что попробовал - скрипт не работает если в пути есть "[" подобные символ. Его нужно как то экранировать ?
0
ComSpec
3407 / 1951 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
31.05.2015, 09:16 6
Лучший ответ Сообщение было отмечено Kseon12 как решение

Решение

Цитата Сообщение от Kseon12 Посмотреть сообщение
Кодировка OEM-866 обязательна, даже если файлы имеют англ. название ?

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



Цитата Сообщение от Kseon12 Посмотреть сообщение
...банально убрать из маски кусок с расширением - и ваш код стал захватывать папки .

Мне что-то казалось, что он бы это делал и без этого (не проверял), по крайней мере, новые варианты кода, представленные ниже, переименовывают папки и при наличии шаблона для расширения, так как в шаблоне учтено, что расширения может и не быть (уже проверял).



Цитата Сообщение от Kseon12 Посмотреть сообщение
И еще такой вопрос, только что попробовал - скрипт не работает если в пути есть "[" подобные символ. Его нужно как то экранировать ?

А вот это -- камень преткновения в синтаксисе PowerShell. С одной стороны, применение перечня символов, заключённых в квадратные скобки, существенно дополняет функции обычных подстановочных символов, с другой стороны, это является препятствием в работе с объектами, в именах которых есть эти самые квадратные скобки, которые воспринимаются как служебные символы. Экранировать их нельзя, но в простых случаях применяется параметр "-LiteralPath" (сокращённые варианты -- "-lit" или просто "-l"). Если Вы внимательно посмотрите на старый вариант кода, то увидите параметр "-l" при использовании командлета "Rename-Item" (псевдоним -- "rni"), то есть от несрабатывания кода в случае наличия квадратных скобок в именах файлов я Вас "застраховал". А вот использовать этот параметр для командлета "Get-ChildItem" (псевдоним -- "gci") было нельзя, так как в том варианте кода в строке присутствует подстановочный символ "*". Обходной "манёвр" применять не стал, думая, что "мин" у Вас "на путях" не будет. Теперь придётся...



Новые варианты кода:

1)
Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
 
set "dir=C:\[Test]"
set "old=('^'+[RegEx]::Escape('сериал - ')+'(\d+)((\.[^\.]*)?)$')"
set "new='serial - $1 [realise group]$2'"
 
powershell "gci -l '%dir%' -fo|%%{if(($x=$_.Name -replace %old%,%new%) -ne $_.Name){rni $x -l $_.FullName -fo}}"
 
exit/b 0
;

2)
Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
 
set "dir=C:\[Test]"
set "old=('^'+[RegEx]::Escape('сериал - ')+'(\d+)((\.[^\.]*)?)$')"
set "new='serial - $1 [realise group]$2'"
 
powershell "gci -l '%dir%' -fo|%%{if([RegEx]::Match($_.Name,%old%).Success){rni ($_.Name -replace %old%,%new%) -l $_.FullName -fo}}"
 
exit/b 0
;

3)
Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
 
set "dir=C:\[Test]"
set "old=('^'+[RegEx]::Escape('сериал - ')+'(\d+)((\.[^\.]*)?)$')"
set "new='serial - $1 [realise group]$2'"
 
powershell "gci -l '%dir%' -fo|?{[RegEx]::Match($_.Name,%old%).Success}|%%{rni ($_.Name -replace %old%,%new%) -l $_.FullName -fo}"
 
exit/b 0
.
3
Kseon12
61 / 3 / 1
Регистрация: 22.12.2011
Сообщений: 99
31.05.2015, 11:11  [ТС] 7
Так как я с командными файлами я не работал, то моя попытка первая естественно было просто убрать часть с расширением и попробовать )

И снова спасибо за помощь.
Можно получить краткое различие между приведенными вами 3 вариантами кода ?


--------------------------
К слову, если ли еще спец. символы какие то, которые могут быть в названии пути, и конфликтовать с powershell ? Или код теперь от всех них застрахован ?
0
31.05.2015, 11:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2015, 11:11

Пакетное создание новых текстовых файлов в папках с разными именами
Здравствуйте,всех с прошедшими ! Вопрос: Имеем папки с разными именами,как...

Цикл переименования файлов - CMD/BAT
Помите пожалуйста, есть 66 файлов, как пронумировать "по 11"? Т.е. Есть:...

Ожидание завершения цикла переименования файлов
Здравствуйте. Я не программист, но потребовалось автоматизировать через bat...


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

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

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