Не корректно отображается Русский текст в CMD? Решение есть! Cmd комментарии
batch-file - Как «прокомментировать» (добавить комментарий) в пакет / cmd?
Команда rem действительно для комментариев. По сути, он не обновляет никого после запуска скрипта. Некоторые авторы сценариев могут использовать его таким образом вместо echo , хотя, потому что по умолчанию пакетный интерпретатор будет распечатывать каждую команду до ее обработки. Поскольку команды rem ничего не делают, безопасно печатать их без побочных эффектов. Чтобы избежать печати команды, префикс ее с помощью @ или, чтобы применить этот параметр во всей программе, запустите @echo off . (Это echo off чтобы избежать печати дальнейших команд, @ должна избегать печати этой команды до вступления в силу настройки эха).
Итак, в своем пакетном файле вы можете использовать это:
@echo off REM To skip the following Python commands, put "REM" before them: python foo.py python bar.pyНет, простые старые командные файлы используют REM в качестве комментария. ECHO - это команда, которая печатает что-то на экране.
Чтобы «прокомментировать» разделы файла, вы можете использовать GOTO . Пример всех этих команд / методов:
REM it starts here the section below can be safely erased once the file is customised ECHO Hey you need to edit this file before running it! Check the instructions inside ECHO Now press ctrl-c to interrupt execution or enter to continue PAUSE REM erase the section above once you have customised the file python executed1.py ECHO Skipping some stuff now GOTO End python skipped1.py python skipped2.py :END python executed2.pyЧто я могу сказать? пакетные файлы являются реликвией давно ушедших, они неуклюжи и уродливы.
Вы можете прочитать больше на этом сайте .
EDIT: немного изменил пример, чтобы он содержал элементы, которые вы, по-видимому, ищете.
Многострочные комментарии
Если есть большое количество строк, которые вы хотите прокомментировать, тогда будет лучше, если вы сможете делать многострочные комментарии, а не комментировать каждую строку.
Язык пакета не имеет блоков комментариев, хотя есть способы достижения эффекта.
GOTO EndComment1 This line is comment. And so is this line. And this one... :EndComment1Или, если блок комментариев появляется в конце командного файла, вы можете записать EXIT в конце кода, а затем любое количество комментариев для вашего понимания.
@ECHO OFF REM Do something • • REM End of code; use GOTO:EOF instead of EXIT for Windows NT and later EXIT Start of comment block at end of batch file This line is comment. And so is this line. And this one...robvanderwoude.com/comments.php
code-examples.net
|
|
|
homegeton.ucoz.com
Cmd.exe — Википедия (с комментариями)
Материал из Википедии — свободной энциклопедии
У этого термина существуют и другие значения, см. Cmd.Cmd.exe — интерпретатор командной строки (англ. command line interpreter) для операционных систем OS/2, Windows CE и для семейства операционных систем, базирующихся на Windows NT (англ. Windows NT-based). cmd.exe является аналогом COMMAND.COM, которая используется в семействах MS-DOS и Windows 9x. В операционных системах семейства Windows NT для архитектуры IA-32 и OS/2 имеется и COMMAND.COM для совместимости со старыми программами. В настройках интерпретатора присутствует возможность изменить размер курсора, шрифт, цвет текста и размер окна.
Версии
Therese Stowell разработала начальную версию cmd.exe для Windows NT.[1] Хотя некоторые старые команды DOS не поддерживались или были изменены, cmd.exe всё ещё имеет большое количество унаследованных от DOS команд.
В отличие от command.com, cmd.exe, в системах OS/2 и семействе Windows NT имеет более детальные сообщения, чем общее «Неверная команда или имя файла» (англ. "Bad command or file name") в случае неправильно введённых команд. Сообщения об ошибках cmd.exe выводит на том языке, который установлен в системе как текущий.
cmd.exe всё ещё остаётся частью современных операционных систем Microsoft для персональных компьютеров (в том числе Windows 8 и Windows Server 2012) для обеспечения обратной совместимости. В качестве основной командной оболочки в этих системах рассматривается Windows PowerShell.
Примеры команд
shutdown -r -f -t 30 -c #«Мягкая» перезагрузка компьютера через 30 сек. xcopy C:\folder1 D:\folder2 /e #Копирование содержимого из одной папки в другую control userpasswords #вызов окна учетных записей пользователей ping -t 8.8.8.8 #запуск утилиты ping в непрерывном режимеНапишите отзыв о статье "Cmd.exe"
Примечания
- ↑ Zachary G. Pascal. Showstopper! The Breakneck Race to Create Windows NT and the Next Generation at Microsoft. — Warner Books, 1994. — ISBN ISBN 0-02-935671-7.
См. также
Ссылки
- [www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/cmd.mspx?mfr=true MSDN Документация для cmd.exe на Windows XP] (англ.)
- [www.dostips.com/DtTutoFunctions.php DOS Batch — CALL Functions and Recursion] (англ.)
Отрывок, характеризующий Cmd.exe
– Ну, мой друг, я боюсь, что вы с монахом даром растрачиваете свой порох, – насмешливо, но ласково сказал князь Андрей. – Аh! mon ami. [А! Друг мой.] Я только молюсь Богу и надеюсь, что Он услышит меня. Andre, – сказала она робко после минуты молчания, – у меня к тебе есть большая просьба. – Что, мой друг? – Нет, обещай мне, что ты не откажешь. Это тебе не будет стоить никакого труда, и ничего недостойного тебя в этом не будет. Только ты меня утешишь. Обещай, Андрюша, – сказала она, сунув руку в ридикюль и в нем держа что то, но еще не показывая, как будто то, что она держала, и составляло предмет просьбы и будто прежде получения обещания в исполнении просьбы она не могла вынуть из ридикюля это что то. Она робко, умоляющим взглядом смотрела на брата. – Ежели бы это и стоило мне большого труда… – как будто догадываясь, в чем было дело, отвечал князь Андрей. – Ты, что хочешь, думай! Я знаю, ты такой же, как и mon pere. Что хочешь думай, но для меня это сделай. Сделай, пожалуйста! Его еще отец моего отца, наш дедушка, носил во всех войнах… – Она всё еще не доставала того, что держала, из ридикюля. – Так ты обещаешь мне? – Конечно, в чем дело? – Andre, я тебя благословлю образом, и ты обещай мне, что никогда его не будешь снимать. Обещаешь? – Ежели он не в два пуда и шеи не оттянет… Чтобы тебе сделать удовольствие… – сказал князь Андрей, но в ту же секунду, заметив огорченное выражение, которое приняло лицо сестры при этой шутке, он раскаялся. – Очень рад, право очень рад, мой друг, – прибавил он. – Против твоей воли Он спасет и помилует тебя и обратит тебя к Себе, потому что в Нем одном и истина и успокоение, – сказала она дрожащим от волнения голосом, с торжественным жестом держа в обеих руках перед братом овальный старинный образок Спасителя с черным ликом в серебряной ризе на серебряной цепочке мелкой работы. Она перекрестилась, поцеловала образок и подала его Андрею. – Пожалуйста, Andre, для меня… Из больших глаз ее светились лучи доброго и робкого света. Глаза эти освещали всё болезненное, худое лицо и делали его прекрасным. Брат хотел взять образок, но она остановила его. Андрей понял, перекрестился и поцеловал образок. Лицо его в одно и то же время было нежно (он был тронут) и насмешливо.Работа с массивами в bat / Хабрахабр
Прочитав пост Свой сапер на своих батниках и пробежавшись по коду, наткнулся на комментарий, что в батниках нет массивов (кстати, в последней версии Сапера, о котором идёт речь в том посте, нет этого комментария). Так вот, если в батнике необходимо использовать некоторый набор значений, то логично объявить такое кол-во переменных, которое требуется и работать с ними. Собственно данный сценарий эту задачу помогает решить проще. Вот несколько примеров: echo Создание массива А: call :array new A "'one','two','three','foo','bar'" echo Получение третьего элемента в result: call :array get A 3 result echo %result% echo Изменение нулевого элемента call :array set A 0 "первый элемент"
Принцип
Обращение с массивами происходит с помощью вызовов call :array и передачи соответствующих параметров. Первый параметр это действие, а второй имя массива. Ещё за этими двумя могут следовать дополнительно как обязательные, так необязательные параметры. Каждый массив представляет собой набор переменных вида array_[имя массива]_[индекс элемента] и одной переменной, содержащей размер — array_[имя массива]_count. Предполагается, что эти переменные вручную не изменяются.Создание массивов
Для создания массивов есть несколько методов. Основные это create, new и load. Метод create создает массив заданного размера. Также можно задать начальные значения, которые по умолчанию равны нулю. И ещё, надо сказать, что значения не могут быть пустыми, это особенность команды set.rem call :array call :array create имя_массива [размер=0] [начальные значения=0]rem Создание массива, размером 5. При этом все элименты равны нулю - 0 call :array create myArray 5
rem Создание массива, размером 5 и все элименты равны строке "my value" rem Значения будут без кавычек call :array create myArray 5 "my value"
Но куда более удобно создавать массив сразу с заданием значений. Для этого служит команда new:
rem call :array new имя_массива "знач1, знач2, 'строка' ..."rem Создание массива A со значениями 90, 56, 'два слова' call :array new A "90 56 'два слова'"
Можно загрузить значения из внешнего файла. Хочется заметить, что исходный файл должен быть в кодировке 1251 и текущая кодовая страница не влияет на это:
rem call :array load имя_массива имя_файлаrem Чтение значений из файла records.txt в Table. Каждая строка - одно значение. Пустые строки пропускаются call :array load Table records.txt
Доступ к элементам
Доступ к каждому элементу возможен по индексу. Надо сказать пару слов о процедурах, возвращающих значение. Т.к. в батниках нет возможности вернуть значение из процедуры (будем так называть то, что вызывается через call), то приходится делать финт ушами: все процедуры, от которых ожидается результат, записывают его в переменную _l (эль маленькая, вроде как от слова last. Хотя потом я стал склоняться к тому, что result логичней). Имя переменной можно, как правило, переопределить, передав её имя последним параметром.
rem Получение первого элемента массива myArray. Результат будет содержаться в _l call :array get myArray echo Первый элемент - %_l%
rem Получение второго с конца элемента массива myArray в переменную ok call :array get myArray -2 ok echo Вот результат: %ok%
При отладке часто необходим быстрый вывод значений. В этом может помочь echo (алиас к get+echo) и dump (распечатка массива).
rem Вывод последнего элемента myArray call :array echo myArray -1rem Распечатка всего массива call :array dump myArray
Распечатка выглядит так:array[4]: myArray [0] первый элемент [1] второй [2] 3й [3] последнийВывод элементов списком с помощью list позволяет сохранить его в файл. К сожалению, у меня не получилось перенаправить его на другую команду. Например call :array list myArray | sort приводит к ошибке «Недопустимая попытка перехода на метку пакетного файла извне этого файла.»
call :array list myArray > output.txt Для получения количество элементов используется команда count (она по сути просто читает его из переменной array_[имя массива]_count, но с дополнительными проверками на существование и проч.:call :array count myArray len echo Массив содержит %len% элементов.Команда find возвращает индекс первого найденного элемента или -1 если совпадения отсутствуют. Здесь появляются так называемые флаги. Это параметры, которые могут быть, а могут и не быть. Они обычно идут последними, но иногда после них можно указать имя переменной для результата, и может возникнуть вопрос как быть тогда. В этом случае, если флаг не нужен, а задать переменную нужно, на позиции влага просто указывайте любое другое значение, например решётку #, или минус -. Ну, в примерах покажу.
rem call :array find имя_массива искомый_элемент N [имя_целевой_переменной=_l] rem Здесь N - просто замена флагу I. Если не указываете имя целевой переменной, то и N можно не ставить. rem sebastNum будет содержать номер элемента, который равен Себастьяну с учетом регистра. call :array find myArr "Себастьян Перейро" N sebastNumrem и без учёта: call :array find myArr "Себастьян Перейро" I sebastNum
rem и с учётом в переменную по умолчанию _l: call :array find myArr "Себастьян Перейро"
Манипуляции с массивами
Пока я реализовал задание значения элементу по индексу, удаление элементов, копирование массивов, удаление массивов, добавление элементов.
И ещё надо сказать о наборах. Некоторым процедурам можно передавать в качестве параметров наборы. Эти наборы потом передаются команде for на обработку, поэтому они должны быть написаны так, как этот for хочет. А он не требователен: элементы набора разделяются запятой (,) или пробелом ( ), а строковые надо заключать в кавычки. Но т.к. сами параметры тоже заключаются в двойные кавычки, то в наборах должны быть одинарные ('). Смотрите пример add.
rem Задание значения rem call :array set имя_массива индекс значение call :array set myArray 5 'пятый элемент'rem Копирование массива rem call :array copy имя_копируемого имя_конечного call :array copy myArray finalArray
rem Добавление элемента в конец массива rem call :array add имя_массива значение rem call :array add myArray 2012
rem Добавление элементов в конец массива. Здесь указывается набор, и чтобы значть, что это набор, нужно указать параметр ! - восклицательный знак rem call :add имя_массива набор ! call :array add myArray "'строка один' 120 454.34 'sd'" ! rem Можно передать набор через expand и не указывать флаг "!" call :array expand myArray "'строка один' 120 454.34 'sd'"
rem Удаление элементов из массива rem call :array del имя_массива [индекс_элемента|набор элементов=удаление всего массива]
rem Если третьим параметром (первый это del) указать число, то будет удалёт эл-т с таким индексом rem удаляет из массива myArr 9й элемент call :array del myArr 9
rem Если передать набор, то будут удалены элементы с индексами из набора rem удаляет из массива myArr элементы с индексами 4, 6 и 8 call :array del myArr "4,6,8"
rem А если не указывать третий парамет, то будет удален массив полностью call :array del myArr
Дополнительные возможности
Это на мой взгляд самые интересные операции. Их можно было отнести к манипуляциям, но я решил выделить их отдельно.
Сохранение в файл в кодировке cp1251
Сохранение в файл можно реализовать, как уже говорилось выше, воспользовавшись перенаправлением вывода list. Но если нужно сохранить в файл в кодировке cp1251, то лучше воспользоваться командой save:
rem call :array save имя_массива имя_файлаcall :array save results Результаты.txt
Сортировка массива
Выполняется командой sort. Можно было реализовать сортировку обычным пузырьком, но я решил всё же воспользоваться помощью команды sort. Но в этом подходе есть ряд минусов: создаётся два файла во временном каталоге (скинутый массив и отсортированный, которые затем, правда, всё же удаляются) и числа сортируются как строки. Плюсов правда тоже два: так, как мне кажется, всё же быстрее, хоть я и не гнался за скоростью (и это видно по операции del с набором индексов), и простота, и это меня и склонило окончательно к выбору этого метода.
rem call :array sort имя_массива [R - для сортировки в обратном порядке]rem массив myArray будет отсортирован в обратном порядке call :array sort myArray R
Применение процедуры к каждому элементу
Используется команда each и здесь есть два подхода. Первый это передача непосредственно команды. В этом случае можно использовать подстановки _i_ для индекса текущего элемента и _val_ для его значения. Чтобы скрипт понял, что вы передаете команду, укажите последним параметром x (икс)
call :array new B "1 4 1 6 7 2" set sum=0 call :array each B "set /a sum+=_val_" x rem sum будет содержать сумму всех элементов массива (двадцать одно)Второй подход это указание метки, которая будет вызываться для каждого элемента: call :имя_указанной_метки значение индекс. Если первый способ отличается простотой, то этот предоставляет более гибкие возможности. Например:
rem Задаём массив call :array new someArray "1902 2007 2012 1954 1945 1989"rem Задаём начальные данные set pos=0 call :array get someArray %pos% val
rem Вызываем для каждого элемента процедуру findMax call :array each someArray findMax
rem Выводим результат echo Максимальный год %val%. Позиция %pos%
goto :eof
:findMax rem Здесь %~1 - значение (без кавычек, за счёт ~)~, %2 - индекс.
if %~1 GTR %val% ( set val=%~1 set pos=%2 )
goto :eof
Вспомогательные процедуры
Для реализации некоторых операции используются некоторые отдельные процедуры (вызываются не через :array, вот что имеется ввиду). Они могут тоже показаться интересными:
- :set имя_конечной_переменной имя_исходной — задает конечной переменной значение исходной. Особенность в то, что при вызове этой процедуры, можно имена переменных составлять из кусочков (как позже заметил, можно вызвать напрямую set: call set result value
- :is_number значение [имя_целевой_переменной=_l] — проверяет, является ли значение числом (целым, но можно расширить и сделать проверку чисел с точкой, но мне не нужно было). Работает в лоб: вырезает все цифры и сравнивает с пустой сторкой.
- :str_replace имя_исходной_переменной искомая_строка подстановка [имя_целевой_переменной=имя_исходной_переменной] — замена подстроки в строке
Скачать
Можно посмотреть код на Google Docs или pastebin.com.
Спасибо, вот теперь могу заниматься чем-нибудь действительно полезным.
habr.com
Как в CMD сменить кодировку? Русский текст в CMD
Как корректно отобразить Русский текст в CMD. Проблемы с кодировкой могут возникнуть, например, при выполнении Bat файла, когда нужно вывести в консоль русский текст и при других обстоятельствах, о которых речь пойдёт далее.
Рассмотрим пример: когда нужно вывести в консоль Русский текст, скажем «Примет мир». Для этого создадим Bat файл с именем «1.bat». Используйте для этого обычный Блокнот Windows (Notepad.exe) Запишем в него следующие строки!
@Echo off echo. echo ПРИВЕТ МИР echo. PauseДля тех, кто не понял или не в курсе, строчки «echo.» я добавил специально, что бы были отступы, от строки «Примет мир»
Теперь запускаем файл 1.bat и результат будет такого вида.
Как видим проблема с кодировкой в cmd на лицо. И произошло это по следующей причине.
Стандартный блокнот Windows сохранил Bat файл в кодировке «1251» а консоль вывела его в кодировки «866». Вот от сюда все проблемы!
Решения проблемы с кодировкой в CMD. 1 Способ.
Для решения проблемы нужно просто использовать текстовой редактор, с помощью которого можно сохранить текст в кодировке «866». Для этих целей прекрасно подходит «Notepad++» (Ссылку для загрузки Вы можете найти в моём Twitter-e).
Скачиваем и устанавливаем на свой компьютер «Notepad++».
После запуска «Notepad++» запишете в документ те же строки, которые мы уже ранние записывали в стандартный блокнот.
@Echo off echo. echo ПРИВЕТ МИР echo. PauseТеперь осталось сохранить документ с именем «2.bat» в правильной кодировке. Для этого идём в меню «Кодировки > Кодировки > Кириллица > OEM-866»
и теперь сохраняем файл с именем «2.bat» и запускаем его! Поле запуска результат на лицо.
Как видим, текст на Русском в CMD отобразился, как положено.
Решения проблемы с кодировкой в CMD. 2 Способ.
Теперь рассмотрим ещё одну ситуацию, когда могут возникнуть проблемы с кодировкой в CMD.
Допустим, ситуация требует сохранить результат выполнения той или иной команды в обычный «TXT» файл. В приделах этого поста возьмём для примера команду «HELP».
Задача: Сохранить справку CMD в файл «HelpCMD.txt. Для этого создайте Bat файл и запишите в него следующие строки.
@Echo off Help > C:\HelpCMD.txt PauseПосле выполнения Bat файла в корне диска «C:\» появится файл «HelpCMD.txt» и вместо справки получится вот что:
Естественно, такой вариант не кому не понравится и что бы сохранить справку в понятном для человека виде, допишите в Bat файл строку.
chcp 1251 >nulТеперь содержимое кода будет такое.
@Echo off chcp 1251 >nul Help > C:\HelpCMD.txt PauseПосле выполнения «Батника» результат будет такой:
Вот так на много лучше, правда?
Пожалуй, на этом я закончу пост. Добавить больше нечего. Если у Вас имеются какие-то соображения по данной теме, буду рад Вашему комментарию к посту.
Дополнительно из комментариев то Garric
Автор очень хорошо описал принцип. ! Но это неудобно.Нужно бы добавить. Если автор добавит это в статью то это будет Good.Создаём файл .reg следующего содержания:——Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.bat\ShellNew]«FileName»=»BATНастроенная кодировка.bat»——Выполняем.——Топаем в %SystemRoot%\SHELLNEWСоздаём там файл «BATНастроенная кодировка.bat»Открываем в Notepad++Вводим любой текст. (нужно!) Сохраняемся.Удаляем текст. Меняем кодировку как сказано в статье. Сохраняемся.———-Щёлкаем правой кнопкой мыши по Рабочему столу. Нажимаем «Создать» — «Пакетный файл Windows».Переименовываем. Открываем в Notepad++. Пишем батник.В дальнейшем при работе с файлом не нажимаем ничего кроме как просто «Сохранить». Никаких «Сохранить как».
winkomp.ru