Это просто! Надо всего лишь прочитать 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
|
|
|
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 минуты
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-файла надо написать строку
,
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 Я не собираюсь вводить кириллицу в командный файл… ), Для такого файла не существует дифференциации на какие-нибудь кодировки, так как в данном случае файл просто сохраняется в 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!
Такая переменная может принимать в себя данные, которые вы передадите.
Имеется еще один интересный вид переменной, она называется переменной аргумента.
Обозначается она таким образом: %1 %2 %3...
Вход:
script Something
Вывод:
Something
Когда мы запускаем наш bat-файл из консоли, мы можем передать любой аргумент после его названия: script Something.
script — название нашего файла, Something — наш желаемый аргумент. Если мы попытаемся передать несколько слов (аргументов) через пробел, то у нас засчитает только первое слово. То есть каждое новое слово по сути является новым аргументом.
Вход:
script Everything will be fine…
Вывод:
Everything
Этого можно избежать следующими способами:
- Указать больше переменных.
- Обернуть текст в кавычки
" " - Указать символ
*
Способ первый:
Я хочу передать вот этот текст: 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
Локальные переменные
Локальные переменные задаются в блоке от 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-файлах. Попробуйте создать другой файлик и к примеру вывести глобальную переменную на экран.
В принципе все просто.
Практика:
- Попробуйте написать скрипт, который будет принимать ваше имя и возраст, после выводить его на экран.
Ваше имя: Даниил
Ваш возраст: 17
Привет, Даниил, а знаю, что тебе 17 лет!
- Попробуйте сделать простой калькулятор, который будет только складывать числа.
Введите первое число: 12
Введите второй число: 12
Ответ: 24
Циклы
Цикл for (по умолчанию)
Данный цикл используется для повторения файлов, пример:
@echo off for %%i in (C:\folder\fantasy.txt C:\folder\myths.txt) do ( copy %%i C:\Users\user\Desktop )
Разберем начало цикла, цикл создается с ключевого слова 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 )
Здесь мы уже указываем команду /r, следующим можно передать папку, которая будет считаться корневой, если не передавать директорию (C:\folder) — текущая директория будет считаться корневой. Также поиск файлов будет осуществляться и в подпапках.
%%f — является переменной. В скобках ( ), можно передать файлы, по которым будет осуществляться поиск. Их может быть несколько (*.txt *.py *.bat) или можно записать ., она будет искать все файлы в целом (в подпапках тоже).
Цикл for /D
Используется для загрузки списка папок, которые являются подпапками текущей директории:
@echo off cd C:\folder for /d %%f in (f* n*) do ( echo %%f )
В данном примере мы получим список папок в директории C:\folder, которые начинаются с букв f и n. Если передать *, мы получим список всех папок находящихся в директории.
Цикл for /l
Этот цикл служит для загрузки на ряде цифр (range of numbers):
@echo off for /l %%i in (1, 1, 10) do ( echo %%i )
В этом примере мы выведим цифры от 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
- Содержание статьи
- Исправляем проблему с кодировкой с помощью смены шрифта
- Исправляем проблему с кодировкой с помощью смены кодировки
- Комментарии к статье ( 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
