Арифметическая обработка данных в bat файлах.

Для выполнения арифметических операций в командном процессоре существует команда SET с параметром /A.
Допустимые операции соответствуют простенькому калькулятору. Никакой тригонометрии, логарифмов, корней и прочих математических причуд. Для этого есть другие языки программирования.
Но и при использовании команды SET для простых арифметических действий вас могут ждать ряд неожиданностей. Причем, в некоторых случаях не создается исключительных случаев, программа продолжает работать, приводя разработчиков в ...эээ... замешательство. Рассмотрим наиболее часто встречающиеся ошибки.

Кавычки.

Еще раз напомним, что если строка заключена в кавычки, то они являются частью строковой переменной. И, поскольку они не являются цифрами, перед арифметической обработкой их желательно удалять. Особенно в свете того, что команды

set /a s="017"+1 echo %s%


и
set /a s='017'+1 echo %s%


приведут вас к совершенно разному результату.

Системы счисления.

Если вы решили проверить работу двух предыдущих примеров, то, возможно, результаты вас удивили.
Дело в том, что символьные строки, содержащие числа и начинающиеся с нуля в команде SET с параметром /A считаются восьмеричными.

set /a s=017+1 echo %s%


Результат будет 16, а не 18!
А команды

set /a s=08 set /a z=09


и вовсе приведут к ошибке, так как в восьмеричной системе счисления нет цифр 8 и 9.
Такие ситуации могут случаться в первую очередь при обработке даты, времени, когда извлекается часть строки, содержащая, например, часы, а затем с этими данными выполняются математические операции
И, естественно, при отладке это не обязательно проявится.
В разделе Работа с датой, временем. Примеры bat / cmd файлов так же обращено внимание на эту проблему.

Как избежать описанных ошибок.

Кавычки.

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

set str=%str:~1,-1%


Следует отметить, что приведенный выше пример удаляет из строки первый и последний символ (если их там столько есть).
Независимо от того, какие они.

Системы счисления

Тут немного сложнее.
Очевидное решение - проверять является ли ведущий символ нулем и, если так, удалять его.
Если мы имеем дело с двухзначными данными ( а чаще всего это именно так - обработка даты, времени ), то такой подход возможно уместен. В противном случае процесс итеративный. Отличительная черта такого подхода - универсальность.
В то же время достаточно часто известно, что обрабатываемая строка содержит фиксированное количество знаков, например, 3 символа. В таком случае можно воспользоваться следующим приемом:

set /a s="1%dd% % 1000"


В приведенном примере к трехзначному числу слева приписывается 1. (Хотя для этого примера это с таким же успехом может быть другая цифра, кроме нуля) Теперь для обработчика число начинается с 1 и, следовательно, является десятичным.
А теперь от этой искусственной добавки необходимо избавиться. В данном примере берется остаток от деления на 1000. А можно эту добавку и просто отнять

set /a s=1%dd% - 1000


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

set /a s=1%dd% - 100


Ну и для наглядности, если переменная dd была равна, скажем, 09, то после подстановки пример будет выглядеть так:

set /a s=109 - 100


Таким образом можно безопасно и правильно получить цифровое значение, записанное в символьном виде.


Зачастую после арифметической обработки данных возникает обратная задача - сформировать строку определенной длины, содержащую требуемое число с необходимым количеством ведущих нулей.
Это более понятно на простом жизненном примере.
Рассмотрим следующую реальную задачу: в папке хранятся архивы, часть имени которых ( 4 знака ) являются порядковым номером архива. Необходимо сформировать имя следующего по порядку архива.
Здесь мы рассмотрим часть кода, где к максимальному номеру (в символьном виде) прибавляется единица и из него формируется строка из 4 символов с необходимым количеством ведущих нулей.

set /A DIG=1%SDIG% +1 set SNR=%DIG:~-4%


Для вычисления следующего номера мы используем тот же прием - приписываем слева единицу. Далее из символьного представления увеличенного числа извлекаем 4 правых знака.
Ведущие нули там уже присутствуют в необходимом количестве.
Для большей наглядности рассмотрим это на примере. Если переменная SDIG имела значение, например, 0008, то после подстановки пример будет выглядеть так:

set /A DIG=10008 +1 set SNR=%10009:~-4%


Т. е. переменная SNR получит значение 0009.
Следует отметить, что при таком подходе чисто теоретически, после 9999 последует 0000. И, если постановка задачи предусматривает иные действия при достижении максимально возможного значения, ситуацию необходимо контролировать.

После этого вы еще продолжаете читать? И не дали себе слово даже не притрагиваться к bat файлам?
Снимаю шляпу...))

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

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).






  TopList Rambler Top100 my counter Valid XHTML 1.0 Strict Valid CSS Rambler Top100

Фитотерапия Молитвы Водолечение Юмор Форум Кладовка link О авторе

Фитотерапия Молитвы Водолечение Юмор Форум Кладовка Ссылки О авторе Отправить сообщение Карта сайта Поиск по сайту Главная страница

Copyright © 1999 - 2017  Бронислав Краснер