Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Батник для переименования файлов

Ответить
Настройки темы
CMD/BAT - [решено] Батник для переименования файлов

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Уважаемые знатоки! Очень прошу помочь со следующей задачкой: нужен батник для переименования файлов в папке.
Имена файлов нужно заменить на цифры 1.jpg, 2.jpg, 3.jpg .... n.jpg
Имена файлов могут быть любые - могут содержать символы % и !. В эти символы я, собственно, и уперся при попытке написать переименовалку самостоятельно:

@echo off
setlocal
for %%i in (*.jpg) do call:ren "%%i"
goto:eof

:ren
set "file=%~1"
ren %1 %file:!=%

переименовывает все, кроме файлов с символами "%" в названии. Если включаю setlocal enabledelayedexpansion и пробую аналогично убирать из названия %, то не срабатывает на файлах, в которых есть символы "!". Мог бы сделать по-очереди, но встречаются файлы, в которых есть и то и другое - их ничего не берет(

Может кто что подскажет?

Отправлено: 00:27, 11-11-2014

 

Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@for /f "delims=" %%i in ('"dir /a-d/b *.jpg"') do @set /a n+=1& cmd /v:on /c ren "%%i" !n!.jpg
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:02, 11-11-2014 | #2



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

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


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


[решено] Спасибо огромное!

Отправлено: 01:23, 11-11-2014 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Школьник 5:
Имена файлов нужно заменить на цифры 1.jpg, 2.jpg, 3.jpg .... n.jpg
Имена файлов могут быть любые - могут содержать символы % и !. В эти символы я, собственно, и уперся при попытке написать переименовалку самостоятельно »
Школьник 5, если отойти от принципа «Только пакетный файл!» (а там ещё надо, по-хорошему, проверять на уже существующие имена вида «1.jpg, 2.jpg, 3.jpg .... n.jpg»), то можно посмотреть в сторону: ReNamer.

Отправлено: 02:43, 11-11-2014 | #4


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Цитата Iska:
а там ещё надо, по-хорошему, проверять на уже существующие имена вида «1.jpg, 2.jpg, 3.jpg .... n.jpg» »


Iska, ну эта проблема решаема:


Код: Выделить весь код
@echo off

for /f %%i in ('"dir /a-d/b *.jpg| find /c /v """') do (
 for /l %%j in (1 1 %%i) do (
  call ren %%j.jpg %%j_%%random%%%%random%%.jpg 2>nul
  )
 )
for /f "delims=" %%i in ('"dir /a-d/b *.jpg"') do (
 set /a n+=1
 cmd /v:on /c ren "%%i" !n!.jpg
 )

exit /b

.




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


Код: Выделить весь код
@echo off

for /f "delims=" %%i in ('"dir /a-d/b *.jpg"') do (
 set /a n+=1
 (
 call set /p="%%n%% "<nul
 echo %%i
 )>>.tmp
 )
for /f "tokens=1*" %%i in ('"type .tmp& del .tmp"') do (
 ren "%%j" %%i.jpg
 )

exit /b

.




Таким образом, если объединить оба решения, получится такой код:


Код: Выделить весь код
@echo off

for /f %%i in ('"dir /a-d/b *.jpg| find /c /v """') do (
 for /l %%j in (1 1 %%i) do (
  call ren %%j.jpg %%j_%%random%%%%random%%.jpg 2>nul
  )
 )
for /f "delims=" %%i in ('"dir /a-d/b *.jpg"') do (
 set /a n+=1
 (
 call set /p="%%n%% "<nul
 echo %%i
 )>>.tmp
 )
for /f "tokens=1*" %%i in ('"type .tmp& del .tmp"') do (
 ren "%%j" %%i.jpg
 )

exit /b

.
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:26, 11-11-2014 | #5


Новый участник


Сообщения: 44
Благодарности: 0

Профиль | Отправить PM | Цитировать


Georgio, Спасибо за код.
Подскажите пожалуйста, как в этом коде указать конкретный путь к каталогу? Чтобы переименование происходило именно в нем.
Код: Выделить весь код
@for /f "delims=" %%i in ('"dir /a-d/b *.mp3"') do @set /a n+=1& cmd /v:on /c ren "%%i" !n!.mp3

Последний раз редактировалось temphard, 10-11-2019 в 18:33.


Отправлено: 18:23, 10-11-2019 | #6


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата Школьник 5:
Имена файлов могут быть любые - могут содержать символы % и !. В эти символы я, собственно, и уперся при попытке написать переименовалку самостоятельно »
temphard, Если такая пьянка, то это не задача для CMD. Вот VBS.
Код: Выделить весь код
BoxIn = "Z:\Box_In"

Set FSO = CreateObject("Scripting.FileSystemObject")

On Error Resume Next
Set AllF = FSO.GetFolder(BoxIn).Files
If Err.Number <> 0 Then
    MsgBox """" + BoxIn + """" + vbCrLf + vbCrLf + "Open folder, Err.Number=" + CStr(Err.Number) + vbCrLf + Err.Description
    WScript.Quit 1
End If

With CreateObject("VBScript.RegExp")
    .Pattern = "^~~~.*$"
    .IgnoreCase = True
    .Global = True
    For Each FileIn In AllF
        If Not .Test(FileIn.Name) Then
            FSO.MoveFile FileIn, BoxIn + "\~~~" + FileIn.Name
        End If
    Next

    i = 0
    j = 100000
    For Each FileIn In AllF
        If .Test(FileIn.Name) Then
            i = i + 1
            j = j + 1
            FSO.MoveFile FileIn, BoxIn + "\" + CStr(i) + "." + FSO.GetExtensionName(FileIn)
'            FSO.MoveFile FileIn, BoxIn + "\" + Mid(CStr(j), 2) + "." + FSO.GetExtensionName(FileIn)
        End If
    Next
End With
On Error GoTo 0
Красный закомментированный вариант для переименования файлов в вид 00001.ext 00002.ext ....
Если нужен такой вид, то закомментируйте предыдущую строку и откомментируйте эту (убрать ')
При этом если файлов более 99999, то увеличьте число нулей в j = 100000

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:39, 10-11-2019 | #7


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


temphard,
Вот еще вариант. Введен фильтр на расширение файлов в папке.
Можно указать папку явно. Можно указать её в аргументе в кавычках при вызове скрипта.
Можно создать ярлык на этот скрипт и в проводнике затягивать обрабатываемую папку на него
Код: Выделить весь код
BoxIn = "Z:\Box_In"     ' Путь к папке (при отсутствии аргумента в вызове скрипта)
Ext = "mp3"             ' Расширение файлов

With WScript.Arguments
    If .Count <> 0 Then
        BoxIn = .Item(0)
    End If
End With

Set FSO = CreateObject("Scripting.FileSystemObject")

On Error Resume Next
Set AllF = FSO.GetFolder(BoxIn).Files
If Err.Number <> 0 Then
    MsgBox """" + BoxIn + """" + vbCrLf + vbCrLf + "Open folder, Err.Number=" + CStr(Err.Number) + vbCrLf + Err.Description
    WScript.Quit 1
End If

With CreateObject("VBScript.RegExp")
    .Pattern = "^.*\." + Ext + "$"
    .IgnoreCase = True
    .Global = True
    For Each FileIn In AllF
        If .Test(FileIn.Name) Then
            FileIn.Name = FileIn.Name + "~~~"
        End If
    Next

    i = 0
    j = 100000
    .Pattern = "^.*\." + Ext + "~~~$"
    For Each FileIn In AllF
        If .Test(FileIn.Name) Then
            i = i + 1
            j = j + 1
            FileIn.Name = CStr(i) + "." + Ext
'            FileIn.Name = Mid(CStr(j), 2) + "." + Ext
        End If
    Next
End With
On Error GoTo 0

MsgBox "Done"

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:24, 11-11-2019 | #8


Новый участник


Сообщения: 44
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата temphard:
Georgio »
Код: Выделить весь код
@for /f "delims=" %%i in ('"dir /a-d/b *.mp3"') do @set /a n+=1& cmd /v:on /c ren "%%i" !n!.mp3 »[/q]
Извините, я новичок и мне не понятно как в данном коде указать путь к конкретному каталогу, например С:\file\
Пожалуйста объясните подробнее, спасибо.

Отправлено: 14:14, 29-11-2019 | #9


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата temphard:
указать путь »
здесь
Цитата temphard:
...in ('dir /a-d/b "С:\file\*.mp3"') do...»
и обратите внимание на парные кавычки, у меня они расставлены так как и должны быть.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:09, 29-11-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Батник для переименования файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] батник для переименования файлов Pumpik Скриптовые языки администрирования Windows 5 01-02-2014 20:12
CMD/BAT - [решено] Батник для двойной сортировки и переименования Nun-Nun Скриптовые языки администрирования Windows 20 19-01-2012 16:31
Нужна программа для пакетного переименования файлов gaulle Хочу все знать 5 18-01-2012 07:30
Прочие - Программы для массового переименования каталогов и файлов Daiv Программное обеспечение Windows 39 17-06-2011 16:33
CMD/BAT - [решено] Нужна помощь в создании bat-ника для распаковки и переименования файлов/папок Nun-Nun Скриптовые языки администрирования Windows 6 14-05-2009 15:45




 
Переход