Я мне часто требуется быстро получить результаты математических выражений. В прошлом, для вычисления результата я использовал пакет Windows Calculator или на средство работы с электронными таблицами, но для этого мне часто приходилось прерывать работу с командной строкой. Я подумал, что калькулятор для командной строки будет полезен, и поэтому написал сценарий Eval.js, который создает калькулятор в командной строке и выводит результаты в десятичной, 16-тиричной и двоичной системах исчисления. В Листинге 1 приведен отрывок этого сценария.
Структура Eval.js
В начале сценарий Eval.js объявляет используемый им набор переменных. Далее он проверяет свойство length множества WScript.Arguments, которое возвращает количество элементов во множестве. Если аргументы командной строки отсутствуют, или первый аргумент - «/?», сценарий выводит на экран короткое стандартное сообщение и заканчивает работу.
Далее сценарий «извлекает» выражение из командной строки. Для этого он создает объект Enumerator, который отвечает за проведение итерации множества WScript.Arguments. В среде JScript, вы должны использовать объект Enumerator для итерации членов множества.
После этого сценарий Eval.js использует выражение «for» для извлечения каждого элемента множества и построения строки в переменной «expr». Строка содержит все аргументы командной строки, разделенные «пробелами». Сценарий использует оператор «условий» «(?:)» для построения строки. Как показано во фрагменте А Листинга 1, если строка в переменной «expr» не пустая, сценарий добавляет к ней «пробел» и следующий аргумент, если пустая - добавляет первый аргумент. После этого сценарий создает строку вывода, содержащую выражение и две новые строки.
Все что осталось сделать сценарию - попытаться вычислить выражение с помощью функции «eval()». Так как переменная «expr» может не содержать корректное выражение языка JScript, функция «eval()» вложена в структуру «try...catch...finally», как показано во фрагменте B. При возникновении ошибки сценарий выводит выражение и сообщение об ошибке, после чего завершает работу с кодом ошибки отличным от нуля. Если ошибок не возникает, сценарий использует метод toString для вывода выражения и результатов выражения в десятичной, 16-тиричной и двоичной формах.
Возможности применения
Для запуска Eval.js используйте выражение командой строки
Eval.js Expression
Где Expression - выражение, которое необходимо вычислить. Вы можете использовать любой корректный вычислительный или поразрядный оператор языка JScript. Например, вы можете использовать оператор «(+)» для сложения чисел или оператор «(/)» для деления чисел. Список операторов языка Jscript приведен на странице http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/js56jsconoperators.asp.
Однако выражение не обязано содержать оператор. Вы можете просто указать десятичное число для просмотра его 16-тиричного и двоичного эквивалентов. Вы можете даже указать 16-тиричное значение для просмотра его десятичного и двоичного эквивалентов. Однако перед 16-тиричной записью числа должен быть указан префикс «0x» или «0X» (например, «0x41»). Имейте в виду, что если в префиксе 16-тиричного числа используется только 0, среда JScript будет вычислять его как восьмеричное число (число, записанное в 8-ричной системе исчисления). Также помните, что вы не можете указать двоичное число для просмотра его десятичного и 16-ричного эквивалентов, так как это не предусмотрено в языке JScript.
При использовании Eval.js необходимо следить за следующими символами, зарезервированными средой:
( ) < > ^ & |
Если выражение содержит любой из этих символов, вы должны заключить его в кавычки (или, что более неудобно, выделить каждый зарезервированный знак символами «^»). Например, выражение «(2 + 3) * 6» должно быть заключено в кавычки, так как содержит символы «(» и «)». Кавычки не считаются частью выражения. Они не дают приложению cmd.exe интерпретировать специальные символы.
Полезное дополнение
Сценарий Eval.js стал для меня необходимым средством при работе с командной строкой. Он также подходит для более специализированных целей, таких как просмотр результатов операций поразрядного сдвига. Мне кажется, он станет полезным дополнением к вашему набору сценариев.
Листинг 1. Отрывок сценария Eval.js
args = new Enumerator(WScript.Arguments); // BEGIN COMMENT // Перебор множества «WScript.Arguments» для построения строки, содержащей // все аргументы командной строки, разделенные «пробелами». // END COMMENT // BEGIN CALLOUT A for (; ! args.atEnd(); args.moveNext()) { arg = args.item(); expr = expr != "" ? expr += " " + arg : arg; } // END CALLOUT A output = expr + " "; // BEGIN CALLOUT B try { result = eval(expr); } catch(err) { WScript.Echo(output + "Unable to evaluate that expression."); WScript.Quit(1); } // END CALLOUT B WScript.Echo(output + "Dec: " + result.toString() + " " + "Hex: " + result.toString(16).toUpperCase() + " " + "Bin: " + result.toString(2));