Windows bat utf 8

Это просто! Надо всего лишь прочитать 100-500 мануалов по командной строке Windows и провести 200 экспериментов по написанию bat-скриптов)

Если серъёзно, то вывести файл с текстом в формате UTF-8 можно следующим образом

@echo off
set file=YourFileName
cmd /u /c chcp 65001 | echo my super text1 > "%file%"
cmd /u /c chcp 65001 | echo my super text2 >> "%file%"
cmd /u /c chcp 65001 | echo my super text3 >> "%file%"
...

Кавычки в записи «%file%» нужны по той причине, что имя файла может содержать пробелы.

Мы вызываем CMD cо флагом /u, который сообщает, что запускаемая консоль должна возвращать результат в формате UTF-8.

Далее в этой же строке после флага мы передаём команду. Кстати, флаг означает, что после выполнения переданной команды, консоль закрывается.

Как можно заметить, мы передаём две команды, разделённых знаком |. Данный знак позволяет записать две нужных нам команды в одну строку.

Первая команда chcp 65001 устанавливает кодировку UTF-8 в запущенной консоли. (Чтобы узнать, какая текущая кодировка установлена в консоли, достаточно вызвать команду chcp без параметров.)

Вторая команда echo текст > «%HOME%\%file%» печатает соответствующий текст в файл с именем «%HOME%\%file%«, где имена переменных развёртываются в путь к домашней директории и имени файла .bash_login.

По умолчанию cmd.exe использует кодировку cp866. Текущую кодировку можно посмотреть командой chcp. Иногда возникает необходимость использовать в терминале юникод. Для этого необходимо использовать шрифт «Lucida Console» и переключить кодировку командой
>chcp <codepage>
Где параметр <codepage> для UTF-8 равен 65001


Рейтинг 4.98/55:

68 / 68 / 42

Регистрация: 30.03.2015

Сообщений: 372

18.05.2016, 14:59. Показов 10880. Ответов 4


Windows 10 русская редакция — при создании текстовых файлов по умолчанию используется кодировка ANSI. При создании BAT файлов с помощью сторонних редакторов сохранения файла происходит в кодировке UTF-8. Запуск такого файла приводит к ошибке — перед самой первой командой добавляется непонятный символ который при считывании и взывает ошибку о непонятной команде. Конечно же если сохранять в кодировке по умолчанию все работает. Вопрос: будет ли работать мой BAT файл сохраненный не в UTF-8 в иноязычных средах? Какую кодировку выбрать для моей русскоязычной системы, чтобы она работала везде? Я не собираюсь вводить кирилицу в командный файл — только A-z. 0-9.

Добавлено через 2 минуты
Прим.: сейчас открыл созданный по умолчанию текстовый файл в браузере и посмотрел кодировку — кирилица 1251. Т.е. при сохранении в ANSI (American blablabla) у меня создается «русский» текстовый файл!
Окончательно запутался, просто подскажите какую кодировку использовать, чтобы она была True American, но при этом работала в русских системах. Спасибо.



0



Programming

Эксперт

39485 / 9562 / 3019

Регистрация: 12.04.2006

Сообщений: 41,671

Блог

18.05.2016, 14:59

4

ComSpec

3461 / 1999 / 635

Регистрация: 26.02.2014

Сообщений: 1,457

18.05.2016, 16:21

Сообщение от Constantius24

Какую кодировку выбрать для моей русскоязычной системы, чтобы она работала везде? Я не собираюсь вводить кириллицу в командный файл — только A-z, 0-9.

Тогда можно использовать практически любую кодировку (Win-1251, OEM-866, CP437, Win-1252), кроме юникодных, так как при сохранении в каждой из этих кодировок файла, не содержащего кириллические и юникодные символы, сохранённые файлы будут идентичными.

Во многих случаях можно использовать и кодировку UTF-8, только в самом начале BAT-файла надо написать строку

Windows Batch file
1
! 2>nul& @cls

,
выполнение которой не допустит склеивания «непонятных» символов с последующей командой, будет «поглощать» вывод сообщения об ошибке и очищать консольное окно.



2



68 / 68 / 42

Регистрация: 30.03.2015

Сообщений: 372

18.05.2016, 18:34

 [ТС]

Сообщение от ComSpec

Тогда можно использовать практически любую кодировку (Win-1251, OEM-866, CP437, Win-1252)

Будет ли работать файл сохраненный в одной из этих кодировок в англ. версии Windows ?



0



3461 / 1999 / 635

Регистрация: 26.02.2014

Сообщений: 1,457

18.05.2016, 19:23

Сообщение было отмечено Constantius24 как решение

Решение

При условии, которое Вы озвучили (

Сообщение от Constantius24

Я не собираюсь вводить кириллицу в командный файл…

),
пакетный файл будет работать в англоязычной версии Windows.

Для такого файла не существует дифференциации на какие-нибудь кодировки, так как в данном случае файл просто сохраняется в ANSI-кодировке.

Русскоязычные версии текстовых редакторов или браузеров могут определять кодировку такого файла как Wiin-1251, а англоязычные — как CP437, то есть определение кодировки в данном случае будет исключительно «на совести» той программы, которой Вы пользуетесь в данный момент, и объявленная ей кодировка никак не может повлиять на работоспособность пакетного файла.

Повторю: без наличия букв кириллического алфавита или нелатинских букв других алфавитов в содержимом файла кодировка файла всегда будет одна и та же — недифференцированная ANSI-кодировка (если, конечно, файл не был сохранён в какой-нибудь из юникодных кодировок).



1



68 / 68 / 42

Регистрация: 30.03.2015

Сообщений: 372

18.05.2016, 19:53

 [ТС]

Значит ANSI это мой выбор, спасибо.



0



Новые блоги и статьи

Все статьи  

Все блоги / 

Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности — ещё и безопасность.

Hrethgir 14.05.2025

Помимо огромного плюса в энергоэффективности, асинхронная логика — тотальный контроль над каждым совершённым тактом, а значит — безусловная безопасность, где безконтрольно не совершится ни одного. . .

Многопоточные приложения на C++

bytestream 14.05.2025

C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .

Stack, Queue и Hashtable в C#

UnmanagedCoder 14.05.2025

Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . .

Как использовать OAuth2 со Spring Security в Java

Javaican 14.05.2025

Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .

Анализ текста на Python с NLTK и Spacy

AI_Generated 14.05.2025

NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .

Реализация DI в PHP

Jason-Webb 13.05.2025

Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .

Обработка изображений в реальном времени на C# с OpenCV

stackOverflow 13.05.2025

Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .

POCO, ACE, Loki и другие продвинутые C++ библиотеки

NullReferenced 13.05.2025

В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .

Паттерны проектирования GoF на C#

UnmanagedCoder 13.05.2025

Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .

Создаем CLI приложение на Python с Prompt Toolkit

py-thonny 13.05.2025

Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .

Наверх

Как писать скрипты на BATCH? 🤔

Все на самом деле проще, чем кажется. 😉

Вывод текста на экран

@echo off
echo It's my the first script on BATCH!

Вывод:

It’s my the first script on BATCH!

С первого взгляда стало понятно, чтобы вывести текст на экран нужно воспользоваться командой echo.
Но что значит первая строчка @echo off? 🤔 Первая строчка отвечает за отключения «эхо», то есть, другими словами она отключает вывод командной строки. Представим, что вы ее не записали, и вот что у вас получится:

echo It’s my the first script on BATCH!
It’s my the first script on BATCH!

У вас отобразятся команды, которые вы записали в ваш скрипт, а потом их результат.

Комментарии, кодировка и перенос строки

Комментарии

Комментарии в коде чаще всего создаются, для описания какой-либо строчки или какого-либо блока кода.
Имеется несколько способов оставить комментарий:

@rem Смотри какой красивый комментарий
rem А как тебе этот комментарий?
:: И даже так можно!

Разницы не будет как вы это сделаете, комментарий не читается при исполнении скрипта — он только для вас.

Кодировка

Допустим вы захотели вывести текст в консоль, который написан кириллицей, но при выводе возникает проблема? Что это за символы?!
Для этого следует указать интернациональную кодировку UTF-8:

@echo off
@rem chcp *сюда код кодировки* (65001 это UTF-8)
chcp 65001

echo Привет, кириллица!

Перенос строк

Если у вас в коде имеется длинная строка, которую вы хотите перенести на другую строчку, чтобы визуально это смотрелось красиво и удобно, можно воспользоваться символом ^:

@echo off
chcp 65001

echo У меня есть очень большой текст, который по сути бессмысленный и я придумываю этот текст на ходу, ^
в прямом эфире и совершенно не важно, что здесь написано. С помощью ёлочки вверх, вы сможете перенести текст ^
на следующую строку и это очень просто работает, но если вывести этот текст в консоль, он будет идти в строчку.

А что, если вы хотите вывести текст выше также, как это было и в коде? Эти ^ ёлочки не способны такого сделать, и тут можно сделать такую штуку:

@echo off
chcp 65001

set "n=&echo."
echo Это можно сказать простая табуляция.%n%Точнее обычная переменная,^
которая может спокойно перенести строчку на следующую.%n%^
Переменные мы разберем в следующей главе.

Переменные

В BATCH переменные бывают глобальные 🔓 и локальные 🔒, изначально они все глобальные, а также их несколько видов.
Глобальные переменные можно использовать повсюду, в скрипте, другом bat-файле, но только в текущей сессии. Что такое текущая сессия? 🤔 Простыми словами это открытая консоль в данный момент. Давайте разбираться, но для начала посмотрим, как можно создать самую простую переменную.

set variable_name=Simple variable

Любая переменная создается с ключевого слова set, дальше можно указать тип переменной (необязательно), после обозвать её. Значения переменной указываются после символа = без пробелов. Обычная переменная может содержать только строку (string).

@echo off
@rem Моя первая переменная, и сейчас я ее выведу на экран.

set text=Hello, world!
echo %text%

Вывод:

Hello, world!

Как вы наверное догадались, чтобы получить значение переменной, нужно обернуть название переменной в символы %.
Другой вид переменной, числовой.

С такой переменной можно проводить математические операции:

@echo off
@rem Как мне сложить два числа?

set /a number=2021 + 1
echo New %number% year

Вывод:

New 2022 year

Также можно создать две разных переменных и сложить их воедино.

@echo off

set /a number1=100
set /a number2=899
set /a result=number1 + number2

echo %number1% + %number2% = %result%

Вывод:

100 + 899 = 999

Давайте расмотрим еще один вид переменной.

@echo off

set /p input=Enter some text: 
echo %input%

Вход:

script запускаем файл
Enter some text: Don’t worry, smile!

Вывод:

Don’t worry, smile!

example

Такая переменная может принимать в себя данные, которые вы передадите.
Имеется еще один интересный вид переменной, она называется переменной аргумента.
Обозначается она таким образом: %1 %2 %3...

Вход:

script Something

Вывод:

Something

example

Когда мы запускаем наш bat-файл из консоли, мы можем передать любой аргумент после его названия: script Something.
script — название нашего файла, Something — наш желаемый аргумент. Если мы попытаемся передать несколько слов (аргументов) через пробел, то у нас засчитает только первое слово. То есть каждое новое слово по сути является новым аргументом.

Вход:

script Everything will be fine…

Вывод:

Everything

Этого можно избежать следующими способами:

  1. Указать больше переменных.
  2. Обернуть текст в кавычки " "
  3. Указать символ *
Способ первый:

Я хочу передать вот этот текст: Everything will be fine.... Здесь 4 слова (необязательно слова, после каждого нового пробела получается новый аргумент)

@echo off
echo %1 %2 %3 %4

Вход:

script Everything will be fine…

Вывод:

Everything will be fine…

Второй способ:

В этом способе я оберну текст в кавычки " "

Вход:

script «Everything will be fine…»

Вывод:

«Everything will be fine…»

Третий способ:

Вход:

script Everything will be fine…

Вывод:

Everything will be fine…

Также на основе таких переменных можно сделать небольшой калькулятор, для этого эту переменную нужно как-бы преобразовать в числовой тип:

@echo off

set /a value=%1
echo %value%

Вход:

script 12+12

Вывод:

24

example

Локальные переменные

Локальные переменные задаются в блоке от setLocal до endLocal. Такими переменными нельзя воспользоваться за пределами блока, и также они недоступны в сессии, как глобальные.

@echo off

set global_variable=I'm Global Elite

setLocal
set local_variable=I'm... I.. nobody?...
endLocal

Попробуйте запустить этот скрипт, а после прописать в консоли echo %global_variable%, получилось?
Теперь попробуйте echo %local_variable%. Мм.. нет?
Также глобальными переменными можно пользоваться в других bat-файлах. Попробуйте создать другой файлик и к примеру вывести глобальную переменную на экран.

В принципе все просто.
Практика:

  1. Попробуйте написать скрипт, который будет принимать ваше имя и возраст, после выводить его на экран.
Ваше имя: Даниил
Ваш возраст: 17

Привет, Даниил, а знаю, что тебе 17 лет!
  1. Попробуйте сделать простой калькулятор, который будет только складывать числа.
Введите первое число: 12
Введите второй число: 12

Ответ: 24

Циклы

Цикл for (по умолчанию)

Данный цикл используется для повторения файлов, пример:

@echo off

for %%i in (C:\folder\fantasy.txt C:\folder\myths.txt) do (
  copy %%i C:\Users\user\Desktop
)

example

Разберем начало цикла, цикл создается с ключевого слова for, следующим можно указать вид цикла /r, /d, /f, /l (необязательно). Вид цикла используется в разных ситуациях, в которых вы хотите его применить. Дальше в этом разберемся.
Переменная в цикле начинается с двух символов %%, а после записывается само название (названием переменной должен служить 1 единственный символ). \

В ( ) записываем пути к файлам, с которыми в будущем будем осуществлять работу.
Работа осуществляется в теле цикла, чтобы туда попасть, нужно записать ключевое слово do, открыть скобки () и приступить к написанию скрипта.
В этом случае, мы просто копируем файлы (fantasy.txt, myths.txt) в новую директорию.

Цикл for /R

Данный цикл используется для перебора файлов в директории:

@echo off

for /r C:\folder %%f in (*.txt) do (
  echo %%f
)

example

Здесь мы уже указываем команду /r, следующим можно передать папку, которая будет считаться корневой, если не передавать директорию (C:\folder) — текущая директория будет считаться корневой. Также поиск файлов будет осуществляться и в подпапках.
%%f — является переменной. В скобках ( ), можно передать файлы, по которым будет осуществляться поиск. Их может быть несколько (*.txt *.py *.bat) или можно записать ., она будет искать все файлы в целом (в подпапках тоже).

Цикл for /D

Используется для загрузки списка папок, которые являются подпапками текущей директории:

@echo off

cd C:\folder

for /d %%f in (f* n*) do (
  echo %%f
)

example

В данном примере мы получим список папок в директории C:\folder, которые начинаются с букв f и n. Если передать *, мы получим список всех папок находящихся в директории.

Цикл for /l

Этот цикл служит для загрузки на ряде цифр (range of numbers):

@echo off

for /l %%i in (1, 1, 10) do (
  echo %%i
)

example

В этом примере мы выведим цифры от 1 до 10. \

for /l %%i in (start, step, end) do (
  echo %%i
)
  • start: Первое значение переменной
  • step: После каждого повтора (iteration) значение переменной будет прибавлять ‘step’.
  • end: Последнее значение.

…дописывается


Windows

  • 09.06.2020
  • 122 404
  • 9
  • 265
  • 259
  • 6

Настройка кодировки шрифтов в cmd/bat (иероглифы, кракозябры)

  • Содержание статьи
    • Исправляем проблему с кодировкой с помощью смены шрифта
    • Исправляем проблему с кодировкой с помощью смены кодировки
    • Комментарии к статье ( 9 шт )
    • Добавить комментарий

В некоторых случаях, когда используется неверная кодировка, могут возникать так называемые кракозябры или иероглифы, т.е. не читаемые символы, которые невозможно разобрать при работе с командной строкой. Эти проблемы могут также возникать и при запуске различных BAT-файлов. В данной статье мы расскажем о том, как можно сменить шрифт или кодировку, чтобы избавиться от этой проблемы. Пример таких не читаемых символов можно видеть на картинке ниже:

Исправляем проблему с кодировкой с помощью смены шрифта

Первым делом нужно зайти в свойства окна: Правой кнопкой щелкнуть по верхней части окна -> Свойства -> в открывшемся окне в поле Шрифт выбрать Lucida Console и нажать кнопку ОК.
После этого не читаемые символы должны исчезнуть, а текст должен выводиться на русском языке.

Исправляем проблему с кодировкой с помощью смены кодировки

Вместо смены шрифта, можно сменить кодировку, которая используется при работе cmd.exe.
Узнать текущую кодировку можно введя в командной строке команду chcp, после ввода данной команды необходимо нажать Enter.

Как видно на скриншоте, текущая используемая кодировка Windows-1251
Для изменения кодировки нам необходимо воспользоваться командой chcp <код_новой_кодировки>, где <код_новой_кодировки> — это сам код кодировки, на которую мы хотим переключиться. Возможные значения:

  • 1251 — Windows-кодировка (Кириллица);
  • 866 — DOS-кодировка;
  • 65001 — Кодировка UTF-8;

Т.е. для смены кодировки на DOS, команда примет следующий вид:

chcp 866

Для смены кодировки на UTF-8, команда примет следующий вид:

chcp 65001

Для смены кодировки на Windows-1251, команда примет следующий вид:

chcp 1251

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Ошибка 0x800f0900 windows 10 как исправить
  • Как перевернуть видео в windows плеере
  • Как открыть окно на полный экран windows
  • Программа для сброса пароля на windows 7 через флешку
  • Dps watch dogs violation windows 11