Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "Variables and Expressions", в содержании - "Variables and Expressions", v1.0.46.07.

Ники переводчиков: Gourmet, Nikvasko.

Настоящие имена переводчиков: Валентина Гаврикова, Николай Козлов, г.Москва.

Переменные и выражения

Введение в переменные

Примечание переводчика для начинающих программистов. По существу переменной называют участок памяти, хранящий некоторые данные, информацию. Когда этому участку дается название (т.е. имя переменной), то данные, хранящиеся в этом участке, обычно называют "значением переменной". Работать с такими данными можно, обращаясь к ним по именам. Еще говорят, что имя переменной ссылается на хранящиеся в ней данные. С другой стороны, данные могут быть записаны в коде скрипта и непосредственно, просто как последовательность символов. Такую запись мы будем называть "буквальной".

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

Видимость переменных и их декларирование. За исключением локальных переменных в функциях, все переменные имеют глобальную видимость; это значит, что их содержимое может быть прочитано или изменено из любой точки текущего скрипта. Более того, переменные даже не декларируются; чтобы переменная возникла, ей просто надо воспользоваться (причем возникающая переменная изначально пуста).

Имена переменных. Имена переменных регистронезависимы, например, и CurrentDate, и currentdate будут ссылаться на одну и ту же переменную. Длина имени не должна превышать 254 знаков. Имя может составляться из букв, цифр и таких знаков: # _ @ $ ? [ ]

(Примечание переводчика. Наши эксперименты показывают, что в именах переменных и меток можно использовать и буквы кириллицы. Только такие имена становятся чувствительными к регистру. Например, переменные "Цвет" и "цвет" являются разными. Заметим также, что вопреки всем традициям, имя переменной может начинаться с цифр.)

Вообще же, согласно сложившейся практике, имена переменных лучше составлять только из букв, цифр и символа подчеркивания (например: CursorPosition, Total_Items, entry_is_valid). Поддержка вами такого стиля позволит людям, привыкшим к другим языкам программирования, легче понимать ваши программы. С другой стороны, если вы будете придерживаться стиля, который используете в других языках, то, возможно, вам проще станет перечитывать свои собственные скрипты.

Можно составлять имена переменных из одних цифр, но широко это используется только для входных параметров командной строки. Цифровые имена нельзя использовать в выражениях, поскольку там они будут восприниматься не как имена, а как числа.

Поскольку слова AND, OR и NOT являются операторами в выражениях, обычно они не используются как имена. Использование таких имен в выражениях привело бы к неожиданным результатам.

Сохранение значений в переменных. Есть два пути занести строку или число в переменную: традиционный и с использованием выражения.

Традиционный метод с помощью оператора 'равно' (=) сохраняет в переменной, стоящей слева от него, незакавыченную строку литер или значение другой, окруженной знаками процента переменной, или конкатенацию таких строк и переменных.

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

    ; Сохраняем в переменных числа:
МоеЧисло = 123
МоеЧисло := 123
МоеЧисло2 = 123.456
МоеЧисло2 := 123.456
    ; Сохраняем буквальную строку "МоеЧисло":
МояСтрока = МоеЧисло
МояСтрока := "МоеЧисло"
    ; А это уже копирование переменной "МоеЧисло":
МоеЧисло3 := МоеЧисло
МоеЧисло3 = %МоеЧисло%

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

Видимо, вы уже догадались по предыдущему, что есть два способа стереть содержимое переменной (очистить ее):

МояПеременная =     ; Это традиционный метод
МояПеременная := "" ; Это современный метод

Как видите, пустая пара кавычек ставится только после оператора :=. Если пустую пару кавычек поставить после оператора =, то эта пара кавычек окажется внутри переменной.

Чтение содержимого переменных. Как есть два метода записи переменных, так же есть и два способа их чтения: традиционный и выражением. Традиционный предполагает, что переменная, значение которой вызывается, обрамляется знаками процента.

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

    ; Это традиционный метод чтения:
КопияПеременнойМоеЧисло = %МоеЧисло%
КопияПер1 = %Пер1%
MsgBox Значение Пер1 равно %Пер1%.
    ; Это современный метод:
КопияПеременнойМоеЧисло := МоеЧисло
КопияПер1 := Пер1
MsgBox % "Значение Пер1 равно" . Пер1 . "."

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

Рассмотрим три равносильных и правильных примера с командой Sleep, для которой первому параметру разрешено быть выражением:

Sleep СколькоМиллисекундЖдать
Sleep %СколькоМиллисекундЖдать%
Sleep % СколькоМиллисекундЖдать

Сравнение переменных. Со способами сравнения вы можете ознакомиться в следующем разделе (особо обратите внимание на использование скобок).

Выражения

Выражение описывает выполнение операций над переменными и буквально записанными строками и числами.

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

if (Цвет <> "синий")
MsgBox % "Цвет не ""синий""."

В приведенном примере слово "синий" заключено в кавычки, поскольку это буквальная запись цвета. Чтобы буквальные кавычки отображались в буквальной строке, нужно ставить по две кавычки подряд, как сделано в примере со словом: ""синий"".

Внимание!

  1. Условный оператор, содержащий выражение, отличается от несодержащего выражения условного оператора (например, If Цвет <> синий ) тем, что после слова If в операторе с выражением стоит открывающая скобка. Обычно все условное выражение целиком заключается в скобки: if ((x < 0) and (y > 0)). Но оно может выглядеть и так: if (x < 0) and (y > 0).
  2. Скобка после If может отсутствовать вовсе, если сразу после If идет вызов функции или оператор (например, not или ++).

Пустые строки. Чтобы задать в выражении пустую строку, используйте пустую пару кавычек. Например, условный оператор if (MyVar <> "") вернет истину, если у переменной MyVar есть значение. Однако, если условный оператор имеет традиционную форму, пустые кавычки трактуются буквально. К примеру, приведенный далее условный оператор, не содержащий выражений, вернет истину, только если переменная MyVar действительно содержит пару кавычек: if MyVar = "". Таким образом, чтобы с помощью несодержащего выражений условного оператора проверить, есть ли у переменной значение, используйте в правой части оператора символ = или <> и ничего за ним, как в этом примере: if MyVar =

Если выражение недействительно (синтаксически неверно), например, (x +* 3), то оно возвращает пустой результат (пустую строку).

Булевы (условные, логические) выражения. Если выражение используется для проверки истинности условия (как в условных операторах), то пустое или нулевое его значение расценивается как ложь, а любое другой значение - как истина. Например, в утверждении if Счетчик условие Счетчик ложно, если переменная Счетчик пуста или равна 0, и истинно в противном случае. Подобным же образом запись if ! Счетчик дает противоположный результат.

Применение операторов NOT AND OR > = < автоматически дает логическое значение: истина соответствует 1, ложь - 0. Например, в следующем примере, если одно из условий Счетчик > 5 или Найден истинно, переменной Готов присваивается значение 1:

Готов := Счетчик > 5 or Найден

Итак, как показано выше, чтобы переменная хранила значение ложь, нужно оставить ее значение пустым или присвоить ей значение ноль. В практическом плане, чтобы проверить, есть ли значение переменной Готов истина или ложь, можно использовать краткое выражение "if Готов".

Начиная с версии 1.0.25.07 слова true и false являются встроенными переменными, с фиксированными значениями 1 и 0. Их можно использовать для улучшения читаемости скрипта, как в примерах:

CaseSensitive := false
ContinueSearch := true

Сохранение значение выражения. Чтобы присвоить значение выражения переменной, используйте оператор := таким образом:

ПродажнаяЦена := Цена * (1 - Скидка/100)

В приведенном примере в выходную переменную ПродажнаяЦена заносится число с плавающей точкой, количество десятичных разрядов и некоторые другие свойства которого регулируются командой SetFormat. Заметим, что похожая команда AutoTrim, разрешающая усечение оконечных пробелов, проявляет себя только в операциях, возвращающих строку, а не число.

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

Целые числа, как в выражениях, так и вне их, можно записывать и в 10-тичном, и в 16-ричном Форматах. Числа 16-ричном начинаются с префикса 0x. Например, Sleep 0xFF равноценно Sleep 255.

Внедрение выражений. Выражение можно использовать в качестве параметра даже там, где это напрямую не предусмотрено (исключая параметры OutputVar и InputVar команды StringLen). Для этого перед выражением надо вставить знак процента, отделив его от выражения любым пробелом. Эта техника нередко применяется при работе с массивами. Вот пример:

FileAppend, % МойМассив%N%, Мой файл.txt
MsgBox % "Переменная MyVar содержит " MyVar "."
Loop % Итераций + 1
WinSet, Transparent, % X + 100
Control, Choose, % CurrentSelection - 1

Операторы в выражениях

Операторы с равным приоритетом (например, * и / ) исполняются слева направо по порядку, если ниже не оговорено иное. Операторы же с более низким приоритетом (например, +) исполняются позже, чем операторы с высоким приоритетом (например, *). Например, 3 + 2 * 2 рассчитывается как 3 + (2 * 2). Чтобы переопределить порядок исполнения, можно использовать скобки: (3 + 2) * 2


Все операторы (в порядке убывания их приоритета)


%...%

Если переменная внутри выражения обрамлена знаками процента, например, %Var%, ее содержимое трактуется как имя или часть имени другой переменной (при отсутствии такой переменной, %Var% разрешается в пустую строку). Как правило, этот оператор используется для ссылки на элементы массива, например:
Индекс = 33 ; запишем в X удвоенную переменную Массив33
X := Массив%Индекс% * 2
Подобная ссылка не может разрешаться в переменную окружения, буфер обмена или зарезервированную переменную только для чтения. Если это происходит, ссылка трактуется как пустая строка.

++
--

Пре- и пост- инкрементация/декрементация. Добавляет или вычитает единицу (в версиях до 1.0.46 любой из этих операторов мог использоваться только как единственный в строке). Если оператор размещается перед именем переменной, то он исполняется немедленно, а результат используется в следующей операции. Например, Var := ++X увеличивает X, а затем присваивает увеличенное значение переменной Var. Наоборот, если оператор размещается после имени переменной, то переменная сначала используется в следующей операции, а затем ее значение изменяется на единицу. Например, Var := X++ увеличит X только после присвоения текущего значения Х переменной Var.

**

Возведение в степень. Как основание, так и показатель степени могут содержать десятичную точку. Если показатель степени - отрицательный, результатом будет число с плавающей точкой, даже если и основание, и показатель степени являются целыми числами. Отрицательное основание, (в выражении (-2)**2 , например) не поддерживается. Значением такого выражения будет пустая строка. Однако, поскольку оператор ** имеет более высокий приоритет, чем унарный минус, выражение -2**2 возвращает -4.

-
!
~
& *

Унарный минус (-). Хотя унарный минус обозначается тем же символом, что и оператор вычитания, это другой оператор и он применяется только к одиночному элементу или подвыражению: -(3 / -x). Унарные плюсы в выражениях игнорируются.

Логическое НЕ (!). Если операнд пуст или равен 0, результатом применения логического НЕ является 1, что означает "истина". Иначе, результат - 0 (ложь). Например: !x or !(y and z). Примечание: слово NOT является синонимом !. Единственным отличием между ними является более высокий приоритет символа !.

Побитовое NOT (~). Инвертирует каждый бит своего операнда. Если операнд - не целое число, перед вычислением оно округляется до целого. Если значение операнда принадлежит диапазону от 0 до 4294967295 (0xffffffff), оно трактуется как беззнаковое 32-битное значение. Иначе значение операнда трактуется как 64-битное значение со знаком. Например, ~0xf0f возвращает 0xfffff0f0 (4294963440).

Адресация (&) и разадресация (*). [v1.0.36.07+] Выражение &MyVar возвращает адрес содержимого переменной MyVar в памяти. Выражение *MyVar, напротив, предполагает, что идентификатор MyVar ссылается на числовой адрес в памяти и извлекает байт по этому адресу как число диапазона от 0 до 255 (если адрес нулевой, всегда возвращается 0, однако другие недействительные адреса могут привести к сбою в работе скрипта). Эти редко используемые операторы полезны при работе со структурами команды DllCall и при обработке строк, содержащих бинарные нули. Как пример можно посмотреть функцию ExtractInteger().

*
/
//

Умножение (*). Если операндами являются целые числа, результатом будет также целое число. Иначе - число с плавающей точкой.

Обычное деление (/). В отличие от работы команды EnvDiv (/=), результатом истинного деления является число с плавающей точкой, даже если оба входных числа являются целыми числами. Например, в результате деления 3/2 получится 1.5, а не 1.

Целочисленное деление (//). [Начиная с версии 1.0.34] Если параметрами являются два целых числа, оператор осуществляет быстрое целочисленное деление. Например, 5//3 равно 1, а 5//-3 равно -1. Если один из операндов не является целым, выполняется деление с плавающей точкой и результат округляется до ближайшего целого числа в сторону уменьшения. Например, 5//3.0 равно 1.0, а 5//-3.0 равно -2.0. Хотя результатом деления с плавающей точкой является целое число, оно сохраняется в формате с плавающей точкой, чтобы при дальнейшем использовании оно воспринималось именно так. Остаток целочисленного деления определяется функцией mod().

Операторы *= и /= дают возможность коротко описать масштабирование переменной. Например, Var*=2 дает тот же результат, что и Var:=Var*2 (хотя последняя запись лучше). (Примечание переводчика. В оригинале: "(though the former performs better)". Не понятно, чем лучше?)

Деление на 0 дает пустой результат (пустую строку).

+
-

Сложение (+) и вычитание (-). В выражениях пустое значение (как операнд) не принимается за 0. Вместо этого оно считается ошибкой, из-за чего часть выражения возвращается как пустая строка. Например, если X - пуста, значение выражения X+1 будет тоже пустым, а не 1.

Операторы += и -= позволяют кратко записать операции инкрементации и декрементации. Например, Var+=2 дает тот же результат, что Var:=Var+2. Подобно этому, переменную можно менять на 1 с помощью Var++, Var--, ++Var, или --Var.

<<
>>

Поразрядный сдвиг влево (<<) и вправо (>>). Пример использования: A << B. Нецелые входные параметры округляются перед вычислением до целого. Сдвиг влево (<<) эквивалентен умножению А на 2 в степени B. Сдвиг вправо (>>) эквивалентен делению А на 2 в степени B, остаток обрезается.

&
^
 |

Побитовые И (&), исключающее ИЛИ (^), и ИЛИ (|). Операции имеют разный приоритет. Самый высокий приоритет среди них имеет &, а самый низкий - |. Перед вычислениями нецелые параметры округляются до целых.

.

Конкатенация. Оператор "." можно использовать для объединения находящихся рядом строк и переменных (перед точкой и после нее необходимо оставлять пробелы). В большинстве случаев того же результата можно достичь, опустив точку (в этом случае между объединяемыми элементами должен быть хотя бы один пробел).

Пример c выражением: Var := "Цвет выбран" . новЦвет
Пример в традиционной записи: Var = Цвет выбран %новЦвет%
В версиях 1.0.31+, такие подвыражения и ссылки, как Array%i%, можно объединять с другими элементами. Примеры:
Var := "Итоговая цена " . Цена * (1 - Скидка/100)
Var := "Максимальное значение: " . Max(X, Y)
Var :=  i "-й элемент массива: " Array%i%
Когда текст присоединяется к концу переменной, обычный способ конкатенации (=) работает лучше, чем объединение с помощью выражения (:=). Пример быстрого присоединения: Var = %Var%%ПрисоединяемыйТекст%

Можно смыкать также подвыражения. Строка, начинающаяся с точки (или с любого другого оператора), всегда рассматривается как продолжение предшествующей строки. Например:
Var := "Итоговая цена : "
. Цена * (1 - Скидка/100)

>
<
>=
<=

Больше (>), меньше (<), больше или равно (>=), меньше или равно (<=). Если один из параметров не является числом, сравнение производится в алфавитном порядке (в этом контексте буквальная строка в кавычках (Например, "55") всегда трактуется как нечисловая). Сравнение чувствительно к регистру, только если включена функция StringCaseSense.

=
==
<>
!=

Равно (=), точно равно (==) и не равно (<> или !=). Операторы != и <> идентичны. Оператор == подобен оператору =, пока один из операндов не окажется не числом. Тогда оператор == ведет себя как чувствительный к регистру, а оператор = как нечувствительный (степени нечувствительности управляется командой StringCaseSense). В отличие от предыдущих, чувствительность операторов <> и != подчиняется функции StringCaseSense.

Примечание: будучи операндами обсуждаемых операторов буквальные строки в кавычках (например, "55" ) никогда не трактуются как числа.

NOT

Логическое НЕ. За исключением более низкого приоритета, логическое НЕ совпадает с оператором !. Например, выражение Not (x = 3 or y = 3) равносильно выражению !(x = 3 or y = 3)

AND
&&

Оба данных оператора являются логическим И. Пример использования: x > 3 and x < 10. Для увеличения производительности по возможности используется схема быстрой оценки.

Строка, начинающаяся с AND/OR/&&/|| (или с другого оператора), становится продолжением предшествующей строки.

OR
 ||

Оба оператора осуществляют логическое ИЛИ. Например: x <= 3 or x >= 10. По возможности, для ускорения используется быстрая оценка операции.

? :

Тернарный условный оператор [v1.0.46+]. Этот оператор является коротким вариантом конструкции if-else. Термин "тернарный" означает, что оператор связывает ТРИ операнда. Первый операнд рассматривается как булево условное выражение, определяющее какой из двух оставшихся операндов будет выбран для исполнения. Вот пример операции присвоения, в которой присваиваемое значение выбирается тернарным оператором:
var := x > y ? 2 : 3
Здесь, если x больше y, переменной Var присваивается значение 2, если нет - присваивается 3.

Для ускорения при обработке оценивается только исполняемый операнд.

Примечание: из соображений совместимости знак "?" должен быть окружен пробелами (может быть это будет устранено в следующих версиях).

:=
+=
-=
*=
/=
//=
.=
|=
&=
^=
>>=
<<=

Операции присвоения. [До версии 1.0.46, поддерживались с ограничением только первые пять операторов.] Производят операцию над содержимым заданной переменной и сохраняют результат этой операции в той же переменной. Простейшим оператором присвоения является двоеточие-равно (:=). Он сохраняет значение выражение в переменной. Что делают остальные операторы присвоения, можно узнать за соответствующими ссылками в этой графе таблицы. Например, Var //= 2 выполняет деление с округлением, так что Var делится на 2 (результат запоминается опять в Var). Подобным образом, Var .= "abc" добавляет строку abc к концу содержимого переменной Var. Последний пример является короткой записью выражения Var := Var . "abc".

В отличие от большинства других операторов, присвоения осуществляются справа налево. Следовательно, в выражении Var1 := Var2 := 0 сначала переменной Var2 присваивается 0, а затем переменной Var1 присваивается значение переменной Var2 (т.е. тот же ноль).

Если выражение присвоения используется как операнд какого-либо другого оператора, то значением этого выражения является сама переменная, которой производилось присваивание. Например, выражение (Var+=2) > 50 истинно, если только что увеличенное значение Var оказывается больше 50.

Можно также присвоения передавать по ссылке и запрашивать их адреса. Например: &(x:="abc").

Старшинство операторов присвоения автоматически возрастает, когда это позволяет избежать синтаксических ошибок и достичь большей интуитивной понятности. Посмотрите: выражение not x:=y вычисляется как not (x:=y). Аналогично, ++Var := X вычисляется как ++(Var := X); а выражение Z>0 ? X:=2 : Y:=2 вычисляется как Z>0 ? (X:=2) : (Y:=2).

Известные затруднения (возможно они будут преодолены в следующих версиях):
  1. Для обратной совместимости, если /= является самым левым оператором в выражении и не является частью составного выражения, то он выполняет целочисленное деление, если один из операндов не окажется числом с плавающей точкой (во всех прочих случаях /= выполняет обычное деление).
  2. Операции с датами и временем (см. статью "EnvAdd") поддерживаются через += или -=, только если этот оператор будет самым левым в строке.
  3. Операторы +=, -=, и *= обрабатывают пустые значения как нули, только не являясь частью составного выражения (иначе такие операции дают пустые значения).

,

Запятая (,). [v1.0.46+] Несколько выражений можно разместить в одной строке, если разделить их запятыми. Такое составное выражение обрабатывается слева направо. Наиболее часто это используется при выполнении множественных присвоений или вызовов функций в той же самой строке: x:=1 , y+=2 , ++index, func(). Это удобство оплачивается скоростью исполнения. Составное выражение может быть разбито на несколько строк, поскольку строка, начинающаяся с запятой (или с другого оператора), становится продолжением предыдущей строки.

Начиная с версии 1.0.46.01, переменная и знак равенства сразу после запятой обрабатываются как присвоение (:=). Например, все следующие выражения являются присвоениями: x:=1, y=2, a=b=c.

mod()
round()
abs()

Эти и другие встроенные математические функции описаны в статье "Функции".

О скорости исполнения операций. Оператор присвоения (:=) в простых случаях не уступает по скорости традиционному оператору (=):

; Эти операции по эффективности попарно равны:
x := y
x = %y%
x := 5
x = 5
x := "Просто строка"
x = Просто строка

Использование запятой (,) приводит к тому, что простые присвоения оцениваются как выражения, что не является оптимальным решением по скорости. Например, следующая запись станет исполняться по крайней мере на 20% быстрее, если ее выражения распределить по отдельным строкам: Var++, Var-=Var2, Var:=55, Var:="Строка", Var:=Var2. (Разница в эффективности возможно будет преодолена в будущих версиях.)

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

Встроенные переменные

Перечисленные ниже переменные встроены в программу и могут быть использованы в любом скрипте. Все переменные доступны только для чтения (их значения нельзя изменить скриптом), за исключением следующих: Clipboard, ErrorLevel и параметры командной строки.


Сокращенный перечень встроенных переменных

Встроенные переменные: специальные знаки

A_Space Содержит знак пробела. См. описание команды AutoTrim.
A_Tab Содержит знак табуляции. См. описание команды AutoTrim.

Встроенные переменные: свойства скрипта

1, 2, 3 и т.д. Эти переменные автоматически создаются при загрузке скрипта с параметрами командной строки. Их можно изменять, и на них можно ссылаться как на обычные переменные (например: %1%). Переменная %0% содержит количество переданных параметров (0, если параметры переданы не были). Подробности в статье Скрипты.
A_WorkingDir Текущий рабочий каталог скрипта, в котором файлы доступны по умолчанию. Конечный обратный слеш включается только в случае, если это корневой каталог. Два примера: C:\ и C:\Мои документы. Для изменения рабочего каталога используйте функцию SetWorkingDir.
A_ScriptDir Полный путь к каталогу, где находится текущий скрипт. Ради совместимости с AutoIt v2, если скрипт исполняется в файле .aut, то к пути добавляется конечный слеш. Пример для .aut-скрипта: C:\My Documents\
A_ScriptName Имя файла текущего скрипта без указания пути. Например: MyScript.ahk
A_ScriptFullPath Комбинация двух переменных, приведенных выше. Определяет полную спецификацию файла скрипта, например: C:\My Documents\My Script.ahk
A_LineNumber Номер исполняемой строки текущего скрипта (или одного из его #Include-файлов). Этот номер будет соответствовать последней строке, отображаемой ListLines. Переменная может быть полезна для сообщений об ошибках. Например: MsgBox, Ошибка записи в log-файл (строка %A_LineNumber%).

Поскольку скомпилированный скрипт объединяет все #Include-файлы в один большой скрипт, нумерация строк в скомпилированном и в нескомпилированном скриптах может различаться.
A_LineFile Полный путь с именем файла, к которому относится номер строки A_LineNumber. Значение LineFile совпадает с A_ScriptFullPath, если исполняемая строка не принадлежит одному из #Include-файлов нескомпилированного скрипта.
A_AhkVersion [v1.0.22+] Переменная содержит номер той версии AutoHotkey, которая исполняет скрипт (например: 1.0.22). Если скрипт скомпилирован, указывается версия, использовавшаяся для компиляции. Формат, в котором указывается номер версии, позволяет скрипту при помощи операторов > или >= проверять, больше ли переменная A_AhkVersion минимально допустимого номера версии. Например: if A_AhkVersion >= 1.0.25.07.
A_AhkPath
[v1.0.41+]
Для некомпилированных скриптов содержит полный путь с именем того EXE-файла, которым сейчас исполняется скрипт. Например: C:\Program Files\AutoHotkey\AutoHotkey.exe.

Для компилированных скриптов аналогично, но папка AutoHotkey определяется по ключу реестра HKEY_LOCAL_MACHINE\SOFTWARE\AutoHotkey\InstallDir. Если такого ключа нет, A_AhkPath - пуста.
A_IsCompiled
[v1.0.27+]
Содержит 1, если скрипт скомпилирован. В ином случае эта переменная пуста.
A_ExitReason Последняя причина, по который скрипт должен бы завершиться. У переменной есть значение, если скрипт имеет OnExit процедуру и эта процедура в данный момент исполняется или была вызвана попыткой выхода хотя бы раз. Иначе переменная пуста. Подробнее - см. описание команды OnExit.

Встроенные переменные: даты и времена

A_YYYY Текущий год (4 цифры). Например: 2004. Синонимична переменной A_Year. Примечание: чтобы извлечь время или дату в формате, соответствующем языку и локализации, используйте команду FormatTime, OutputVar (время и длинная дата) или FormatTime, OutputVar,, LongDate (возвращает дату в длинном формате).
A_MM Текущий месяц (2 цифры) от 01 до 12. Синоним A_Mon.
A_DD Текущий день месяца (2 цифры) от 01 до 31. Синоним A_MDay.
A_MMMM Полное название текущего месяца на языке пользователя. Например: Июль.
A_MMM Аббревиатура текущего месяца на языке пользователя. Например: Июль.
A_DDDD Полное название текущего дня недели на языке пользователя. Например: Воскресенье.
A_DDD Аббревиатура из трех букв текущего дня недели на языке пользователя. Например: Вск.
A_WDay Текущий день недели (1 цифра) от 1 до 7. Причем, 1 - воскресенье для любого региона.
A_YDay Текущий день года от 1 до 366. Значение возвращается без лидирующих нолей, т.е. 9, а не 009. Чтобы извлечь значение с ведущими нолями, используйте команду: FormatTime, OutputVar, , YDay0.
A_YWeek
[v1.0.24+]
Текущий год и номер текущей недели согласно стандарту ISO 8601 (напр.: 200453). Чтобы отделить год от недели, используйте команды StringLeft, Year, A_YWeek, 4 и StringRight, Week, A_YWeek, 2. Точное определение переменной A_YWeek: если более четырех дней недели, в которую входит 1 января, приходится на новый год, эта неделя считается равной 1. Иначе, это последняя неделя старого года, а первой считается следующая неделя.
A_Hour Текущий час (2 цифры) от 00 до 23. Например: 17 - это 5 часов вечера. Чтобы извлечь время в формате от 1 до 12 с указателями AM/PM, сделайте так, как показано в примере: FormatTime, OutputVar, , h:mm:ss tt.
A_Min Текущая минута (2 цифры) от 00 до 59.
A_Sec Текущая секунда (2 цифры) от 00 до 59.
A_MSec Текущая миллисекунда (3 цифры) от 000 до 999. [v1.0.29+]. Чтобы убрать лидирующие нули: Milliseconds := A_MSec + 0.
A_Now Текущее местное время в формате YYYYMMDDHH24MISS. Примечание: математические операции над датами и временем могут быть выполнены с помощью команд EnvAdd и EnvSub. Кроме того, функция FormatTime может отформатировать дату и/или время в соответствии с форматом, принятом в вашем регионе или с вашими предпочтениями.
A_NowUTC Текущее универсальное глобальное время (UTC) в формате YYYYMMDDHH24MISS. Универсальное глобальное время в сущности тоже самое, что и среднее время по Гринвичу (GMT).
A_TickCount Количество миллисекунд, прошедшее со времени перезагрузки компьютера. Сохранив значение A_TickCount в переменной, можно позднее измерить общее время работы. Для этого необходимо вычесть значение этой переменной из последнего значения A_TickCount. Например:
start_time := A_TickCount
Sleep, 1000
elapsed_time := A_TickCount - start_time
MsgBox, прошло %elapsed_time% миллисекунд.
Переменная A_TickCount округляется до 10 мс. Округление управляется командой QueryPerformanceCounter().

Встроенные переменные: настройки скрипта

A_IsSuspended Содержит 1, если скрипт приостановлен 0 в противном случае.
A_BatchLines (синоним для A_NumBatchLines) Хранит темп исполнения скрипта либо в виде числа исполняемых строк, либо в виде времени работы между паузами по 10 мс. Значение устанавливается командой SetBatchLines. Примеры: 200 или 10ms (в зависимости от формата).
A_TitleMatchMode Хранит значение (1, 2, 3 или RegEx) способа обработки параметров WinTitle, WinText, ExcludeTitle, and ExcludeText. Это значение устанавливает команда SetTitleMatchMode.
A_TitleMatchModeSpeed Хранит скорость обработки (fast или slow), задаваемую командой SetTitleMatchMode.
A_DetectHiddenWindows Хранит режим (On или Off), задаваемый командой DetectHiddenWindows.
A_DetectHiddenText Хранит режим (On или Off), задаваемый командой DetectHiddenText.
A_AutoTrim Хранит режим (On или Off), задаваемый командой AutoTrim.
A_StringCaseSense Хранит режим (On, Off или Locale), задаваемый командой StringCaseSense.
A_FormatInteger Хранит формат целых чисел (H или D), задаваемый командой SetFormat.
A_FormatFloat Хранит формат нецелых чисел, задаваемый командой SetFormat.
A_KeyDelay Хранит задержку обработки нажатий, задаваемую командой SetKeyDelay (всегда в десятичном виде) для традиционного режима SendEvent (но не для команды SendPlay).
A_WinDelay Хранит задержку обработки окон, задаваемую командой SetWinDelay (всегда в десятичном виде).
A_ControlDelay Хранит задержку контролов, задаваемую командой SetControlDelay (всегда в десятичном виде).
A_MouseDelay Хранит задержку обработки событий мыши, задаваемую командой SetMouseDelay (всегда в десятичном виде) для традиционного режима SendEvent (но не для SendPlay).
A_DefaultMouseSpeed Хранит скорость мыши, задаваемую командой SetDefaultMouseSpeed.
A_IconHidden Флаг видимости пиктограммы скрипта в трее (1=видима, 0=нет). Управляется командами #NoTrayIcon или Menu.
A_IconTip Хранит текст всплывающего сообщения для пиктограммы скрипта в трее, задаваемый командой Menu , Tray, Tip, если он задан.
A_IconFile Хранит полный путь и имя файла пиктограммы в трее, задаваемого командой Menu , tray, icon. Иначе - пустая.
A_IconNumber Хранит номер пиктограммы в файле, заданном переменной A_IconFile (обычно 1).

Встроенные переменные: паузы в работе

A_TimeIdle Время в миллисекундах, прошедшее с тех пор, когда система последний раз получила ввод с клавиатуры, мыши или другого устройства. С помощью этой переменной удобно определять, работает ли пользователь. Переменная будет непустой в операционных системах Windows 2000, XP или выше. Переменная реагирует как на физические действия пользователя, так и на виртуальный вводы, сгенерированные любой программой или скриптом (например, командами Send или MouseMove). Любое из этих событий сбрасывает переменную в 0. Поскольку значение переменной увеличивается с шагом 10 мс, не пытайтесь проверять это значение на равенство числу, некратному 10 мс. Вместо этого проверяйте, больше оно или меньше заданного значения. Например, так:
IfGreater, A_TimeIdle, 600000, MsgBox
, Активность проявлялась 10 минут тому назад или более.
A_TimeIdlePhysical Переменная подобна описанной выше A_TimeIdle, но если установлены обработчики прерываний (клавиатуры или мыши, см. статьи "#InstallKeybdHook" и "#InstallMouseHook"), то откликается только на физические нажатия клавиш и клики мыши. В отсутствие обработчиков, переменная TimeIdlePhysical неотличима от переменной A_TimeIdle. Если же установлен только один из обработчиков, то будет игнорироваться виртуальный ввод с соответствующего устройства. Из двух переменных для определения активности пользователя больше подходит именно A_TimeIdlePhysical.

Встроенные переменные: графический интерфейс пользователя (GUI)

A_Gui [v1.0.23+] Номер окна GUI, запустившего текущий поток. Переменная не пуста, если текущий поток запущен элементом управления GUI, элементом меню или событием, подобным GuiClose/GuiEscape.
A_GuiControl [1.0.23+] Содержит имя переменной, ассоциированной с элементом управления GUI, запустившего текущий поток. Если у этого элемента управления нет ассоциированной переменной, то переменная A_GuiControl вместо нее содержит первые 63 символа текста/заголовка управляющего элемента. Это часто используется, чтобы не связывать с каждой кнопкой имя какой-либо переменной. Переменная A_GuiControl остается пустой в следующих случаях:
  1. пуста переменная A_Gui;
  2. текущий поток запущен элементом меню GUI или событием, подобным GuiClose/GuiEscape;
  3. в элементе управления нет ни ассоциированной переменной, ни заголовка;
  4. элемент управления, первоначально запустивший текущий поток, более не существует (возможно, из-за Gui Destroy).
A_GuiWidth
A_GuiHeight
Данные переменные при обращении к ним из подпрограммы GuiSize содержат ширину и высоту окна GUI, инициировавшего подпрограмму. Относятся они к размерам клиентской области, которая включает области заголовка, меню и рамку.
A_GuiX
A_GuiY
Переменные содержат координаты X и Y для событий GuiContextMenu и GuiDropFiles относительно левого верхнего угла окна.
A_GuiControlEvent
[для v1.0.36+ является синонимом A_GuiEvent]
Содержит тип события, запустившего текущий поток. Если поток не был запущен с помощью GUI, переменная остается пустой. Иначе, она содержит одно из следующих значений:
  • Normal: событие запущено одиночным щелчком левой кнопки мыши или физическим нажатием клавиши (клавиши направления, TAB, пробел и так далее). Это значение также генерируется пунктами меню и особыми событиями GuiClose и GuiEscape.
  • DoubleClick: событие запущено двойным щелчком мыши. Заметим, что при первом щелчке будет получено Normal. Другими словами, процедура запустится дважды: после первого щелчка и после второго.
  • RightClick: только для GuiContextMenu, ListViews и TreeViews.
  • Контекстно-зависимые значения: см. GuiContextMenu, GuiDropFiles, Slider, MonthCal, ListView и TreeView.
A_EventInfo
[v1.0.36+]
Содержит дополнительную информацию о следующих событиях:
  • Обновление буфера обмена: OnClipboardChange.
  • Вращение ролика мыши (Mouse wheel hotkeys): WheelDown/Up.
  • События GUI, а именно: GuiContextMenu, GuiDropFiles, ListBox, ListView, TreeView и StatusBar.
Если информации нет, A_EventInfo содержит 0.

Примечание: в отличие от переменных вроде A_ThisHotkey, каждый поток поддерживает свои собственные значения A_Gui, A_GuiControl, A_GuiX/Y, A_GuiControlEvent и A_EventInfo. Таким образом, если один поток прерывается другим, то к его возобновлению он получит собственные правильные значения этих переменных.

Встроенные переменные: Горячие клавиши, строки автозамены, пункты меню

A_ThisMenuItem Содержит имя выбранного пункта меню (пусто, если ничего не выбрано).
A_ThisMenu Содержит имя меню, из которого выбрана переменная A_ThisMenuItem.
A_ThisMenuItemPos Содержит число, указывающее текущую позицию переменной A_ThisMenuItem внутри переменной A_ThisMenu. Первый пункт меню имеет номер 1, второй - 2, и т.д. Разделители меню также получают номер. Эта переменная пуста, если переменная A_ThisMenuItem пуста или не существует внутри A_ThisMenu. Также она будет пустой, если самой переменной A_ThisMenu больше не существует.
A_ThisHotkey Содержит имя (например, #z) последней обработанной горячей клавиши или строки автозамены (если ни то, ни другое не обрабатывалось, то переменная пуста). Когда горячая клавиша впервые описывается - или командой Hotkey , или меткой с двойным двоеточием - использованное имя вместе с описанным порядком модификаторов становится ее постоянным именем.

Значение A_ThisHotkey меняется, когда текущий поток прерывается обработкой другой горячей клавиши. Позаботьтесь поэтому о немедленном копировании этого значения в другую переменную, если вы собираетесь позже использовать его.
A_PriorHotkey Тоже самое, но относится к предыдущей горячей клавише. Изначально переменная пуста.
A_TimeSinceThisHotkey Число миллисекунд, прошедших с тех пор, как была нажата A_ThisHotkey. Имеет значение -1, пока A_ThisHotkey пуста.
A_TimeSincePriorHotkey Число миллисекунд, прошедших с тех пор, как была нажата A_PriorHotkey. Имеет значение -1, пока A_PriorHotkey пуста.
A_EndChar Содержит последний, запускающий символ последней использованной строки "непростой" автозамены (non-auto-replace hotstring). Если запускающий символ не использовался (в силу опции *), переменная A_EndChar остается пустой.

Встроенные переменные: сведения об операционной системе и пользователе

ComSpec
[v1.0.43.08+]
Переменная повторяет содержимое системной переменной ComSpec, (например, "C:\Windows\system32\cmd.exe"). Часто используется с командами Run/RunWait. Примечание: у этой переменной нет префикса "A_".
A_Temp
[v1.0.43.09+]
Полный путь с именем папки, назначенной для хранения временных файлов (например, C:\DOCUME~1\UserName\LOCALS~1\Temp). Он запрашивается (в порядке доступности) в следующих местах: 1) в системных переменных TMP, TEMP или USERPROFILE; 2) в папке Windows. Для Windows9x, если не существует ни папки TMP, ни папки TEMP, возвращается содержимое переменной A_WorkingDir.
A_OSType Тип работающей операционной системы. Получает значения: WIN32_WINDOWS (для Win95/98/ME) или WIN32_NT (для Windows NT4/2000/XP/2003/Vista).
A_OSVersion Содержит одну из следующих строк: WIN_VISTA [v1.0.44.13+], WIN_2003, WIN_XP, WIN_2000, WIN_NT4, WIN_95, WIN_98, WIN_ME. Пример использования:
if A_OSVersion in WIN_NT4,WIN_95,WIN_98,WIN_ME
    ; Вокруг запятых не должно быть пробелов.
{
MsgBox Этот скрипт требует Win2k/XP или старше.
ExitApp
}
A_Language Код языка операционной системы по умолчанию. Выбирается из следующей таблицы: 4-digit codes. [1.0.24+] (см. ссылку в оригинале статьи).
A_ComputerName Сетевое имя компьютера [1.0.24+].
A_UserName Имя текущего пользователя, под которым он вошел в систему [1.0.24+].
A_WinDir Полный путь и название папки Windows. Например: C:\Windows [1.0.23+].
A_ProgramFiles
или ProgramFiles
Полный путь и название папки Program Files. Например: C:\Program Files [1.0.23+]. В версиях 1.0.43.08+ переменную можно называть ProgramFiles (без префикса "A_"), что облегчает переход к #NoEnv.
A_AppData Полный путь и название папки, содержащей данные приложений для текущего пользователя. Например, C:\Documents and Settings\Username\Application Data. [v1.0.43.09+]
A_AppDataCommon Полный путь и название папки, содержащей данные приложений для всех пользователей. [v1.0.43.09+]
A_Desktop Полный путь и название папки, содержащей файлы рабочего стола текущего пользователя.
A_DesktopCommon Полный путь и название папки, содержащей файлы рабочего стола для всех пользователей.
A_StartMenu Полный путь и название папки, содержащей данные для меню Пуск для текущего пользователя.
A_StartMenuCommon Полный путь и название папки, содержащей данные для меню Пуск для всех пользователей.
A_Programs Полный путь и название папки, содержащей данные для меню Программы для текущего пользователя.
A_ProgramsCommon Полный путь и название папки, содержащей данные для меню Программы для всех пользователей.
A_Startup Полный путь и название папки Автозагрузка из меню Пуск для текущего пользователя.
A_StartupCommon Полный путь и название папки Автозагрузка из меню Пуск для всех пользователей.
A_MyDocuments Полный путь и название папки "Мои документы" для текущего пользователя. В отличие от большинства других переменных, если папка находится в корне диска, то конечный слеш отсутствует, например, содержимое будет M:, а не M:\
A_IsAdmin Если текущий пользователь имеет права администратора операционной системы, переменная будет содержать 1, а иначе 0. В Windows 95/98/Me переменная всегда содержит 1.
A_ScreenWidth
A_ScreenHeight
Длина и ширина основного монитора в пикселях (напр. 1024 и 768).

При определении размеров других мониторов в мульти-мониторной системе, используйте команду SysGet.

Чтобы узнать длину и ширину рабочего стола (даже виртуального, занимающего несколько мониторов), воспользуйтесь следующим способом (однако, в Windows 95/NT обе переменные из примера получат 0):
SysGet, VirtualWidth, 78
SysGet, VirtualHeight, 79
Кроме того, команду SysGet можно использовать для нахождения рабочей области стола, которая может быть меньше, чем полный стол, часть которого занимают панель задач и другие зарегистрированные панели.
A_IPAddress1
A_IPAddress2
A_IPAddress3
A_IPAddress4
IP-адреса первых четырех сетевых адаптеров в компьютере.

Встроенные переменные: курсоры, буфер, ошибки

A_Cursor Тип курсора мыши, отображаемого в данный момент. Принимает значения: AppStarting, Arrow, Cross, Help, IBeam, Icon, No, Size, SizeAll, SizeNESW, SizeNS, SizeNWSE, SizeWE, UpArrow, Wait, Unknown. Сокращенные названия курсоров изменения размеров соответствуют первым буквам названий сторон света, напр. NESW = NorthEast+SouthWest (северо-восток + юго-запад). Курсоры в форме руки (указывающей и раскрытой) имеют тип Unknown.

Существует проблема [для версий до 1.0.42.02 или для Windows 95]: при неоднократном считывании данной переменной на высокой скорости (т.е. каждые 500 мс или чаще) возможно будут искажаться двойные щелчки мышью. Как этого избежать, пока неизвестно.
A_CaretX
A_CaretY
Текущие координаты X и Y точки вставки текста. Координаты даются относительно активного окна, если не использовалась команда CoordMode, относящая их ко всему экрану. Если активного окна не существует или позиция точки вставки не может быть определена, переменные остаются пустыми.

Приведенный ниже скрипт перемещает точку ввода, показывая текущую позицию во всплывающей подсказке. Обратите внимание, что в некоторых окнах (напр. в отдельных версиях MS Word) показываются одни и те же координаты независимо от смены позиции.
#Persistent
SetTimer, ПоказатьКоординату , 100
return
ПоказатьКоординату:
ToolTip, X=%A_CaretX% Y=%A_CaretY%, A_CaretX, A_CaretY - 20
return
При неоднократном считывании содержимого данной переменной на высокой скорости (т.е. каждые 500 мсек. или быстрее), возможность делать двойные щелчки мышью может быть нарушена. На данный момент не существует способов обойти эту проблему.
Clipboard Текстовое без форматирования содержимое буфера обмена операционной системы, доступное для чтения и записи. См. статью "Clipboard, ClipboardAll, и OnClipboardChange".
ClipboardAll [1.0.29+] Полное содержимое буфера обмена (форматированный текст, изображения). См. статью "Clipboard, ClipboardAll, и OnClipboardChange".
ErrorLevel См. статью "ErrorLevel".
A_LastError Результат, возвращаемый системной функцией GetLastError(). Подробности см. в статьях "DllCall()" и "Run/RunWait".

Встроенные переменные: циклы

A_Index Номер текущей итерации текущего цикла. При первом исполнении тела цикла переменная содержит число 1. Подробнее см. статью "Loop (normal)".
A_LoopFileName и т.д. Эта и подобные ей переменные действуют только в пределах файлового цикла. Подробнее см. статью "Loop (files & folders)".
A_LoopRegName и т.д. Эта и подобные ей переменные действуют только в пределах цикла по реестру. Подробнее см. статью "Loop (registry)".
A_LoopReadLine См. статью "Loop (read file contents)".
A_LoopField См. статью "Loop (parse a string)".

Переменные среды операционной системы

Операционной системой поддерживаются переменные среды. Список таких переменных можно увидеть, если в командной строке набрать SET и нажать Enter.

Скрипт может создать новую переменную среды или изменить содержание существующей с помощью команды EnvSet. Однако, подобные добавления и изменения остальная часть системы не видит. Исключением является запуск командами Run или RunWait программы (или другого скрипта): такая программа наследует дубликат переменных среды родительского скрипта, включая и приватные переменные.

Начиная с версии 1.0.43.08 рекомендуется, чтобы скрипты получали значения переменных среды (например, Path), следующим образом:

EnvGet, OutputVar, Path ; Объяснения можно увидеть в статье "#NoEnv".

Ограничения для переменных

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.