Я пытаюсь удалить некоторые файлы с unicode символами в них со сценарием пакетной обработки (это - требование). Таким образом, я выполняю cmd и выполняюсь:
> chcp 65001
Кодовая страница установки Effectively к UTF-8. И это работает:
D:\temp\1>dir
Volume in drive D has no label.
Volume Serial Number is 8C33-61BF
Directory of D:\temp\1
02.02.2010 09:31 <DIR> .
02.02.2010 09:31 <DIR> ..
02.02.2010 09:32 508 1.txt
02.02.2010 09:28 12 delete.bat
02.02.2010 09:20 95 delete.cmd
02.02.2010 09:13 <DIR> Rún
02.02.2010 09:13 <DIR> Гуцул Каліпсо
3 File(s) 615 bytes
4 Dir(s) 11 576 438 784 bytes free
D:\temp\1>rmdir Rún
D:\temp\1>dir
Volume in drive D has no label.
Volume Serial Number is 8C33-61BF
Directory of D:\temp\1
02.02.2010 09:56 <DIR> .
02.02.2010 09:56 <DIR> ..
02.02.2010 09:32 508 1.txt
02.02.2010 09:28 12 delete.bat
02.02.2010 09:20 95 delete.cmd
02.02.2010 09:13 <DIR> Гуцул Каліпсо
3 File(s) 615 bytes
3 Dir(s) 11 576 438 784 bytes free
Тогда я поместил то же rmdir
команды в сценарии пакетной обработки и сохраняют его в кодировке UTF-8. Но когда я работаю, ничего не происходит, буквально ничто: даже не повторите работы из сценария пакетной обработки в этом случае. Даже сохранение сценария в кодировании OEM не помогает.
Таким образом, кажется, что, когда я изменяю кодовую страницу на UTF-8 в консоли, сценарии просто прекращают работать. Кто-то знает, как зафиксировать это?
Если вы хотите, чтобы юникод поддерживался в пакетном файле, то CHCP в строке сам по себе просто прервет пакетный файл. Я предлагаю ставить CHCP на каждую строку пакетного файла, где требуется юникод, следующим образом
chcp 65001 > nul && <real command here>
Пример: В моем случае я хотел иметь хороший TAIL моих лог-файлов во время отладки, но содержимое даже для символов Latin-1 было испорчено. Так что вот мой пакетный файл, который обертывает реальную реализацию tail из Windows Resource Kit.
@C:\WINDOWS\system32\chcp.com 65001 >nul && tail.exe -f %1
Кроме того, для вывода в консоль нужно установить шрифт true type, т.е. Lucidia Console.
И, очевидно, для вывода в файл командная строка должна работать в Unicode, поэтому вы должны запустить свой пакетный сценарий следующим образом
cmd /u /c <batch file command here>
Отказ от ответственности: протестировано на Windows XP sp3 с Windows Resource Kit.
Поддержка Unicode в консоли, и особенно в пакетных файлах, очень плохая. Можете ли вы "изменить" требование сказать PowerShell или Active Scripting (VBScript или JScript)?
Это спасет вас. много горя в долгосрочной перспективе (если вам нужно расширить это за рамки этой простой задачи)
Не говоря уже о том, что и PowerShell, и ActiveScripting используют более мощные языки, позволяющие использовать функции, правильные циклы, реальные переменные, отладчики, много вкусностей для более серьезного проекта.