
На обычном (западном) компьютере с Windows у меня есть файл
файл.txt
с не-ASCII буквами в имени файла. Как сделать следующее из .bat файла?
dir файл.txt
ren файл.txt file.txt
и т. д.?
Я попробовал поместить приведенные выше команды в файл mybat.bat
(используя кодировку UTF-8 или UTF-16), но он не работает, даже если я запускаю его как cmd /u /c mybat.bat
.
Примечание: вопрос не в том, как поместить эти буквы в пакетный файл, а в том, как заставить пакетный файл делать то, что от него ожидается (в моем примере — вывести список файлов и затем переименовать их).
Примечание: dir > log.txt
команда показывает файл файл.txt как ????.txt. Однако, dir
отображает этот файл на экране правильно как файл.txt.
решение1
Ваша главная проблема — шрифтhttps://stackoverflow.com/questions/9321419/unicode-utf-8-text-file-gibberish-on-windows-console-trying-to-display-hebrewС правильным шрифтом вы не получите вопросительные знаки. Поэтому вам следует добавить Courier New в командную строку. Тогда вы сможете вводить или отображать/выводить такие символы.
Если затем вы обнаружите, что некоторые команды имеют проблемы, попробуйте chcp 65001 (в ответ на ваш вопрос, будьте уверены, что chcp 65001 повлияет только на это окно приглашения cmd). Вам понадобится chcp 65001 для перенаправления, чтобы работать с символами за пределами \u7F, например, чтобы dir >asdf
команда записала файл с этими символами, понадобится chcp 65001. Но ваша команда ren отлично работает и без 65001.
Примечание: автор статьи указывает на необходимость исправления. Шрифт у него был в порядке. Но ему нужен был chcp 65001.
Другой случай, когда нужен chcp 65001, это если пакетный файл в utf8. В противном случае даже выполнение пакетного файла только с буквами типа привет, они будут преобразованы в вопросительные знаки.
OP также указывает на отличный способ обойти проблему, когда блокнот сохраняет в utf-8 с BOM, тогда как chcp 65001 — это UTF-8 без BOM. И если у вас есть пакетный файл, закодированный как utf-8 с BOM, который говорит просто eg dir или echo привет, то это не сработает, даже если cmd имеет кодировку 65001. Потому что cmd смешивает BOM в первой строке. Поэтому обходной путь — поместить команду(ы), начиная со второй строки. (В качестве альтернативы можно использовать текстовый редактор, который сохраняет как utf-8 без BOM).