Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Dragokas
Эксперт WindowsАвтор FAQ
16925 / 7010 / 851
Регистрация: 25.12.2011
Сообщений: 10,808
Записей в блоге: 16
#1

Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора* - CMD/BAT

10.01.2013, 15:41. Просмотров 60476. Ответов 106

Эта тема - ответвление http://www.cyberforum.ru/cmd-bat/thread672170.html

Постим сюда детали, которые Вы получили опытным путем.
Которые считаете уникальными, или могут быть полезными при наборе кода BAT файлов, лучшего понимания принципов работы среды командной строки.
Пишем ошибки, которые иногда допускаете, а потом ломаете голову, почему не работает

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

Собрано по категориям:

Файловые операции
5) Использование рабочего каталога Bat файла в роле начального для выполнения команд в нем на ОС >= Vista ссылка
8) Как проверить - существует ли папка ссылка
10) Не использовать && после команды Del. ссылка
12) После перехода в другой каталог проверять успех операции ссылка
18) Листинг текущего каталога или корневого ссылка
24) Работа с файлами/папками, в именах которых есть буквы украинского алфавита. ссылка

Символы
1) Экранирование спецсимвола ссылка
13) Сохранение концевого пробела в переменную ссылка
17) Запятая и точка с запятой - разделители аргументов ссылка
30) Экранирование номера потока в перенаправлении вывода Echo ссылка

Переменные
2) Использование одноименных переменных без обнуления ссылка
3) Пренебрежение Setlocal ссылка
3.1) Не указав Setlocal EnableDelayedExpansion, используем знаки восклицания (!) для раскрытия значения переменных ссылка
6) Инициализация числового типа данных ссылка
14) Обход ошибки "Режим вывода команд на экран (ECHO) включен" ссылка
16) Пробелы тоже могут являться частью названия переменной ссылка
23) Для команды SET всегда заключайте в кавычки переменную и значение, если ним является изменяемое имя файла ссылка
28) Двойное раскрытие переменной. Первыми раскрываются проценты. ссылка
29) Конструкция вида Echo.!Var:~0,1! не работает. ссылка

Циклы
7) EOL в цикле FOR - правильный порядок модификаторов ссылка
9) Использовать UseBackQ при чтении содержимого файла, имя которого может меняться ссылка
25) Получение даты и времени файла через цикл и команду For без ключа /S (рекурсия) и подпрограммы ссылка

Кодировка
4) Сохранение BAT-файла с кодировкой перевода строк в UNIX-стандарте ссылка
26) Кодировка в консоли ссылка
27) Текстовой файл не читается циклом по неизвестной причине ссылка

Тесты, оптимизация и граничные возможности интерпретатора
15) Граничные значения для числового типа в CMD ссылка
19) Максимальная глубина рекурсии = 593*. ссылка
20) Максимальная длина значения строки ссылка
21) Оптимизация кода ссылка
22) Тест замедления работы операторов при перегрузке оперативной памяти ссылка

Другое
1) Указывая метку подпрограммы, можно через пробел указывать ее описание. Среда не будет "ругаться" ссылка
11) Внимательно выбирайте имя для BAT(CMD)-файла ссылка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 15:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора* (CMD/BAT):

Ошибки при запуске bat-файлов
У меня проблема, что при запуске cmd.exe, что при запуске любого *.bat-файла,...

Последовательный запуск нескольких BAT-файлов из основного BAT-файла
Доброго времени суток всем... Помогите кто понимает.. Есть bat... @echo off...

Запуск bat-файлов с параметрами, являющимися модификациями принятого запускающим bat-файлом параметра
Написать командный файл, который: • принимает в качестве параметра полное имя...

Как определить количество цветов в подгружаемом рисунке и наиболее частые цвета
Заранее благодарен...

Ошибки при создании заметки
Пару дней назад установил Друпал на Xampp, частенько на разных страницах пришет...

Частые ошибки
Есть проблема и уверен что системная, а не программная. Проблема в том что во...

106
SilverVox
1 / 1 / 0
Регистрация: 05.09.2017
Сообщений: 3
20.09.2017, 21:56 #101
Цитата Сообщение от Dragokas Посмотреть сообщение
это не баг, а последовательность синтаксического разбора.
Да, помнится читал об этой-же последовательности в справке по CMD вроде, есть где-то описанно, даже с примерами.
Тем не менее наступал на эти грабли несколько раз за последние 10-ть лет


Добавлено через 2 часа 47 минут
Еще вспомнил одну особенность команды RD.
С тех пор, как перешел на Windows7 (лет пять тому) обнаружил, что RmDir не возвращает код ошибки. (На Windows XP не помню, чтобы сталкивался с этим).
Мне сложно понять почему это происходит и как это объяснить с "научной" точки зрения, но покажу на практическом примере.
Кстати такое поведение наблюдалось не только в RmDir, но не помню точно с какими командами еще.

В данном случае с заведомо неверным параметром, код ошибки будет все-ровно 0.
Windows Batch file
1
2
3
RD NUL
ECHO.!ERRORLEVEL!
ECHO.%ERRORLEVEL%
А так команда вернет код ошибки, если включено отложенное расширение переменных среды
Windows Batch file
1
RD NUL  ||ECHO.!ERRORLEVEL!
Но если нужно относительно ERRORLEVEL реализовать условие, такое решение работает, даже если отложенное расширение переменных среды не включено.
Windows Batch file
1
2
RD NUL ||REM
IF "%ERRORLEVEL%"=="87" ECHO.Failed
Такое ощущение, как будто бы команда выполняется в какой-то отдельной среде.
Но я неуверен, как это правильно можно объяснить.
1
parmari
1 / 1 / 0
Регистрация: 15.04.2017
Сообщений: 25
30.11.2017, 13:47 #102
Кусок кода с поиском числа строк и последней строки (с последующем обрезанием ненужного):

Bash
1
2
3
4
5
6
7
8
set /a NUM=1
     for /f delims^=^ eol^= %%m in ('more +1^< "%%o"') do (
        set /a NUM=!NUM!+1
        echo.!NUM! %%m>i.tmp
     for /f "tokens=1,2* delims= " %%a in (i.tmp) do (
     @echo.%%a %%b>i.tmp
    )
    )
Если в файле 65535 строк и меньше - медленно, но работает, если больше - виснет напрочь.

P.S. Данные с датчика, где первая строка - время в мсек с момента запуска системы.
Как обойти проблему, кроме подключения дополнительного фильтра по размеру файла с учетом минимально возможной (или средней) длины строки - не знаю.
0
Dragokas
Эксперт WindowsАвтор FAQ
16925 / 7010 / 851
Регистрация: 25.12.2011
Сообщений: 10,808
Записей в блоге: 16
30.11.2017, 13:50  [ТС] #103
parmari, вы перепутали тему.
Здесь выкладывают только аналитическую информацию и без вопросов.
0
parmari
1 / 1 / 0
Регистрация: 15.04.2017
Сообщений: 25
30.11.2017, 14:07 #104
Число строк 65535 - вполне аналитическая информация. полученная опытным путем. Это 2^16-1, так называемое число Мерсенна. Остальное и правда - лишние подробности.
0
Dragokas
Эксперт WindowsАвтор FAQ
16925 / 7010 / 851
Регистрация: 25.12.2011
Сообщений: 10,808
Записей в блоге: 16
01.12.2017, 00:13  [ТС] #105
parmari, просто не понятно, зачем вы сюда это выложили и как относится к багам интерпретатора.
Под аналитической информацией подразумевается развёрнутый ответ, что вот так и при таком количестве будет виснуть -> следовательно нужно делать вот так и так, или вообще не использовать CMD.
Вы констатируете проблему и хотите получить помощь в её решении? Тогда создайте новую тему, и там вам предложат более быстрые варианты.
А магическое число здесь никак не является решающим фактором. Ваш код трудно назвать оптимизированным.
0
parmari
1 / 1 / 0
Регистрация: 15.04.2017
Сообщений: 25
01.12.2017, 13:44 #106
Ладно, в сухом остатке...

На файлах, размер строк которых >65535, при построчной обработке циклом, батник виснет так, словно уходит в бесконечный цикл. Ждать окончания работы - бессмысленно (за ночь ничего не произошло), в то время как файлы меньшего размера (хотя бы на 1 строку!) обрабатывались тем же способом в пределах несколько минут.
Видимо, эта проблема связана с особенностью использования оперативной памяти bat -файлом, поэтому так делать не надо.

Относится ли этот факт к данной теме или нет - на усмотрение модератора - но для меня он был бы в свое время полезен сам по себе.
0
Dragokas
Эксперт WindowsАвтор FAQ
16925 / 7010 / 851
Регистрация: 25.12.2011
Сообщений: 10,808
Записей в блоге: 16
01.12.2017, 15:24  [ТС] #107
В том и дело, что батник не оптимизирован. При таком кол-ве строк, итерации создавать не имеет смысла.
Всё делается проще. find /c /v "" узнаётся кол-во строк. Find /n - добавление номера строки и передача в findstr для получения нужной строки. Затем всего 1 итерация, чтобы отбросить лишнюю часть с номером строки.
В теме с полезными примерами решенных задач подобное есть по ссылкам.
1
01.12.2017, 15:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2017, 15:24
Привет! Вот еще темы с решениями:

Частые ошибки winapi
Подскажите, что я делаю не так. Программа запускается без ошибок, но кнопку,...

Частые ошибки в работе компьютера
Доброго времени суток. Перейду сразу к делу: После включения компьютера никакая...

Частые BSOD и разные ошибки
Здравствуйте, помогите с проблемой: уже на протяжении где-то 2 месяцев...

Частые системные ошибки windows 8
Что то уж слишком часто начали появляться системные ошибки, почти все разные,...


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

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

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