Выражения
В выражениях могут использоваться арифметические операции, операция конкатенации «&» строк и логические операции.
Могут использоваться операторы сравнения: =, <>, >, <, >=, <=.
Также разрешены скобки и операторы AND, OR и NOT. Разрешены ключевые слова True/False, которые эквивалентны 1/0 соответственно.
Могут использоваться внутренние переменные Autorun и существующие переменные окружения.
Могут использоваться внутренние команды Autorun и пользовательские функции. Если команда не возвращает значение, то в выражении ее «результатом» будет пустая строка.
Приоритет выполнения операций в порядке понижения:
NOT * / + - & < > <= >= = <> AND OR
Пример:
Percent = i * (count / 100) InRange = i > 1 and i < 10
Арифметические операции
При сложении, вычитании, умножении и делении, если оба выражения числовые (либо обе строки приводятся к числам), выполняются операции над числами.
В случае если одно или оба значения являются строкой, которая не приводится к числу, значение такой строки рассматривается как 0.
MsgBox(1 + 5) # --> 6 MsgBox("1" + "5") # --> 6 MsgBox("" + 5) # --> 5 MsgBox("abc" + "cde") # --> 0
Конкатенация
Данная операция возвращает строку, содержащую объединённые строчные представления значений.
MsgBox(1 & 5) # --> "15" MsgBox("1" & 5) # --> "15" MsgBox("" & 5) # --> "5" MsgBox("abc" & "cde") # --> "abccde"
Сравнение значений
При сравнении, если оба выражения числовые (либо обе строки приводятся к числам), используется числовое сравнение.
В случае если производится сравнение числа со строкой, то оно выполняется по следующей схеме:
- если одна из строк приводится к числу, а вторая пустая, то её значение рассматривается как 0;
- если одна из строк приводится к числу, а вторая непустая, то результат сравнения будет равен 0 (False);
- если ни одна из строк не приводится к числу, выполняется строчное сравнение.
Для строчного сравнения разрешены только = и <>, сравнение при этом регистронезависимое. Для регистрозависимого и лексиграфического сравнения строк используйте функцию StrCompare.
Примеры:
a = 5 MsgBox(a = 5) # --> 1 MsgBox(a = "5") # --> 1 MsgBox("" = False) # --> 1 MsgBox("abc" = "cde") # --> 0 MsgBox("abc" = 1.5) # --> 0
Логические операции
При использовании логических операторов AND, OR и NOT правила следующие:
- значения 1 и 0 рассматриваются как True и False;
- если строка приводится к числу, то 0 рассматривается как False, а ненулевое значение — как True;
- если строка не приводится к числу, то пустая строка рассматривается как False, а непустая — как True.
Примеры:
a = 5 MsgBox(1 and 2) # --> 1 MsgBox(1 and 0) # --> 0 MsgBox(1 and "") # --> 0 MsgBox(1 and "c") # --> 1 MsgBox("" or True) # --> 1 MsgBox("abc" and "cde") # --> 1 MsgBox(not 1) # --> 0
Выражения в командной записи
Для использования выражений в параметрах при командной записи необходимо, чтобы параметр был в кавычках и непосредственно перед ними стоял знак «%». В этом случае текст будет трактоваться как вычисляемое выражение. Например:
Set Delay 500 Sleep %"1000 + %Delay%" # результат вычисления — 1500.
Внутри кавычек для текстовых констант, как и везде, можно использовать кавычки другого типа:
StrLen var %'"Строка_" & 1' # var => 8
При использовании директивы LegacyExpressions в выражениях могут использоваться текстовые константы, не обёрнутые в кавычки, но этот вариант оставлен только для начальной совместимости. Настоятельно рекомендуется переписать код и использовать кавычки повсеместно. Это значительно уменьшит число возможных ошибок.
Данный синтаксис используется только в параметрах команд, записанных в командной записи.
Использование команд и функций в выражениях
В выражениях возможно использование любых команд Autorun, но смысл имеет использование тех, которые возвращают результат.
Для использования в выражении команды в качестве функции она должна быть записана с использованием скобок и запятой в качестве разделителя параметров. Первый параметр (имя переменной для возвращаемого значения) в этом случае не используется. Некоторые команды адаптированы для использования в качестве функции (например: StrPos, StrReplace) и не требуют передачи переключателей. Для остальных команд переключатели при их использовании нужно передавать в первом параметре в кавычках через пробел, при этом текст параметра должен начинаться с символа «~». В общем виде запись выглядит так:
CommandName(["~/S1 /S2 .. /SN",] Param1, Param2, .. , ParamN)
Пример функциональной записи:
zz = "AbXCdEfxQWERXTY" MsgBox(StrPos(zz, 'x', 1, 1, 1), "Case-sens") # => 8
Пример командной записи:
Set zz "AbXCdEfxQWERXTY" MsgBox %"StrPos('~/S', %zz%, 'x')" "Case-sens" # => 8
В выражениях можно использовать вложенные команды:
zz = " abcdefgh" MsgBox(StrLeft(StrTrim(%zz%), 3) & '-' & StrPos(%zz%, 'd') & _ '-' & (StrPos('123456789', '5')), "Expr") # => abc-6-5
Если внутренние переменные или переменные окружения разворачиваются в параметрах команд (смотрите описания команд), то можно записывать переменную вместе с остальным текстом внутри кавычек. В остальных случаях нужно использовать конкатенацию переменной с текстом:
# переменные окружения разворачиваются в параметре команды FileExist("%COMMANDER_PATH%\NoClose.exe") # переменные окружения в параметре команды не разворачиваются StrLen(%COMMANDER_PATH% & "\NoClose.exe")