Пакетный скрипт не выполняется, если chcp был вызван - PullRequest
7 голосов
/ 02 февраля 2010

Я пытаюсь удалить некоторые файлы с символами Юникода в них с помощью пакетного скрипта (это необходимо). Поэтому я запускаю cmd и выполняю:

> chcp 65001

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

Ответы [ 3 ]

9 голосов
/ 17 марта 2010

Если вы хотите, чтобы в пакетном файле поддерживалась юникод, то CHCP в отдельной строке просто прерывает пакетный файл. То, что я предлагаю, это помещать CHCP в каждую строку пакетного файла, для которой требуется Unicode, следующим образом

chcp 65001 > nul && <real command here>

Пример: В моем случае я хотел получить хороший TAIL из моих файлов журнала во время отладки, но содержимое даже для символов Latin-1 было испорчено. Итак, вот мой командный файл, который оборачивает реальную реализацию хвоста из Windows Resource Kit.

@C:\WINDOWS\system32\chcp.com 65001 >nul && tail.exe -f %1

Кроме того, для вывода на консоль необходимо установить шрифт истинного типа, т. Е. Консоль Lucidia.

И, по-видимому, для вывода в файл командная строка должна работать как Unicode, поэтому вы должны запустить свой пакетный скрипт следующим образом

cmd /u /c <batch file command here>

Отказ от ответственности: протестировано в Windows XP sp3 с Windows Resource Kit.

0 голосов
/ 24 сентября 2013

Попробуйте вставить пустую строку в качестве первой строки в вашем пакетном файле ...

Строка 1:

Строка 2: CHCP 65001

Строка 3: команды скрипта

Должно работать!

0 голосов
/ 03 февраля 2010

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

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

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

...