Как убрать испанские акценты с символов в именах файлов? - PullRequest
0 голосов
/ 21 сентября 2018

Первый случай:

Я создал текстовый файл переименования ren.bat.Содержимое файла:

ren "a*.pdf" "T*.pdf"

Когда я запускаю файл ren.bat, команда переименовывает все файлы PDF в папке, но только первая буква a не проходит через весь файлимя, заменяющее буквы a.

Может кто-нибудь сказать мне, что случилось?

Второй случай:

Когда я запускаю команду:

ren "ã*.pdf" "a*.pdf"

Команда не переименовывает первую букву.

Может кто-нибудь сказать мне, что не так?

Я нашел работающий код FOR.Но я не знаю, как его адаптировать, чтобы я мог читать все файлы в папке без необходимости идентифицировать имя файла, о котором идет речь.Вы пытаетесь создать файл .bat, который переименовывает файлы, удаляя акценты, которые имеют отступы от имен, которые они используют.Обратите внимание, что этот код должен указывать имя файла:

For /F "Tokens=2 Delims=:" %%I In ('Chcp ') Do Set /A _CurCP=%%I
Chcp 1252
ren "méxico.txt" "mexico.txt"
Chcp %_CurCP%

Мне нужно, чтобы оно было примерно таким, но это не сработало:

ren "áéí*.txt" "aei*.txt"

1 Ответ

0 голосов
/ 22 сентября 2018

Во-первых, вы должны узнать, что символы могут быть сохранены с различными значениями кода .Это называется кодировка символов .

Существуют кодировки символов, в которых используется только один байт с 8 битами для представления символа, дающего максимум 2 ^ 8 = 256 символов.Но есть много символов, намного больше, чем 256. По этой причине есть много кодовых страниц .Кодовая страница определяет, какое значение байта представляет какой символ.

Windows устанавливает кодовую страницу для графического интерфейса пользователя (GUI) и приложений с графическим интерфейсом, таких как Блокнот Windows, а также для консольных приложений, таких как командный процессор Windows, в соответствии с настроенной страной.

Для стран Западной Европы кодовая страница Windows-1252 устанавливается по умолчанию для текста, закодированного одним байтом на символ.Кодовая страница, используемая на консоли для стран Западной Европы, - OEM 850 , что видно при открытии окна командной строки и выполнении команды chcp без каких-либо параметров.chcp является сокращением для ch ange c ода p age.

Консорциум Unicode был создан дляостановите определение все большего и большего количества кодовых страниц, см. Что такое Unicode? Этот консорциум представил Unicode - uni versal код для согласованностикодирование, представление и обработка текста, выраженного в большинстве мировых систем письма.Этот консорциум также определил стандарты кодирования символов и символов.Наиболее популярными являются UTF-8 и UTF-16 .


Во-вторых, имея знания о кодировках символов, давайте взглянем на такие символы, как ã и é.

Блокнот Windows использует Windows-1252 при сохранении командного файла с использованием ANSI для опции Кодировка в Сохранить как диалоговое окно с Испанией, настроенной как страна.Здесь ANSI означает один байт на символ, используя кодовую страницу, а не Американский национальный институт стандартов , который стандартизировал многие кодовые страницы.

Но командный процессор Windows cmd.exe для интерпретации строк в пакетном файле используеткодовая страница OEM 850.

Можно определить кодировку символов и соответственно кодовую страницу отдельно для каждого запущенного процесса.Возможно, вы уже видели двухбуквенное сокращение языка на панели задач Windows, которое можно использовать для изменения языка для активного в данный момент приложения, т. Е. Кодовой страницы, используемой для кодировки символов, отличных от Unicode.

Символ ãимеет десятичное кодовое значение 227 в кодовой странице Windows-1252, но кодовое значение 198 в кодовой странице OEM 850. Символ é в качестве десятичного кодового значения 233 в кодовой странице Windows-1252, но кодовое значение 130 в кодовой странице OEM 850.

Итак, как решить эту проблему с различными кодировками символов?

Одним из решений является написание командного файла с использованием кодовой страницы OEM 850. Это не так просто с Блокнотом Windows.Другие текстовые редакторы поддерживают это лучше, например UltraEdit, который я настроил для автоматического редактирования файлов * .bat и * .cmd с использованием кодовой страницы OEM, как это определено Windows для консольных приложений, в то время как все другие текстовые файлы, не закодированные в Unicode, с кодовой страницей Windows, как определеноWindows для приложений с графическим интерфейсом.

Другое решение заключается в написании командного файла с использованием кодовой страницы Windows-1252 и изменении кодовой страницы при выполнении командного файла сначала на эту кодовую страницу с помощью команды chcp 1252 перед выполнением другой.командные строки.Это простое решение для большинства пользователей.


Так что насчет этого пакетного кода с использованием подстановок строк?

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\chcp.com 1252 >nul
for /F "eol=| delims=" %%I in ('dir * /A-D-H /B 2^>nul') do call :RenameFile "%%I"
endlocal
goto :EOF

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\chcp.com 1252 >nul
for /F "eol=| delims=" %%I in ('dir * /A-D-H /B 2^>nul') do call :RenameFile "%%I"
endlocal
goto :EOF

:RenameFile
set "FileName=%~1"
set "FileName=%FileName:Š=S%"
set "FileName=%FileName:Ž=Z%"
set "FileName=%FileName:š=s%"
set "FileName=%FileName:ž=z%"
set "FileName=%FileName:Ÿ=Y%"
set "FileName=%FileName:À=A%"
set "FileName=%FileName:Á=A%"
set "FileName=%FileName:Â=A%"
set "FileName=%FileName:Ã=A%"
set "FileName=%FileName:Ä=A%"
set "FileName=%FileName:Å=A%"
set "FileName=%FileName:È=E%"
set "FileName=%FileName:É=E%"
set "FileName=%FileName:Ê=E%"
set "FileName=%FileName:Ë=E%"
set "FileName=%FileName:Ì=I%"
set "FileName=%FileName:Í=I%"
set "FileName=%FileName:Î=I%"
set "FileName=%FileName:Ï=I%"
set "FileName=%FileName:Ñ=N%"
set "FileName=%FileName:Ò=O%"
set "FileName=%FileName:Ó=O%"
set "FileName=%FileName:Ô=O%"
set "FileName=%FileName:Õ=O%"
set "FileName=%FileName:Ö=O%"
set "FileName=%FileName:Ù=U%"
set "FileName=%FileName:Ú=U%"
set "FileName=%FileName:Û=U%"
set "FileName=%FileName:Ü=U%"
set "FileName=%FileName:Ý=Y%"
set "FileName=%FileName:à=a%"
set "FileName=%FileName:á=a%"
set "FileName=%FileName:â=a%"
set "FileName=%FileName:ã=a%"
set "FileName=%FileName:ä=a%"
set "FileName=%FileName:å=a%"
set "FileName=%FileName:è=e%"
set "FileName=%FileName:é=e%"
set "FileName=%FileName:ê=e%"
set "FileName=%FileName:ë=e%"
set "FileName=%FileName:ì=i%"
set "FileName=%FileName:í=i%"
set "FileName=%FileName:î=i%"
set "FileName=%FileName:ï=i%"
set "FileName=%FileName:ñ=n%"
set "FileName=%FileName:ò=o%"
set "FileName=%FileName:ó=o%"
set "FileName=%FileName:ô=o%"
set "FileName=%FileName:õ=o%"
set "FileName=%FileName:ö=o%"
set "FileName=%FileName:ù=u%"
set "FileName=%FileName:ú=u%"
set "FileName=%FileName:û=u%"
set "FileName=%FileName:ü=u%"
set "FileName=%FileName:ý=y%"
set "FileName=%FileName:ÿ=y%"

rem Is it necessary to rename the file?
if "%FileName%" == "%~1" goto :EOF

rem Is there already a file with new file name?
if exist "%FileName%" goto :EOF

echo Renaming "%~1" to "%FileName%"
ren "%~1" "%FileName%"
goto :EOF

Что ж, выглядит многообещающе.Но есть проблема.Командный процессор Windows выполняет подстановки строк всегда без учета регистра.Это означает, что Š и š заменены на s в первой командной строке подстановки строки.

Bно следующий пакетный файл учитывает регистр символов при замене символов.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\chcp.com 1252 >nul
for /F "eol=| delims=" %%I in ('dir * /A-D-H /B 2^>nul') do call :RenameFile "%%I"
endlocal
goto :EOF

:RenameFile
set "FileName=%~1"
set "NewName="
:NextChar
if not defined FileName goto CompareNames
set "Char=%FileName:~0,1%"
set "FileName=%FileName:~1%"
if "%Char%" == "Š" set "NewName=%NewName%S" & goto NextChar
if "%Char%" == "Ž" set "NewName=%NewName%Z" & goto NextChar
if "%Char%" == "š" set "NewName=%NewName%s" & goto NextChar
if "%Char%" == "ž" set "NewName=%NewName%z" & goto NextChar
if "%Char%" == "Ÿ" set "NewName=%NewName%Y" & goto NextChar
if "%Char%" == "À" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Á" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Â" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Ã" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Ä" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Å" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "È" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "É" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "Ê" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "Ë" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "Ì" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Í" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Î" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Ï" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Ñ" set "NewName=%NewName%N" & goto NextChar
if "%Char%" == "Ò" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ó" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ô" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Õ" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ö" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ù" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Ú" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Û" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Ü" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Ý" set "NewName=%NewName%Y" & goto NextChar
if "%Char%" == "à" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "á" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "â" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "ã" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "ä" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "å" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "è" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "é" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "ê" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "ë" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "ì" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "í" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "î" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "ï" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "ñ" set "NewName=%NewName%n" & goto NextChar
if "%Char%" == "ò" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ó" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ô" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "õ" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ö" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ù" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "ú" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "û" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "ü" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "ý" set "NewName=%NewName%y" & goto NextChar
if "%Char%" == "ÿ" set "NewName=%NewName%y" & goto NextChar
set "NewName=%NewName%%Char%" & goto NextChar

:CompareNames
rem Is it necessary to rename the file?
if "%~1" == "%NewName%" goto :EOF

rem Is there already a file with new file name?
if exist "%NewName%" goto :EOF

echo Renaming "%~1" to "%NewName%"
ren "%~1" "%NewName%"
goto :EOF

Было бы лучше использовать любой другой язык программирования или сценариев, чем выполнять эту задачу переименования файлов с помощью командного процессора Windows, используя в качестве пакетного файлаработает очень медленно и все еще подвержен ошибкам, если имя файла содержит символы Unicode со значением кода, недоступным на кодовой странице Windows-1252.

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

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


Существует пять решений для переименования файлов в определенной папке.текущего каталога.

Первое решение:
Каталог с переименованными файлами временно устанавливается как текущий каталог с помощью команды CD :

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\chcp.com 1252 >nul
cd /D "C:\Temp\Folder with files to rename" 2>nul
if not errorlevel 1 for /F "eol=| delims=" %%I in ('dir * /A-D-H /B 2^>nul') do call :RenameFile "%%I"
endlocal
goto :EOF

В подпрограмме RenameFile нет ничего по сравнению с приведенным выше кодом.

Это решение по умолчанию не работает с путем UNC, за исключением того, что специальное значение реестра изменено и используемая версия Windows вообще поддерживает это значение реестра.Однако изменение этого значения реестра не рекомендуется, см. Ниже лучшие решения, работающие также с путем UNC.

Команда ENDLOCAL изменяет текущий каталог обратно на исходный текущий каталог при выполнении SETLOCAL .

Второе решение:
Каталог с переименованными файлами временно устанавливается в качестве текущего каталога с помощью команд PUSHD и POPD :

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\chcp.com 1252 >nul
pushd "C:\Temp\Folder with files to rename" 2>nul
if not errorlevel 1 (
    for /F "eol=| delims=" %%I in ('dir * /A-D-H /B 2^>nul') do call :RenameFile "%%I"
    popd
)
endlocal
goto :EOF

Нет ничего, что можно изменить в подпрограмме RenameFile по сравнению с кодом выше.

Это решение также работает с UNC-путем в качестве команды PUSHD сопоставляет букву диска с сетевым ресурсом и делает каталог с буквой диска текущим каталогом.Команда POPD восстанавливает исходный каталог и удаляет сопоставление буквы диска.

PUSHD может завершиться ошибкой, если используется UNC-путь сетевого ресурса и этот сетевой ресурсв данный момент недоступен при выполнении команды или указанный каталог вообще не существует.

Третье решение:
Путь к папке назначен переменной среды и используется в командах DIR и REN и проверка существования нового файла:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\chcp.com 1252 >nul
set "FolderPath=C:\Temp\Folder with files to rename"
for /F "eol=| delims=" %%I in ('dir "%FolderPath%\*" /A-D-H /B 2^>nul') do call :RenameFile "%%I"
endlocal
goto :EOF

:RenameFile
set "FileName=%~1"
set "NewName="
:NextChar
if not defined FileName goto CompareNames
set "Char=%FileName:~0,1%"
set "FileName=%FileName:~1%"
if "%Char%" == "Š" set "NewName=%NewName%S" & goto NextChar
if "%Char%" == "Ž" set "NewName=%NewName%Z" & goto NextChar
if "%Char%" == "š" set "NewName=%NewName%s" & goto NextChar
if "%Char%" == "ž" set "NewName=%NewName%z" & goto NextChar
if "%Char%" == "Ÿ" set "NewName=%NewName%Y" & goto NextChar
if "%Char%" == "À" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Á" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Â" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Ã" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Ä" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Å" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "È" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "É" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "Ê" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "Ë" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "Ì" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Í" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Î" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Ï" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Ñ" set "NewName=%NewName%N" & goto NextChar
if "%Char%" == "Ò" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ó" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ô" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Õ" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ö" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ù" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Ú" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Û" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Ü" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Ý" set "NewName=%NewName%Y" & goto NextChar
if "%Char%" == "à" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "á" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "â" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "ã" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "ä" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "å" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "è" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "é" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "ê" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "ë" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "ì" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "í" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "î" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "ï" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "ñ" set "NewName=%NewName%n" & goto NextChar
if "%Char%" == "ò" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ó" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ô" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "õ" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ö" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ù" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "ú" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "û" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "ü" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "ý" set "NewName=%NewName%y" & goto NextChar
if "%Char%" == "ÿ" set "NewName=%NewName%y" & goto NextChar
set "NewName=%NewName%%Char%" & goto NextChar

:CompareNames
rem Is it necessary to rename the file?
if "%~1" == "%NewName%" goto :EOF

rem Is there already a file with new file name?
if exist "%FolderPath%\%NewName%" goto :EOF

echo Renaming "%~1" to "%NewName%"
ren "%FolderPath%\%~1" "%NewName%"
goto :EOF

Это также работает с путем UNC.

Подпрограмма RenameFileникогда не выполняется, если указанная папка не существует или в настоящее время недоступна.

Четвертое решение:
Путь к папке используется в команде DIR и передаетсявместе с именем файла в подпрограмме, которая работает в основном только с именем файла без пути:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\chcp.com 1252 >nul
set "FolderPath=C:\Temp\Folder with files to rename"
for /F "eol=| delims=" %%I in ('dir "%FolderPath%\*" /A-D-H /B 2^>nul') do call :RenameFile "%FolderPath%\%%I"
endlocal
goto :EOF

:RenameFile
set "FileName=%~nx1"
set "NewName="
:NextChar
if not defined FileName goto CompareNames
set "Char=%FileName:~0,1%"
set "FileName=%FileName:~1%"
if "%Char%" == "Š" set "NewName=%NewName%S" & goto NextChar
if "%Char%" == "Ž" set "NewName=%NewName%Z" & goto NextChar
if "%Char%" == "š" set "NewName=%NewName%s" & goto NextChar
if "%Char%" == "ž" set "NewName=%NewName%z" & goto NextChar
if "%Char%" == "Ÿ" set "NewName=%NewName%Y" & goto NextChar
if "%Char%" == "À" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Á" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Â" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Ã" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Ä" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "Å" set "NewName=%NewName%A" & goto NextChar
if "%Char%" == "È" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "É" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "Ê" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "Ë" set "NewName=%NewName%E" & goto NextChar
if "%Char%" == "Ì" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Í" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Î" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Ï" set "NewName=%NewName%I" & goto NextChar
if "%Char%" == "Ñ" set "NewName=%NewName%N" & goto NextChar
if "%Char%" == "Ò" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ó" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ô" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Õ" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ö" set "NewName=%NewName%O" & goto NextChar
if "%Char%" == "Ù" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Ú" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Û" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Ü" set "NewName=%NewName%U" & goto NextChar
if "%Char%" == "Ý" set "NewName=%NewName%Y" & goto NextChar
if "%Char%" == "à" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "á" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "â" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "ã" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "ä" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "å" set "NewName=%NewName%a" & goto NextChar
if "%Char%" == "è" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "é" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "ê" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "ë" set "NewName=%NewName%e" & goto NextChar
if "%Char%" == "ì" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "í" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "î" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "ï" set "NewName=%NewName%i" & goto NextChar
if "%Char%" == "ñ" set "NewName=%NewName%n" & goto NextChar
if "%Char%" == "ò" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ó" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ô" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "õ" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ö" set "NewName=%NewName%o" & goto NextChar
if "%Char%" == "ù" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "ú" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "û" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "ü" set "NewName=%NewName%u" & goto NextChar
if "%Char%" == "ý" set "NewName=%NewName%y" & goto NextChar
if "%Char%" == "ÿ" set "NewName=%NewName%y" & goto NextChar
set "NewName=%NewName%%Char%" & goto NextChar

:CompareNames
rem Is it necessary to rename the file?
if "%~nx1" == "%NewName%" goto :EOF

rem Is there already a file with new file name?
if exist "%~dp1%NewName%" goto :EOF

echo Renaming "%~nx1" to "%NewName%"
ren "%~1" "%NewName%"
goto :EOF

Это также работает с путем UNC.

Подпрограмма RenameFile никогда не выполняетсяесли туказанная папка не существует или в настоящее время недоступна.

Пятое решение:
Путь к папке используется в команде DIR , которая выполняется с параметром /S искать также в подкаталогах указанного каталога, в результате чего выводятся имена файлов с полным путем.Каждое полное имя файла, присвоенное переменной цикла I, передается в подпрограмму, которая работает в основном только с именем файла без пути, как в четвертом решении:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\chcp.com 1252 >nul
for /F "eol=| delims=" %%I in ('dir "C:\Temp\Folder with files to rename\*" /A-D-H /B /S 2^>nul') do call :RenameFile "%%I"
endlocal
goto :EOF

Это также работает с путем UNC.

Подпрограмма RenameFile никогда не выполняется, если указанная папка не существует или в данный момент недоступна.

Подпрограмма должна иметь те же командные строки, что и в четвертом решении.


Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и очень внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • call /?
  • cd /?
  • chcp /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • popd /?
  • pushd /?
  • rem /?
  • ren /?
  • set /?
  • setlocal /?

См. Также:

...