Перейти на главную страничку сайта (список статей, файлы для скачивания)
Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.
Оригинал статьи в AutoHotkey.chm: "Variables and Expressions", в содержании - "Variables and Expressions", v1.0.46.07.
Ники переводчиков: Gourmet, Nikvasko.
Настоящие имена переводчиков: Валентина Гаврикова, Николай Козлов, г.Москва.
Примечание переводчика для начинающих программистов. По существу переменной называют участок памяти, хранящий некоторые данные, информацию. Когда этому участку дается название (т.е. имя переменной), то данные, хранящиеся в этом участке, обычно называют "значением переменной". Работать с такими данными можно, обращаясь к ним по именам. Еще говорят, что имя переменной ссылается на хранящиеся в ней данные. С другой стороны, данные могут быть записаны в коде скрипта и непосредственно, просто как последовательность символов. Такую запись мы будем называть "буквальной".
Типы переменных. В AutoHotkey переменные по типам не различаются. Хранятся все переменные в виде символьных строк. Однако, когда этого требует операция (математическая или сравнения), состоящая только из цифр (и, может быть, десятичной точки) переменная автоматически преобразуются в число. А результат операции обратно преобразуется в строку для сохранении в переменной.
Видимость переменных и их декларирование. За исключением локальных переменных в функциях, все переменные имеют глобальную видимость; это значит, что их содержимое может быть прочитано или изменено из любой точки текущего скрипта. Более того, переменные даже не декларируются; чтобы переменная возникла, ей просто надо воспользоваться (причем возникающая переменная изначально пуста).
Имена переменных. Имена переменных регистронезависимы, например, и CurrentDate, и currentdate будут ссылаться на одну и ту же переменную. Длина имени не должна превышать 253 знака. Имя может составляться из букв, цифр и таких знаков: _ # @ $
(Примечание переводчика. Наши эксперименты показывают, что в именах переменных и меток можно использовать и буквы кириллицы. Только такие имена становятся чувствительными к регистру. Например, переменные "Цвет" и "цвет" являются разными. Заметим также, что вопреки всем традициям, имя переменной может начинаться с цифр.)
Вообще же, согласно сложившейся практике, имена переменных лучше составлять только из букв, цифр и символа подчеркивания (например: CursorPosition, Total_Items, entry_is_valid). Поддержка вами такого стиля позволит людям, привыкшим к другим языкам программирования, легче понимать ваши программы. С другой стороны, если вы будете придерживаться стиля, который используете в других языках, то, возможно, вам проще станет перечитывать свои собственные скрипты.
Можно составлять имена переменных из одних цифр, но широко это используется только для входных параметров командной строки. Цифровые имена нельзя использовать в выражениях, поскольку там они будут восприниматься не как имена, а как числа.
Поскольку слова AND, OR и NOT являются операторами в выражениях, обычно они не используются как имена. Использование таких имен в выражениях привело бы к неожиданным результатам.
Сохранение значений в переменных. Есть два пути занести строку или число в переменную: устаревший и с использованием выражения.
Устаревший метод с помощью оператора 'равно' (=) сохраняет в переменной, стоящей слева от него, незакавыченную строку литер или значение другой, окруженной знаками процента переменной, или конкатенацию таких строк и переменных.
В противоположность устаревшему методу, присвоение выражением осуществляется с помощью оператора 'двоеточие-равно' (:=). Этот оператор сохраняет в переменной, стоящей слева от него, значение выражения, стоящего справа от него. Такое выражение может быть просто числом, просто закавыченной строкой, именем переменной или сложным выражением, включающим в себя знаки операций. В следующих примерах сравниваются оба метода присвоения:
; Сохраняем в переменных числа: MyNumber = 123 MyNumber := 123 MyNumber2 = 123.456 MyNumber2 := 123.456 ; Сохраняем буквальную строку "MyNumber": MyString = MyNumber MyString := "MyNumber" ; А это уже копирование переменной "MyNumber": MyNumber3 = %MyNumber% MyNumber3 := MyNumber
Многие предпочитают второй метод в силу его большей прозрачности, и потому что его синтаксис выражений подобен синтаксису значительного числа других языков.
Видимо, вы уже догадались по предыдущему, что есть два способа стереть содержимое переменной (очистить ее):
MyVar = ; Это устаревший метод MyVar := "" ; Это современный метод
Как видите, пустая пара кавычек ставится только после оператора :=. Если пустую пару кавычек поставить после оператора =, то эта пара кавычек окажется внутри переменной.
Чтение содержимого переменных. Как есть два метода записи переменных, так же есть и два способа их чтения: устаревший и выражением. Устаревший предполагает, что переменная, значение которой вызывается, обрамляется знаками процента.
При чтении выражением знаки процента вокруг имени переменной отсутствуют, но зато буквальное содержание строки заключается в кавычки. На примерах чтение переменных выглядит так:
; Это устаревший метод чтения: CopyOfMyNumber = %MyNumber% MsgBox Значение CopyOfMyNumber равно %CopyOfMyNumber%. ; Это современный метод: CopyOfMyNumber := MyNumber MsgBox % "Значение CopyOfMyNumber равно " . CopyOfMyNumber . "."
При современном методе, чтобы отличить его от традиционного, в строку MsgBox вставлен знак процента с пробелом. Это - необходимость, поскольку по умолчанию большинство команд подразумевают устаревший метод. Однако, некоторые параметры некоторых команд задокументированы как выражения: в этих случаях знак процента можно не ставить (а можно и ставить).
Рассмотрим три равносильных и правильных примера с командой Sleep, для которой первому параметру разрешено быть выражением:
Sleep HowManyMillisecondsToWait Sleep %HowManyMillisecondsToWait% Sleep % HowManyMillisecondsToWait
Сравнение переменных. Со способами сравнения вы можете ознакомиться в следующем разделе (особо обратите внимание на использование скобок).
Выражение описывает выполнение операций над переменными и буквально записанными строками и числами.
В выражениях имена переменных не обрамляются знаками процента. Исключением являются массивы и другие структуры с двойной отсылкой. В результате, чтобы в выражениях различать переменные и буквальные строки, последние необходимо заключать в двойные кавычки. Например:
if (Color <> "blue") MsgBox % "Цвет не ""синий""."
В приведенном примере слово "blue" заключено в кавычки, поскольку это буквальная запись цвета. Чтобы буквальные кавычки отображались в буквальной строке, нужно ставить по две кавычки подряд, как сделано в примере со словом: ""синий"".
Внимание!
Пустые строки. Чтобы задать в выражении пустую строку, используйте пустую пару кавычек. Например, условный оператор if (MyVar <> "") вернет истину, если у переменной MyVar есть значение. Однако, если условный оператор имеет традиционную форму, пустые кавычки трактуются буквально. К примеру, приведенный далее условный оператор, не содержащий выражений, вернет истину, только если переменная MyVar действительно содержит пару кавычек: if MyVar = "". Таким образом, чтобы с помощью несодержащего выражений условного оператора проверить, есть ли у переменной значение, используйте в правой части оператора символ = или <> и ничего за ним, как в этом примере: if MyVar =
Если выражение недействительно (синтаксически неверно), например, (x +* 3), то оно возвращает пустой результат (пустую строку).
Булевы (условные, логические) выражения. Если выражение используется для проверки истинности условия (как в условных операторах), то пустое или нулевое его значение расценивается как ложь, а любое другой значение - как истина. Например, в утверждении if Counter условие Counter ложно, если переменная Counter пуста или равна 0, и истинно в противном случае. Подобным же образом запись if ! Counter дает противоположный результат.
Применение операторов NOT AND OR > = < автоматически дает логическое значение: истина соответствует 1, ложь - 0. Например, в следующем примере, если одно из условий Counter > 5 или Found истинно, переменной Ready присваивается значение 1:
Ready := Counter > 5 or Found
Итак, как показано выше, чтобы переменная хранила значение ложь, нужно оставить ее значение пустым или присвоить ей значение ноль. В практическом плане, чтобы проверить, есть ли значение переменной Ready истина или ложь, можно использовать краткое выражение "if Ready".
Начиная с версии 1.0.25.07 слова true и false являются встроенными переменными, с фиксированными значениями 1 и 0. Их можно использовать для улучшения читаемости скрипта, как в примерах:
CaseSensitive := false ContinueSearch := true
Сохранение значение выражения. Чтобы присвоить значение выражения переменной, используйте оператор := таким образом:
SellingPrice := Price * (1 - Discount/100)
В приведенном примере в выходную переменную SellingPrice заносится число с плавающей точкой, количество десятичных разрядов и некоторые другие свойства которого регулируются командой SetFormat. Заметим, что похожая команда AutoTrim, разрешающая усечение оконечных пробелов, проявляет себя только в операциях, возвращающих строку, а не число.
Числа целые и с плавающей точкой. Если у буквальных чисел есть десятичная точка, то внутри выражения они рассматриваются как числа с плавающей точкой. В противном случае они являются целыми числами. В большинстве операций, таких, как сложение и умножение, если какой-нибудь входной параметр является числом с плавающей точкой, результатом вычисления будет также число с плавающей точкой.
Целые числа, как в выражениях, так и вне их, можно записывать и в 10-тичном, и в 16-ричном Форматах. Числа 16-ричном начинаются с префикса 0x. Например, Sleep 0xFF равноценно Sleep 255.
Внедрение выражений. Выражение можно использовать в качестве параметра даже там, где это напрямую не предусмотрено (исключая параметры OutputVar и InputVar команды StringLen). Для этого перед выражением надо вставить знак процента, отделив его от выражения любым пробелом. Эта техника нередко применяется при работе с массивами. Вот пример:
FileAppend, % MyArray%N%, MyFile.txt MsgBox % "Переменная MyVar содержит " MyVar "." Loop % Iterations + 1 WinSet, Transparent, % X + 100 Control, Choose, % CurrentSelection - 1
Операторы с равным приоритетом (например, * и / ) исполняются слева направо по порядку, если ниже не оговорено иное. Операторы же с более низким приоритетом (например, +) исполняются позже, чем операторы с высоким приоритетом (например, *). Например, 3 + 2 * 2 рассчитывается как 3 + (2 * 2). Чтобы переопределить порядок исполнения, можно использовать скобки: (3 + 2) * 2
Все операторы (в порядке убывания их приоритета)
%...% |
Если переменная внутри выражения обрамлена знаками процента, например, %Var%, ее содержимое трактуется как имя или часть имени другой переменной (при отсутствии такой переменной, %Var% разрешается в пустую строку). Как правило, этот оператор используется для ссылки на элементы массива, например:
Index := 33 ; запишем в X удвоенную переменную Array33 X := Array%Index% * 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 := "Итоговая цена " . Price * (1 - Discount/100) Var := "Максимальное значение: " . Max(X, Y) Var := i "-й элемент массива: " Array%i%Когда текст присоединяется к концу переменной, обычный способ конкатенации (=) работает лучше, чем объединение с помощью выражения (:=). Пример быстрого присоединения: Var = %Var%%ПрисоединяемыйТекст% Можно смыкать также подвыражения. Строка, начинающаяся с точки (или с любого другого оператора), всегда рассматривается как продолжение предшествующей строки. Например: Var := "Итоговая цена : " . Price * (1 - Discount/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). Известные затруднения (возможно они будут преодолены в следующих версиях):
|
, |
Запятая (,). [v1.0.46+] Несколько выражений можно разместить в одной строке, если разделить их запятыми. Такое составное выражение обрабатывается слева направо. Наиболее часто это используется при выполнении множественных присвоений или вызовов функций в той же самой строке: x:=1 , y+=2 , ++index, func(). Это удобство оплачивается скоростью исполнения. Составное выражение может быть разбито на несколько строк, поскольку строка, начинающаяся с запятой (или с другого оператора), становится продолжением предыдущей строки. Начиная с версии 1.0.46.01, переменная и знак равенства сразу после запятой обрабатываются как присвоение (:=). Например, все следующие выражения являются присвоениями: x:=1, y=2, a=b=c. |
mod() |
Эти и другие встроенные математические функции описаны в статье "Функции". |
О скорости исполнения операций. Оператор присвоения (:=) в простых случаях не уступает по скорости традиционному оператору (=):
; Эти операции по эффективности попарно равны: 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. |
A_Gui | [v1.0.23+] Номер окна GUI, запустившего текущий поток. Переменная не пуста, если текущий поток запущен элементом управления GUI, элементом меню или событием, подобным GuiClose/GuiEscape. |
A_GuiControl | [1.0.23+] Содержит имя переменной, ассоциированной с элементом управления GUI, запустившего текущий поток. Если у этого элемента управления нет ассоциированной переменной, то переменная A_GuiControl вместо нее содержит первые 63 символа текста/заголовка управляющего элемента. Это часто используется, чтобы не связывать с каждой кнопкой имя какой-либо переменной. Переменная A_GuiControl остается пустой в следующих случаях:
|
A_GuiWidth A_GuiHeight |
Данные переменные при обращении к ним из подпрограммы GuiSize содержат ширину и высоту окна GUI, инициировавшего подпрограмму. Относятся они к размерам клиентской области, которая включает области заголовка, меню и рамку. |
A_GuiX A_GuiY |
Переменные содержат координаты X и Y для событий GuiContextMenu и GuiDropFiles относительно левого верхнего угла окна. |
A_GuiControlEvent [для v1.0.36+ является синонимом A_GuiEvent] |
Содержит тип события, запустившего текущий поток. Если поток не был запущен с помощью GUI, переменная остается пустой. Иначе, она содержит одно из следующих значений:
|
A_EventInfo [v1.0.36+] |
Содержит дополнительную информацию о следующих событиях:
|
Примечание: в отличие от переменных вроде 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 При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.