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

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

Ответить
Настройки темы
CMD/BAT - [решено] Замена в имени файлов кириллицы на латиницу

Аватара для VedunO

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


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

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


Подскажите, как можно заменить русские буквы на латинские во всех файлах данной папки?
Я имею в виду похожие русские и латинские буквы, например: "а" (рус) на "a" латинскую и т.д.
Имена файлов различные, расширения тоже. Необходимо для последующей заливки на сервер,
а из-за кириллицы в именах файлов возникают проблемы...

Отправлено: 18:10, 22-01-2013

 

Старожил


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

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


VedunO, для этого вам понадобится создать вот такой вот скрипт и разместить его рядом с тем, откуда он будет вызываться, либо же добавить в path:

func_translit.cmd
Код: Выделить весь код
@Echo Off
:: Inquisitor, 2013
SetLocal EnableDelayedExpansion

:: Первый аргумент служит в качестве входящих данных.
Set Data=%~1

:: Проверяем на то, передан ли аргумент и заменяем пробелы на нижнее
:: подчеркивание.
If Defined Data (Set Data=!Data: =_!) Else (Exit /B 1)

:: Посимвольная обработка и поиск соответствия символам кириллицы
:: в соответствии с таблицей транслитерации. Если символ не указан в
:: таблице - он остается неизменным.
Set Result=
:Translit
Set Char=!Data:~,1!
For /F "tokens=2 delims==" %%A In ('Find "::#%Char%=" "%~dpnx0"') Do (Set Char=%%A)
Set Result=!Result!!Char!
If Not "!Data:~1!"=="" (
	Set Data=!Data:~1!
	GoTo Translit
) Else (
	Echo !Result!
)
Exit /B 0

:: Таблица транслитерации
::#a=a
::#б=b
::#в=v
::#г=g
::#д=d
::#е=e
::#ё=yo
::#ж=zh
::#з=z
::#и=i
::#й=i
::#к=k
::#л=l
::#м=m
::#н=n
::#о=o
::#п=p
::#р=r
::#с=s
::#т=t
::#у=u
::#ф=f
::#х=kh
::#ц=c
::#ч=ch
::#ш=sh
::#щ=sh
::#ъ=.
::#ы=y
::#ь=.
::#э=e
::#ю=yu
::#я=ya
::#А=A
::#Б=B
::#В=V
::#Г=G
::#Д=D
::#Е=E
::#Ё=Yo
::#Ж=Zh
::#З=Z
::#И=I
::#Й=I
::#К=K
::#Л=L
::#М=M
::#Н=N
::#О=O
::#П=P
::#Р=R
::#С=S
::#Т=T
::#У=U
::#Ф=F
::#Х=Kh
::#Ц=C
::#Ч=Ch
::#Ш=Sh
::#Щ=Sh
::#Ъ=.
::#Ы=Y
::#Ь=.
::#Э=E
::#Ю=Yu
::#Я=Ya
Имейте в виду, что скрипт должен быть сохранён в кодировке 866, это важно. Все пробелы заменяются на нижние подчеркивания, а кириллица - транслитерируется в латиницу (ГОСТ 7.79-2000, система Б) согласно таблице. Используется много вызовов Find, поэтому производительность скрипта оставляет желать лучшего.

Образец вызова скрипта:
Код: Выделить весь код
@Echo Off
Set Filename=Новый текстовый документ.txt
Echo Old filename = %Filename%
For /F "delims=" %%A In ('func_translit "%Filename%"') Do (Set Filename=%%A)
Echo New filename = %Filename%
Pause
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:27, 22-01-2013 | #2



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

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


Аватара для gora

Ушёл из жизни


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

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


Цитата Anonymоus:
Используется много вызовов Find, поэтому производительность скрипта оставляет желать лучшего. »
Ускорил:
Код: Выделить весь код
@Echo Off
:: Inquisitor, 2013
SetLocal EnableDelayedExpansion

:: Первый аргумент служит в качестве входящих данных.
Set Data=%~1

:: Проверяем на то, передан ли аргумент и заменяем пробелы на нижнее
:: подчеркивание.
If Defined Data (Set Data=!Data: =_!) Else (Exit /B 1)
For %%I In (a_a б_b в_v г_g д_d е_e ё_yo ж_zh з_z и_i й_i к_k л_l м_m н_n о_o п_p р_r с_s т_t у_u ф_f х_kh ц_c ч_ch ш_sh щ_sh ъ_. ы_y ь_. э_e ю_yu я_ya А_A Б_B В_V Г_G Д_D Е_E Ё_Yo Ж_Zh З_Z И_I Й_I К_K Л_L М_M Н_N О_O П_P Р_R С_S Т_T У_U Ф_F Х_Kh Ц_C Ч_Ch Ш_Sh Щ_Sh Ъ_. Ы_Y Ь_. Э_E Ю_Yu Я_Y) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do Set Data=!Data:%%A=%%B!
Echo !Data!
Exit /B 0

Последний раз редактировалось gora, 28-01-2013 в 08:11.

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

Отправлено: 23:28, 22-01-2013 | #3


Ветеран


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

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


gora, оригинально!

Отправлено: 23:46, 22-01-2013 | #4


Старожил


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

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


gora, браво, превосходно! Мне такой вариант решения даже в голову не пришел.

Отправлено: 00:22, 23-01-2013 | #5


Аватара для VedunO

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


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

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


Anonymоus, gora,
Благодарю выручили!!!

Отправлено: 09:19, 23-01-2013 | #6


Аватара для gora

Ушёл из жизни


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

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


Цитата VedunO:
Благодарю выручили!!! »
Рано. Там не все так гладко как оказалось... Надо еще поковырять и исправить.

Отправлено: 09:24, 23-01-2013 | #7


Аватара для VedunO

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


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

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


рано обрадовался
и попутно вопрос: как можно это применить к списку файлов? (обработать все файлы в указанной папке)

Отправлено: 09:47, 23-01-2013 | #8


Аватара для gora

Ушёл из жизни


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

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


Код: Выделить весь код
@Echo Off
:: Кодировка файла Кириллица DOS (866)
SetLocal EnableDelayedExpansion
:: Путь к обрабатываемой папке
Set Folder=e:\Temp\3 3

:: При замене командой SET (как выяснилось) заглавные и маленькие буквы не различаются
:: Всвязи с этим не смысла использовать полный список (с маленькими и заглавными буквами), достаточно любой половины
:: Здесь использована половина с маленькими буквами, поэтому после транслитерации новые имена окажутся в нижнем регистре
:: Если требуются имена в верхнем регистре, то следует использовать половину с заглавными буквами

:: Список замен
:: Set preset=а_a б_b в_v г_g д_d е_e ё_yo ж_zh з_z и_i й_i к_k л_l м_m н_n о_o п_p р_r с_s т_t у_u ф_f х_kh ц_c ч_ch ш_sh щ_sh ъ_. ы_y ь_. э_e ю_yu я_ya А_A Б_B В_V Г_G Д_D Е_E Ё_Yo Ж_Zh З_Z И_I Й_I К_K Л_L М_M Н_N О_O П_P Р_R С_S Т_T У_U Ф_F Х_Kh Ц_C Ч_Ch Ш_Sh Щ_Sh Ъ_. Ы_Y Ь_. Э_E Ю_Yu Я_Ya
Set preset=а_a б_b в_v г_g д_d е_e ё_yo ж_zh з_z и_i й_i к_k л_l м_m н_n о_o п_p р_r с_s т_t у_u ф_f х_kh ц_c ч_ch ш_sh щ_sh ъ_. ы_y ь_. э_e ю_yu я_ya

:: После проверки слово ECHO удалить
For /F "tokens=* delims=" %%A In ('Dir /S /B /A:-D "%folder%"') Do (
	Call :_translit "%%~nA"
	Echo Ren "%%A" "!Data!%%~xA"
)
Pause
Exit

:_translit
Set Data=%~1
Set Data=%Data: =_%
For %%I In (%preset%) Do For /F "tokens=1,2 delims=_" %%A In ("%%I") Do Set Data=!Data:%%A=%%B!
GoTo :EOF

Последний раз редактировалось gora, 28-01-2013 в 08:13. Причина: была пропущена "Я"


Отправлено: 10:55, 23-01-2013 | #9


Аватара для zion87

Старожил


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

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


gora, попытался с двумя файлами:

Текстовый документ.txt
и
Документ Microsoft Office Word.docx

на выходе:

vекbvовlй_докgменv.txt
и
Докgменv_Microsoft_Office_Word.docx

Отправлено: 12:10, 23-01-2013 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Копирование имени файлов в 1 файл Kalyai Скриптовые языки администрирования Windows 0 25-07-2012 12:44
Интерфейс - как переименовать папку с кирилицы на латиницу или перенести все файлы? kulgovd Microsoft Windows 7 1 04-06-2012 02:33
CMD/BAT - Сравнение файлов по имени stasy9110 Скриптовые языки администрирования Windows 1 04-12-2011 21:27
CMD/BAT - Удаление старых файлов по имени файлов Bиктор Скриптовые языки администрирования Windows 1 19-04-2010 03:37
Пишем JavaScript перекодировки из кириллицы в латиницу maasja Вебмастеру 16 08-06-2009 22:10




 
Переход