Форум программистов, компьютерный форум, киберфорум
Наши страницы

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 4.00
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
#1

Тонкости языка, редкие команды и сложные скрипты - CMD/BAT

16.10.2012, 06:56. Просмотров 121210. Ответов 92

Тема для пользователей высокого уровня подготовки.

Здесь можете размещать:
  • Ваши статьи;
  • Ссылки на другие статьи (допускаются ссылки на другой форум с указанием авторства, а также на английском языке);
  • Редкие ошибки, выдаваемые интерпретатором, способы их устранения/либо причины возникновения.
  • Недокументированные и особые трюки работы с файловой системой, устройствами и т.п.
  • Разрешено обсуждение выложенных здесь материалов (в последствии будут выделены в отдельную тему);
  • Запрещено обсуждение новичками проблем работы с CMD, где вероятная причина - банальная синтаксическая ошибка.


Статьи и тонкости языка:
Основы
  • FAQ по файлам BAT/CMD (статья) ссылка
  • Командная строка Windows (статья) ссылка
  • Особенности реализации командного процессора cmd.exe операционных систем WinNT (статья) сайт
  • Циклические операции и примеры (статья) эта тема
  • Принцип составления однострочных команд Batch (статья) эта тема
Автозапуск
  • Запуск Bat-файла как службы Эта тема
  • Выполнение командного файла перед входом в систему Эта тема
Безопасность и права
  • Элевация прав запуска BAT-файла (отображается диалог контроля учетных записей UAC) ссылка
  • Как запустить командную строку от имени администратора. эта тема
Интерфейс
  • Переключение языка вывода команд консоли на английский ссылка
КомментарийМатематика
  • Деление с выводом дробной части на батниках ссылка
  • Деление через строковую математику (для делимого, превышающего тип данных signed long int) ссылка
  • Получение 16-ричного представления числа эта тема
  • Получение кода символа по таблице ASCII из числового значения byte эта тема
  • Перевод чисел из десятеричной системы в любую (2-16) эта тема
  • Логические операции сравнения для чисел, превышающих арифметику CMD эта тема
Операционная система, реестр
  • Почему нежелательно запускать BAT из 32-битной среды в 64-разрядной системе. ссылка
  • Функции чтения/записи ключа реестра с отображением уровня ошибки ссылка
Переменные и аргументы
  • Подстановка значения переменной в имя или параметр другой переменной эта тема
  • Перебросить значение через локаль эта тема
  • Часто задаваемые вопросы по использованию аргументов командной строки (статья) сайт
  • Получение рабочего каталога на определенном диске эта тема
  • Undocumented Dynamic variables (недокументированные способы раскрытия переменных среды) эта тема
ПотокиПроцессы
  • Получение PID, имени, пути и параметров запуска процесса эта тема
Связь с другими языками программирования и средами, комбинированные батники

  • -- JScript
  • Скомбинированный файл CMD + JS (WSH) эта тема
  • Выполнение JS кода через mshta.exe эта тема
    -- VBScript
  • Передача значения из BAT-сценария в VBS-скрипт эта тема
  • Метод возврата значения из VBS-скрипта в BAT-сценарий эта тема
  • Получение ErrorLevel из команды CMD в переменную VBS-скрипта тема
    -- Реестровый ключ
  • Способ хранения ключа реестра внутри бат-файла эта тема
    -- Ресурсы внутри BAT-файла
  • Распаковка текстовой информации, заданной меткой в файле CMD, во внешний файл тема
  • Встраивание ресурсов в БАТ-файл тема
    -- Другое:
  • Комбинированный файл CMD + KIXTART
  • Объектно-ориентированное программирование на bat ссылка
Текстовые операции и работа с "массивами"
  • Вывод текста без переноса на новую строку (статья) эта тема
  • Чтение текста из файла без пропуска пустых строк эта тема
  • Экранировать восклицательный знак эта тема
  • Получить последний токен в заданной строке эта тема
  • Урезать в строке справа лишние пробелы или другие подряд идущие символы эта тема
  • Получение символов BackSpace (0x08) и Esc (0x27) в переменную эта тема
  • Функция для работы с массивами эта тема
  • Считывание файла в псевдомассив с учетом пустых строк эта тема
  • Функция правильного выравнивания текста по знакам табуляции эта тема
  • Способ передачи в бат-файл параметра содержащего символы & и последующей обработки полученного значения эта тема
Циклы
  • Подстановка переменной в роле модификатора для цикла эта тема
  • Разбиение строки на токены, если разделитель - кавычка эта тема
Файловые операции
  • Объединить 2 файла (сохранив результаты в одном из них) эта тема
  • Получение информации о размере папки эта тема

References, Special Manuals, Книги для High Level Users:
  • Command-line Reference (Microsoft Tech-Net)
  • Недокументированные и малоизвестные возможности Windows XP (книга)
  • Описание встроенных консольных утилит и команд для различных версий ОС dx21.com CMD-Reference

Баги интерпретатора CMD и встроенных команд
Планируется разместить:
Rem не всегда является командой начала комментария
Создание и удаление точек повторной обработки сайт
.

Если у Вас возникли вопросы, создайте новую тему.
15
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2012, 06:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Тонкости языка, редкие команды и сложные скрипты (CMD/BAT):

После выполнения определённой команды не выполняются последующие команды - CMD/BAT
Объясните, пожалуйста, почему может останавливаться выполнение второй и далее комманд? cd C:\Users\alex_iv\Desktop\test_node\ node...

Тонкости языка С,define - C (Си)
Здравствуйте. Разбираюсь с одной либой для hd44780, есть вопрос по поводу использования define'ов. Вот отрывок: #define GLUE(a,...

Поддерживает ли встроенный сервер PHP скрипты языка Perl? - Perl
В PHP существует встроенный сервер. Создаю файл index.html с формой и файл test.pl для ее обработки. Хотел протестировать на встроенном...

создать програму которая содержит в себе команды обработки строк языка асемблер - Assembler
Создать програму которая содержит в себе команды обработки строк языка асемблер. Выполнить введение строки из 40 символов. Слова в строке...

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

Частые сохранения в SQLite или редкие, но массивные? - Программирование Android
Приветствую, Пишу приложение, являющееся по своей сути онлайн-словарем. Сейчас требуется реализовать функции "избранное" и "история"....

92
ComSpec
Модератор
3395 / 1940 / 624
Регистрация: 26.02.2014
Сообщений: 1,457
20.08.2015, 08:14 #76
Правильный вывод заранее сформированных строк



Код для пакетного файла:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in (
 
abcdefg
hijklmn
opqrstu
vwxyz
 
) do echo %%i
 
pause>nul
.


Если в строках будут присутствовать пробелы, символы табуляции и символы

=
;
,
,

то такие строки нужно заключать в кавычки и применять модификатор "~":

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in (
 
"abc defg"
"hijk=lmn"
"opqr;stu"
"vw,xyz"
 
) do echo.%%~i
 
pause>nul
.


Если в строках будут присутствовать символы

^
&
)
|
<
>
,

то эти символы нужно экранировать с помощью символа "^":

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in (
 
abc^&defg
hijk^)lmn
opqr^|stu
vw^<xyz
 
) do echo.%%i
 
pause>nul
(или также заключать строки в кавычки и применять модификатор "~").


Символ

%
в строках необходимо удваивать.


Символы

*
?
в строках не допускаются.


Наличие символа

"
в строках в отдельных случаях возможно, но в общем случае нежелательно.


Если в строках будет присутствовать символ

я
(в кодировке "Win-1251"), то такую строку также обязательно нужно заключать в кавычки и использовать модификатор "~":

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in (
 
"яблоко"
"ряд"
"змея"
"я"
 
) do echo.%%~i
 
pause>nul
.

Символ "я" в кодировке "Win-1251" воспринимается интерпретатором как пробельный символ и при соблюдении тех же требований, что и для пробела, выводится в консольное окно также в виде пробела, а при выводе результата в файл -- как буква "я".

Сравните результаты вывода в файл для этих двух кодов (кодировка пакетного файла -- "Win-1251"):

Windows Batch file
1
2
3
4
5
6
7
8
9
10
@echo off
 
for %%i in (
 
яблоко
ряд
змея
я
 
) do echo %%i>>"strings.txt"
и

Windows Batch file
1
2
3
4
5
6
7
8
9
10
@echo off
 
for %%i in (
 
"яблоко"
"ряд"
"змея"
"я"
 
) do echo.%%~i>>"strings.txt"
.



Скопировано из темы "Вывод заранее сформированных строк".
4
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
18.02.2016, 02:42  [ТС] #77
Вывод файла c конца (в обратной последовательности строк) через Sort

Windows Batch file
1
sort /+2147483647 file.txt
Копирование содержимого нескольких файлов в один
(от alpap)
1
greg zakharov
Покинул форум
1436 / 699 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 40
24.04.2016, 13:43 #78
Любопытная фича (баг?) regsvr32
Windows Batch file
1
2
rem удалить перед http знак _
regsvr32 /s /u /n /i:_http://www.piriform.com/ccleaner/download/portable/downloadfile scrobj.dll
Загрузит во временные файлы встроенного браузера (IE) ccleanerX.zip, - это возможно благодаря поддержке установки компонентов по сети. Правда на некоторых ссылках regsvr32 рога себе все же обламывает.
2
ComSpec
Модератор
3395 / 1940 / 624
Регистрация: 26.02.2014
Сообщений: 1,457
01.05.2016, 08:52 #79
Перезапись содержимого текстового файла в верхнем регистре:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off
 
set "file=example.txt"
 
>nul chcp 1251
<"%file%">$ (
 for /f "delims=" %%i in ('find/n /v ""') do @(
  set x=%%i& call set "x=%%x:?=$#$%%"& call set "x=%%x:"=$@$%%"
  for /f "tokens=3*" %%j in ('2^>^&1 cmd/v/c find "" "!x!"') do @(
   set x=%%k
   cmd/v/c echo[!x:*]^^=!
  )
 )
)
>nul chcp 866
<$>"%file%" (
 for /f "delims=" %%i in ('find/n /v ""') do @(
  >nul chcp 1251
  set x=%%i& call set "x=%%x:$#$=?%%"& call set "x=%%x:$@$="%%"
  cmd/v/c echo[!x:*]^^=!
 )
)
del $
 
exit/b 0
.



Перезапись содержимого текстового файла в нижнем регистре:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off
 
set "file=example.txt"
 
>nul chcp 1251
<"%file%">$ (
 for /f "delims=" %%i in ('find/n /v ""') do @(
  set x=%%i& call set "x=%%x:\=$`$%%"& call set "x=%%x:|=${$%%"& call set "x=%%x:/=$@$%%"
  call set "x=%%x::=$#$%%"& call set "x=%%x:<=$'$%%"& call set "x=%%x:>=$;$%%"
  call set "x=%%x:?=$,$%%"& call set "x=%%x:"=$+$%%"
  for /f "delims=" %%j in ('cmd/v/c rem:^^^>"!x!"^^^& dir/b/l "!x!"^^^& del "!x!"') do @(
   set x=%%j& call set "x=%%x:$`$=\%%"& call set "x=%%x:${$=|%%"& call set "x=%%x:$@$=/%%"
   call set "x=%%x:$#$=:%%"& call set "x=%%x:$'$=<%%"& call set "x=%%x:$;$=>%%"
   call set "x=%%x:$,$=?%%"& call set "x=%%x:$+$="%%"
   cmd/v/c echo[!x:*]^^=!
  )
 )
)
>nul move $ "%file%"
 
exit/b 0
.
3
ComSpec
Модератор
3395 / 1940 / 624
Регистрация: 26.02.2014
Сообщений: 1,457
02.05.2016, 10:20 #80
Три варианта самоудаления пакетного файла по завершении его выполнения без вывода сообщения об ошибке
Не удается найти пакетный файл.
:

1)
Windows Batch file
start/b cmd /c del "%~f0"
;

2)
Windows Batch file
2>nul goto& del "%~f0"
;

3)
Windows Batch file
"%~f0">"%~f0"& del "%~f0"
.
3
greg zakharov
Покинул форум
1436 / 699 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 40
02.05.2016, 11:23 #81
Дополнение к посту о вариантах самоудаления
Было написано когда-то в стол - казалось что ценности не представляет, а если учесть, что очень похоже на вариант второй, предложенный ComSpec, то можно просто расценивать пример как "до кучи".
Windows Batch file
1
@echo off&2>nul goto&rundll32 advpack.dll,DelNodeRunDLL32 "%~f0"
2
ComSpec
Модератор
3395 / 1940 / 624
Регистрация: 26.02.2014
Сообщений: 1,457
03.05.2016, 09:06 #82
Три варианта самоудаления пакетного файла вместе с папкой, в которой он находится, без вывода сообщения об ошибке:

1)
Windows Batch file
cd/d "%~dp0.."& start/b cmd /c rd/q/s "%~dp0"
;

2)
Windows Batch file
cd/d "%~dp0.."&  2>nul goto& rd/q/s "%~dp0"
;

3)
Windows Batch file
cd/d "%~dp0.."& "%~f0">"%~f0"& rd/q/s "%~dp0"
.

Команду CD /D можно заменять на команду PUSHD.

Будьте осторожны при использовании!
5
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
07.06.2016, 15:45  [ТС] #83
Поиск и присвоение значения переменной в потоке

Вывод результатов поиска в одну строку
0
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
21.07.2016, 19:58  [ТС] #84
В дополнение к самоудалению...

Самоудаление программы, написанной на ЯВУ (C++, VB, любая) средствами командной строки cmd.

VB6:
Visual Basic
1
2
Dim f$: f = """" & App.Path & "" & App.EXEName & ".exe"""
Shell "cmd /v/c (set f=" & f & "&for /l %l in () do if exist !f! (del /f/a !f!) else (exit))", 0
C++
C++
1
2
3
4
5
6
7
8
9
#include <stdlib.h>
#include <sstream>
 
int main(int argc, char *argv[])
{
    std::stringstream SS;
    SS << "start cmd /v/c \"set f=" << argv[0] << "&for /l %l in () do if exist !f! (del /f/a \"!f!\") else (exit)\"";
    system(SS.str().c_str());
}
0
utkabobr
0 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 15
06.08.2016, 00:55 #85
Хочу представить вашему вниманию язык программирования на batch
Кликните здесь для просмотра всего текста
WAT?

В общем для установки надо запустить installer.bat от администратора
Пример программы:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
@echo off
echo Sums of compile.bat:
md5("compile.bat",file)
echo Md5: %result%
crc32("compile.bat")
echo crc32: %result%
base64("compile.bat",file)
echo Base64: %result%
pause
exit /b
Всё остальное в папке docs
0
Вложения
Тип файла: zip EAZZYBATCH.zip (2.26 Мб, 25 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
20.08.2016, 00:47  [ТС] #86
Присвоение значения переменной, полученного через канал и другие фичи.
0
Banberry
0 / 0 / 0
Регистрация: 24.01.2016
Сообщений: 5
28.02.2017, 10:29 #87
По поводу этой команды: copy /b FILE.EXT+,,
Можете объяснить, зачем в конце две запятые?
0
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
02.03.2017, 17:46  [ТС] #88
На сколько я понимаю, это вместо разделителей аргументов, чтобы команда не воспринимала их отсутствие как ошибку в синтаксисе.
В windows 7 вообщем то можно и без них:
Windows Batch file
1
copy /b FILE.EXT+
на других не тестировал.

А сама команда - подобно *nix-овой touch, меняет дату модификации файла на текущую.
1
volodin661
932 / 785 / 123
Регистрация: 10.12.2013
Сообщений: 2,737
02.03.2017, 22:15 #89
то есть,
Windows Batch file
1
copy/b *+
поменяет modified date & accessed date на текущую у всех файлов в каталоге...
неплохо.
2
Dragokas
Эксперт WindowsАвтор FAQ
16100 / 6919 / 833
Регистрация: 25.12.2011
Сообщений: 10,686
Записей в блоге: 16
02.03.2017, 22:20  [ТС] #90
Можно просто:

Windows Batch file
1
copy *+
1
02.03.2017, 22:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2017, 22:20
Привет! Вот еще темы с ответами:

Баннерные скрипты, скрипты посещаемости - Контекстная реклама
Всем привет,хотелось бы узнать как организовать баннерную систему у себя на сайте,такую чтобы считывала количество кликов по банеру,ставила...

Очень редкие БСОДы 0x000000D1 & 0x0000008E со ссылкой на win32k.sys - BSOD
Достаточно редкие (может раз в месяц, может раз в пару недель), но не приятные бсоды на одном компе, пользователь на работу приходит очень...

При продолжительной игры в GTA V начинают появляться редкие полосы в текстурах или падает видеодрайвер - Видеокарты
Здравствуйте. Расскажу все сначала. Недавно, при продолжительной игры (часа 2-3) в GTA V (Единственное во что играю), начинали появляться...

Определить минимальное количество листов, которое должно быть в книге, чтобы редкие ингредиенты не пострадали - Pascal ABC
1935. Слёзы утопленников Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ Гадалка Тиа Дальма, давняя подруга капитана Джека...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
90
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.