|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Замена маленькой буквы на заглавную в именах файлов |
|
||||
|
|
CMD/BAT - [решено] Замена маленькой буквы на заглавную в именах файлов
|
|
Ветеран Сообщения: 2158 |
Нужен скрипт для следующей задачи: необходимо заменить в именах файлов одну или несколько маленьких букв на заглавные (имена файлов могут быть как схожими, так и разными). Расположение заменяемой буквы от начала имён у всех файлов, как правило, одинаковое, за исключением случая, когда буква (или несколько) находятся в конце. Например, либо у всех - последняя, либо у всех - первая, либо у всех - вторая и третья, либо у всех две последние и т.д.
Пример 1: исходный вариант: Иванов.txt Петров.doc Сидоров.rtf Итомуподобных.docx требуемый результат: ИваноВ.txt ПетроВ.doc СидороВ.rtf ИтомуподобныХ.docx или так: исходный вариант: иванов.txt петров.doc сидоров.rtf итомуподобных.docx требуемый результат: Иванов.txt Петров.doc Сидоров.rtf Итомуподобных.docx Пример 2: исходный вариант: Ивановам.txt Петровод.doc Сидоровтс.rtf Итомуподобныхов.docx требуемый результат: ИвановАМ.txt ПетровОД.doc СидоровТС.rtf ИтомуподобныхОВ.docx или так: исходный вариант: 17_амиванов.txt 14_одпетров.doc 30_тссидоров.rtf 65_овитомуподобных.docx требуемый результат: 17_АМИванов.txt 14_ОДПетров.doc 30_ТССидоров.rtf 65_ОВИтомуподобных.docx Пробовал это проделать средствами TC, но подобная замена возможна только для файлов с однотипными именами, для файлов с разными именами такой вариант не проходит. ![]() |
|
|
------- Отправлено: 11:57, 01-08-2014 |
|
Ушёл из жизни Сообщения: 6021
|
Профиль | Отправить PM | Цитировать @Echo Off
:: Кодировка файла Кириллица DOS (866)
SetLocal EnableDelayedExpansion
:: Путь к обрабатываемой папке
Set Folder=e:\Temp 1\3 3
:: Список замен
Set preset=а_А б_Б в_В г_Г д_Д е_Е ё_Ё ж_Ж з_З и_И й_Й к_К л_Л м_М н_Н о_О п_П р_Р с_С т_Т у_У ф_Ф х_Х ц_Ц ч_Ч ш_Ш щ_Щ ъ_Ъ ы_Ы ь_Ь э_Э ю_Ю я_Я
:: После проверки слово ECHO удалить
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:-D "%folder%"') Do (
Call :_case1 "%%~nA"
Echo Ren "%%A" "!Result!%%~xA"
Call :_case2 "%%~nA"
Echo Ren "%%A" "!Result!%%~xA"
Call :_case3 "%%~nA"
Echo Ren "%%A" "!Result!%%~xA"
Call :_case4 "%%~nA"
Echo Ren "%%A" "!Result!%%~xA"
)
Pause
Exit
:_case1
:: Замена последнего символа в имени файла
Set Data=%~1
Set Char=%Data:~-1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B& GoTo _next1
:_next1
Set Result=%Data:~0,-1%%Char%
GoTo :EOF
:_case2
:: Замена первого символа в имени файла
Set Data=%~1
Set Char=%Data:~0,1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B& GoTo _next2
:_next2
Set Result=%Char%%Data:~1%
GoTo :EOF
:_case3
:: Замена двух последних символов в имени файла
Set Data0=%~1
Set Data=%Data0:~-2%
Set Result=
:_loop3
Set Char=%Data:~,1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B& GoTo _next3
:_next3
Set Result=%Result%%Char%
Set Data=%Data:~1%
If Defined Data GoTo _loop3
Set Result=%Data0:~0,-2%%Result%
GoTo :EOF
:_case4
:: Замена трех символов в имени файла (с четвертого по шестой)
Set Data0=%~1
Set Data=%Data0:~3,3%
Set Result=
:_loop4
Set Char=%Data:~,1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B& GoTo _next4
:_next4
Set Result=%Result%%Char%
Set Data=%Data:~1%
If Defined Data GoTo _loop4
Set Result=%Data0:~0,3%%Result%%Data0:~6%
GoTo :EOF
|
|
Отправлено: 16:02, 01-08-2014 | #2 |
|
Ветеран Сообщения: 2158
|
Профиль | Отправить PM | Цитировать gora,
Огромнейшее спасибо! Проверил - скрипт работает! Особо порадовало то, что скрипт обрабатывает и файлы во вложенных папках (правда почему-то не во всех). Есть пара пожеланий (если, конечно, это не сложно): 1. Можно ли в скрипт добавить возможность проделать то же самое с названиями папок? 2. Насколько понял, скрипт выполняет за один раз только один из четырёх вариантов (замена либо только первой буквы, либо только последней и т.д.) и выполнение за один раз нескольких вариантов для него невозможно, например, сочетание варианта с заменой только первой буквы с вариантом замены только последней (во всяком случае, при попытке это сделать выполняется только то, что стоит за последним CALL)? Насколько сложно их скрестить? P.S. Поэкспериментировал дальше: в Set preset сменил набор символов на латиницу (к сожалению, есть необходимость обрабатывать файлы и с такими именами), а для обработки взял первый попавшийся произвольный набор файлов (выдернул пару папок с файлами из MeGUI (на всякий случай выложил здесь). В итоге в работе скрипта обнаружилось несколько странностей: почему-то обработка прекращается, если встречается файл с именем, начинающимся с литеры "j", а также при обработке html-файлов, начинающихся на "a" и "b". ![]() |
|
------- Последний раз редактировалось Nun-Nun, 02-08-2014 в 15:14. Отправлено: 13:27, 02-08-2014 | #3 |
|
Ушёл из жизни Сообщения: 6021
|
Профиль | Отправить PM | Цитировать Цитата Nun-Nun:
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:D "%folder%"') Do (
Call :_case1 "%%~nxA"
Echo Ren "%%A" "!Result!"
Call :_case2 "%%~nxA"
Echo Ren "%%A" "!Result!"
Call :_case3 "%%~nxA"
Echo Ren "%%A" "!Result!"
Call :_case4 "%%~nxA"
Echo Ren "%%A" "!Result!"
)
Цитата Nun-Nun:
Цитата Nun-Nun:
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:D "%folder%"') Do (
Call :_case1 "%%~nxA"
Rem Echo Ren "%%A" "!Result!"
Call :_case2 "!Result!"
Echo Ren "%%A" "!Result!"
Rem Call :_case3 "%%~nxA"
Rem Echo Ren "%%A" "!Result!"
Rem Call :_case4 "%%~nxA"
Rem Echo Ren "%%A" "!Result!"
)
Цитата Nun-Nun:
|
||||
|
Отправлено: 16:34, 02-08-2014 | #4 |
|
Ветеран Сообщения: 2158
|
Профиль | Отправить PM | Цитировать Цитата gora:
Цитата gora:
![]() Цитата gora:
ивановас.txt петровгв.doc сидоровоп.rtf итомуподобныхлв.docx ... эмат.html нужно получить вот это: ИвановАС.txt ПетровГВ.doc СидоровОП.rtf ИтомуподобныхЛВ.docx ... ЭмАТ.html Цитата gora:
Set preset=а_А б_Б в_В г_Г д_Д е_Е ё_Ё ж_Ж з_З и_И й_Й к_К л_Л м_М н_Н о_О п_П р_Р с_С т_Т у_У ф_Ф х_Х ц_Ц ч_Ч ш_Ш щ_Щ ъ_Ъ ы_Ы ь_Ь э_Э ю_Ю я_Я Set preset=a_A b_B c_C d_D e_E f_F g_G h_H i_I j_J k_K l_L m_M n_N o_O p_P q_Q r_R s_S t_T u_U v_V w_W x_X y_Y z_Z Цитата gora:
P.S. С ранее названным непереименованием файлов на "j", "a", "b" и т.п. вопрос вроде разрешился - тоже моя оплошность, не полностью заремаркировал в команде for те части скрипта, что относились к другим вариантам. Если оставляю только какой-то один - всё работает. Сейчас скрипт выглядит так: @Echo off
:: Кодировка файла Кириллица DOS (866)
SetLocal EnableDelayedExpansion
:: Путь к обрабатываемой папке
Set Folder=C:\Temp\888
:: Список замен
Set preset=а_А б_Б в_В г_Г д_Д е_Е ё_Ё ж_Ж з_З и_И й_Й к_К л_Л м_М н_Н о_О п_П р_Р с_С т_Т у_У ф_Ф х_Х ц_Ц ч_Ч ш_Ш щ_Щ ъ_Ъ ы_Ы ь_Ь э_Э ю_Ю я_Я a_A b_B c_C d_D e_E f_F g_G h_H i_I j_J k_K l_L m_M n_N o_O p_P q_Q r_R s_S t_T u_U v_V w_W x_X y_Y z_Z
:: После проверки слово ECHO удалить
:: Блок обработки имён папок
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:D "%folder%"') Do (
rem Call :_case1 "%%~nxA"
rem Echo Ren "%%A" "!Result!"
Call :_case2 "%%~nxA"
Ren "%%A" "!Result!"
rem Call :_case3 "%%~nxA"
rem Echo Ren "%%A" "!Result!"
rem Call :_case4 "%%~nxA"
rem Echo Ren "%%A" "!Result!"
)
:: Блок обработки имён файлов
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:-D "%folder%"') Do (
rem Call :_case1 "%%~nA"
rem Ren "%%A" "!Result!%%~xA"
Call :_case2 "%%~nA"
Ren "%%A" "!Result!%%~xA"
rem Call :_case3 "%%~nA"
rem Echo Ren "%%A" "!Result!%%~xA"
rem Call :_case4 "%%~nA"
rem Echo Ren "%%A" "!Result!%%~xA"
)
Pause
Exit
:_case1
:: Замена последнего символа в имени файла
Set Data=%~1
Set Char=%Data:~-1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B& GoTo _next1
:_next1
Set Result=%Data:~0,-1%%Char%
GoTo :EOF
:_case2
:: Замена первого символа в имени файла
Set Data=%~1
Set Char=%Data:~0,1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B& GoTo _next2
:_next2
Set Result=%Char%%Data:~1%
GoTo :EOF
:_case3
:: Замена двух последних символов в имени файла
Set Data0=%~1
Set Data=%Data0:~-2%
Set Result=
:_loop3
Set Char=%Data:~,1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B& GoTo _next3
:_next3
Set Result=%Result%%Char%
Set Data=%Data:~1%
If Defined Data GoTo _loop3
Set Result=%Data0:~0,-2%%Result%
GoTo :EOF
:_case4
:: Замена трех символов в имени файла (с четвертого по шестой)
Set Data0=%~1
Set Data=%Data0:~3,3%
Set Result=
:_loop4
Set Char=%Data:~,1%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do If %Char%==%%A Set Char=%%B& GoTo _next4
:_next4
Set Result=%Result%%Char%
Set Data=%Data:~1%
If Defined Data GoTo _loop4
Set Result=%Data0:~0,3%%Result%%Data0:~6%
GoTo :EOF
|
||||||
|
------- Последний раз редактировалось Nun-Nun, 02-08-2014 в 18:50. Отправлено: 18:17, 02-08-2014 | #5 |
|
Ушёл из жизни Сообщения: 6021
|
Профиль | Отправить PM | Цитировать Цитата Nun-Nun:
Цитата Nun-Nun:
|
||
|
Отправлено: 18:48, 02-08-2014 | #6 |
|
Ветеран Сообщения: 2158
|
Профиль | Отправить PM | Цитировать Цитата gora:
|
|
|
------- Отправлено: 19:11, 02-08-2014 | #7 |
|
Пользователь Сообщения: 132
|
Профиль | Отправить PM | Цитировать Добрый день!
Прошу помощи. Есть несколько сотен папок с песнями, но они в разном регистре на латинице. Хотелось бы привести всё в один формат - первая буква большая, остальные маленькие, в ручную очень долго. Если не трудно помогите пож-ста. Написал сюда потому что на основе данного скрипта можно это наверное сделать если немного подправить его, самому не хватает знаний.. http://forum.oszone.net/attachment.p...1&d=1674558148 |
|
Последний раз редактировалось registeruser1, 24-01-2023 в 14:03. Отправлено: 13:48, 24-01-2023 | #8 |
|
Ветеран Сообщения: 1759
|
|
|
Отправлено: 14:12, 24-01-2023 | #9 |
|
Пользователь Сообщения: 132
|
Профиль | Отправить PM | Цитировать Спасибо конечно, а можно батником?
|
|
Отправлено: 14:15, 24-01-2023 | #10 |
|
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| CMD/BAT - [решено] Замена в имени файлов кириллицы на латиницу | VedunO | Скриптовые языки администрирования Windows | 21 | 26-06-2024 15:45 | |
| Любой язык - копировать файл в каталог с текущей датой и сквозной порядковый номер в именах файлов | opensrs | Скриптовые языки администрирования Windows | 1 | 29-05-2013 06:45 | |
| Как определить, есть ли в именах файлов и папок русские буквы-цифры? | truvo | Хочу все знать | 11 | 03-10-2010 18:21 | |
| Flash - Испорчена информация на флэшке (кракозябры в именах файлов) | phonocea | Накопители (SSD, HDD, USB Flash) | 1 | 06-08-2010 13:17 | |
| Замена буквы системного диска в windows 98 | Mixa_myzei | Microsoft Windows 95/98/Me (архив) | 2 | 14-04-2010 17:29 | |
|