Сценарий пакетной обработки не выполняется, если chcp назвали

Я пытаюсь удалить некоторые файлы с 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 в консоли, сценарии просто прекращают работать. Кто-то знает, как зафиксировать это?

7
задан Andy 2 February 2010 в 07:58
поделиться

2 ответа

Если вы хотите, чтобы юникод поддерживался в пакетном файле, то 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.

9
ответ дан 7 December 2019 в 03:15
поделиться

Поддержка Unicode в консоли, и особенно в пакетных файлах, очень плохая. Можете ли вы "изменить" требование сказать PowerShell или Active Scripting (VBScript или JScript)?

Это спасет вас. много горя в долгосрочной перспективе (если вам нужно расширить это за рамки этой простой задачи)

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

0
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: