18

При выполнении определенных файлов (в основном пакетных) с использованием PsExec я получаю эти странные символы перед моей командой. Сначала я думал, что я использую неправильную кодировку, но после проверки я понял, что все мои файлы используют UTF-8.

4 ответа4

27

Я получаю эти странные символы до моей команды […] все мои файлы использовали UTF-8.

Это имеет две причины:

  1. cmd.exe не поддерживает UTF-8. Он всегда использует одну из однобайтовых кодировок, часто называемых "OEM" - cp437, cp775 и т.д., В зависимости от региональных настроек системы.

    (Я ожидал, что он также будет поддерживать UTF-16, но, очевидно, нет; даже если я добавлю спецификацию UTF-16.)

  2. Ваш текстовый редактор добавляет UTF-8 "метку порядка байтов" (байты EF BB BF) в начало всех файлов UTF-8.

    Когда cmd.exe читает ваш сценарий, он не знает, что делать с меткой, - видит в спецификации три обычных символа cp437 и пытается использовать их как часть имени команды.

Сконфигурируйте ваш редактор, чтобы прекратить добавлять спецификацию в файлы в кодировке UTF-8. (Это имеет смысл только в UTF-16 и очень бесполезно в UTF-8.)

Решит ли проблема компиляция командных файлов в исполняемый файл?

эм

какие

12

Для дальнейшего ответа @ dsolimano, если вы специально используете Visual Studio, а в моем случае это 2013, я исправил это, выполнив следующее:

  1. Откройте Visual Studio.
  2. Нажмите Инструменты > Параметры.
  3. Нажмите Текстовый редактор > Расширение файла.
  4. В поле Extension введите bat.
  5. В раскрывающемся меню « Редактор» выберите « Редактор исходного кода (текста) с кодировкой» и нажмите « Добавить».
  6. Нажмите OK, чтобы сохранить и выйти.

Теперь, когда вы открываете файл .bat из Visual Studio, вы сначала получите запрос:

Вы захотите детально изучить опции, пока не перейдете к опции DOS на своем языке:

Нажмите OK, чтобы завершить открытие файла.


Хорошо, даже если в этот момент это должно быть достаточно очевидно, если вы видите символы ∩╗┐ в начале вашего файла, вам следует удалить их и сохранить файл, теперь с правильной кодировкой. Это то, что мешает вам снова получить запрос в следующий раз.


Имея все это на своем месте, вы будете рады узнать, что теперь вы можете просматривать, редактировать и сохранять ваши файлы .bat из Visual Studio, чтобы cmd.exe больше не давал вам вышеупомянутую ужасную ошибку:

«∩╗┐» не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.

9

Это Unicode Byte Order Marks. Cmd.exe не понимает их. Если вы повторно сохраните свои файлы в Блокноте с кодировкой ANSI, это должно решить проблему.

Например, я создал этот командный файл:

echo Hello World

Сначала я сохраняю его в кодировке UTF-8

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>echo Hello World
'echo' is not recognized as an internal or external command,
operable program or batch file.

Потом с юникодом

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>■e
'■e' is not recognized as an internal or external command,
operable program or batch file.

И, наконец, с ANSI

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>echo Hello World
Hello World
2

Как объяснялось ранее, этот символ является символом Unicode BOM (Byte Order Mark), используемым в качестве подписи, и этот cmd.exe не распознает.

Вы можете удалить его безопасно разными способами.

Я нашел очень легко сделать следующее:

  1. откройте файл в Notepad++
  2. перейти в меню кодирования
  3. отметьте опцию: кодировать в UTF-8 без спецификации
  4. Сохранить и все.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .