스크립트
AutoHotkey의 스크립트는, 이하와 같은 요소로 구성된다.
커멘드
FileAppend,This is test file.,test.txt
Run,notepad.exe test.txt
AutoHotkey의 스크립트는, 원칙으로서1행에 하나의 커멘드를 기술한다.
1행의 문자수는16,383아르바이트 이내라고 하는 제한이 있다.
커멘드는, 커멘드명과 인수를 콤마로 단락지어 기술한다.
커멘드명의 직후는, 공백 문자로 단락지으면, 콤마를 생략 해도 괜찮다.(제1인수에 공백을 지정하는 경우를 제외하다)
인수에 문자열을 지정하는 경우에서도, 「"」등에서 괄충분해는 하지 않고, 그대로 기술한다.
인수의 선두와 말미의 공백 문자는 무시되지만, 「%A_Space%」(와)과 같이 짜넣어 변수의 참조로서 기술하면 무시되지 않게 된다.
또,AutoTorim(을)를Off(으)로 하는 것도, 전후의 공백이 무시되지 않게 할 수 있다.
커멘드에는, 단지 그 자리에서 실행되어 다음의 행으로 옮기는 것 뿐만이 아니고, 조건에 의해서 다음에 실행되는 행이 바뀐다If계 커멘드나, 일련의 커멘드를 반복해 실행한다Loop커멘드, 스크립트의 다른 장소에 점프 한다GoTo커멘드,GoSub커멘드 등도 있다.
사용할 수 있는 커멘드에 대해서는,레퍼런스(을)를 참조.
복수행에 건너는 식·커멘드
if(value=1
or value=2){
MsgBox,value is 1 or 2
}
최초의 비공백 문자가 「++」 및 「--」이외의 연산자의 경우, 전의 행의 계속으로 간주해진다.
긴 식을 분할하는 것으로, 스크립트의 가독성을 향상 당한다.
Gui,Add,Text
,w100 h100 xp+0 yp+24 vTextLabel
,DUMMYMESSAGE
「,」도 연결에 사용할 수 있기 위해, 커멘드의 인수를 복수행으로 분할할 수도 있다.
MsgBox,1
+2
커멘드의 인수에서는, 「+」등의 연산자는 문자열의 일부로 간주해지지만, 행의 연결에는 유효하기 때문에, 상기예에서는 「1+2」라고 하는 문자열이 표시된다.
val:=var1
;comment
+var2 ;comment
/* comment
*/ +var3
공행, 공백 문자만의 행, 코멘트등이 늦지 않아도 연결할 수 있다.
히아드큐먼트
MsgBox,this
(
is
long
) message
「(」만의 행이 있으면, 그 다음의 행으로부터 다음의 「)」(으)로 시작되는 행의 것까지가 개행(`n)단락으로 연결되어 직전의 행의 계속으로서 추가된다.
상기예에서는, 이하와 같이 표시된다.
this is
long message
도중에 「)」(으)로 시작되는 행을 포함하고 싶은 경우는, 「`)」(와)과 같이 이스케이프 한다
연결 후의 행의 총문자수는16,383아르바이트까지이다.
「(」의 후에는, 이하의 옵션을 공백 문자 단락으로 열거할 수 있다.
- Join[Str]
-
각 행의 사이에 삽입하는 문자열을 개행(「`n」)이외로 변경한다.단지 「Join」라고 지정하면, 단락 문자 없음으로 연결된다.
Str에는15아르바이트까지의 문자열을 지정할 수 있다.이Str부분에서만, 「`s」(이)가 반각 스페이스로 간주해진다.(례:「Join<br`s/>」)
- LTrim
-
각 행의 줄머리의 반각 스페이스나Tab문자를 무시한다
- RTrim0
-
줄 끝의 말미의 반각 스페이스나Tab문자를 무시하지 않게 한다
- C
-
「;」에 의한 행 코멘트, 줄 끝 코멘트를 유효하게 한다
- %
-
「%」(을)를 자동적으로 「`%」에 이스케이프 한다(변수 전개등이 행해지지 않게 된다)
- `
-
「`」(을)를 자동적으로 「``」에 이스케이프 한다(「`n」등이 그대로 문자열의 일부로서 다루어진다)
- ,
-
콤마(「,」)하지만 자동적으로 「`,」로서 이스케이프 되는 것을 억제한다(커멘드의 인수의 단락등으로 해서 다루어지게 된다)
블록
If a=1
{
FileAppend,This is test file.,test.txt
Run,notepad.exe test.txt
}
「{」라고 하는 내용의 행이 있으면, 「}」라고 하는 내용의 행이 나타날 때까지가 하나의 블록이 된다.If계 커멘드에 의한 조건 분기나Loop에 의한 반복 처리로, 복수의 커멘드를 연속해 실행시키는 경우에 사용한다.
줄머리의Tab에 의한 인덴트는 있어도 없어도 좋지만, 인덴트 해 두면 가독성이 향상한다.
자세한 예 등은블록의 설명을 참조.
프리프로세서 지령
커멘드와는 별도로 「#」(으)로 시작되는 프리프로세서 지령과 같은 것이 있다.
이것은, 스크립트가 실행되기 전의 해석의 단계에서 처리되므로, 인수에 변수의 참조를 포함하는 것은 원칙으로서 할 수 없다.
통상은, 블록등의 안쪽에서 사용하는 것은 할 수 없다.
각종 지령에 대해서도,레퍼런스(을)를 참조.
라벨
Label1:
MsgBox,Label1
Goto,Label1
라벨명에 이어 「:」(이)가 기술되었을 뿐의 행이 있으면, 라벨로 해서 인식된다.
GoTo커멘드나GoSub커멘드를 사용하는 것으로, 특정의 라벨의 직후의 행에 처리를 점프 시킬 수 있다.
GoSub커멘드로 점프 했을 경우는,Return커멘드를 실행하는 것으로써GoSub하지만 실행된 다음의 행으로 돌아올 수 있다.
OnClipboardChange등 특정의 명칭의 라벨이 존재하면, 대응하는 이벤트가 발생했을 때에AutoHotkey에 의해서 자동적으로 실행된다.
또,OnExit커멘드등과 같이 이벤트에 대해 라벨을 할당하는 커멘드도 있다.
hot key 라벨
#F1::
Run,notepad
Run,iexplore
return
키명에 이어 「::」(이)가 기술된 행은 hot key 라벨이 되어, 그 키가 밀렸을 때에 그 자리소에 기술된 커멘드가 실행되게 된다.
또, 보통 라벨과 같이GoTo등에서 점프 하는 것도 가능하다.
자세한 것은hot key의 항을 참조.
또, 이용할 수 있는 키명에 대해서는키 리스트의 항을 참조.
#F1::Run,notepad
hot key에 할당하는 써브루틴은,1행 뿐이라면 라벨과 같은 행에 기술해도 좋다.
키리맵 정의
q::d
키명과 「::」에 이어 다른 키명만을 기술하면, 어느 키의 동작을 다른 키의 동작으로 바꾸어 버리는 리맵을 실시할 수 있다.
이것은 라벨은 아니기 때문에,GoTo등에 의하는 점프는 할 수 없다.
자세한 것은리맵의 항을 참조.
핫 스트링 라벨
::ahk::AutoHotkey
hot key 외에, 특정의 문자열이 타입 되었을 때에 자동적의 다른 문자열에 다시 타이프 치거나 써브루틴을 실행시키거나 하는 「핫 스트링」이라고 하는 기능이 존재한다.
자세한 것은Hotstring의 항을 참조.
유저 정의 함수
add(a,b,c=0,d=0){
return a+b+c+d
}
MsgBox,% add(1,2,3)
인수를 받아 일련의 동작을 실행해, 돌아가 값을 돌려주는 함수를 정의할 수 있다.
함수는 식 중(안)에서 사용하거나 단독으로 호출하거나 해 사용한다.
자세한 것은함수의 항을 참조.
;this is comment
MsgBox,this is message ;this is comment
/*
this
is
comment
*/
줄머리에 「;」(세미콜론)(이)가 있는 행은 코멘트행이 되어, 무시된다.
또, 커멘드의 후에 반각 스페이스를 비우고 세미콜론이 있으면, 그 이후도 코멘트가 된다.
「/*」(으)로 시작되는 행과 「*/」라고 하는 내용의 행의 사이도 코멘트가 된다.
커멘드의 인수로서 사용되는 데이터는, 모두 문자열로서 보관 유지된다.
일정한 서식에 합치하는 문자열의 경우, 정수·소수·일자 시각으로서 계산등에서 사용할 수 있다.
「100」(이)나 「0xFFFF」(와)과 같은 것이 정수치, 「10.05」(이)나 「6.023e+23」(와)과 같은 것이 소수치, 「20061231235959」(와)과 같은 것이일자 시각(으)로서 다루어진다.
변수의 내용이 이러한 형식일지를 판정하려면 ,If var is [not] type(을)를 사용한다.
각 커멘드가 정수나 소수를 출력할 때는,SetFormat커멘드로 설정한 서식에 따라서 출력된다.
정수는 부호 첨부64비트 상당한 범위의 값을 취급할 수 있다.
소수는double상당한의 것이 취급할 수 있다.
a=this is string
MsgBox,%a%
b=10
b*=10
MsgBox,%b%
c=0.1
c*=4
MsgBox,%c%
d=20060101
EnvAdd,d,2,Days
MsgBox,%d%
Var = 123abc ;변수 「Var」에 「123abc」라고 하는 값을 대입
MsgBox,Var is %Var% ;「Var is 123abc」라고 표시된다
이름이 붙은 「변수」에 데이터를 격납해 둘 수 있다.
변수명에는 알파벳, 숫자, 「_」등의 문자를 사용할 수 있다.
「Var=this is value」(와)과 같이 쓰는 것으로, 변수에 값을 격납할 수 있다.
변수에 격납한 값은, 「%Var%」(와)과 같이 커멘드의 인수중에 묻는 것으로, 내용을 전개해 사용할 수 있다.
같은 값을 복수의 장소에서 사용하고 싶을 때 등, 여러가지 목적으로 사용된다.
FileRead,Var,test.txt ;test.txt의 내용이 읽혀 변수 「Var」에 격납된다
또, 커멘드에 따라서는, 처리의 결과등을 변수에 격납하는 일이 있다.
많은 경우, 인수로서 격납처의 변수의 변수명을 지정할 수 있다.
VarName=FileContent
FileRead,%VarName%,test.txt ;격납처 변수는 「FileContent」
MsgBox,%FileContent% ;읽어들인 내용이 표시된다
격납처의 변수명을 지정하는 인수에서도, 「%Var%」(와)과 같은 변수 전개를 사용할 수 있다.
이 테크닉은, 불특정 다수의 데이터를 취급할 때 등에 도움이 되는 일이 있다.
EnvSet,TestEnv,this is a test env
Run,%ComSpec% /K set TestEnv cmd.exe하지만 기동해,TestEnv에 격납된 내용을 표시한다
변수와는 별도로, 환경 변수도 취급할 수 있다.EnvSet커멘드로 환경 변수에 대입을 실시할 수 있다.
이 환경 변수는,Run커멘드등에서 기동한 프로그램내로부터 참조할 수 있다.
「%Var%」(와)과 같은 변수의 전개에서는, 통상의 변수와 같이 환경 변수도 전개할 수 있지만, 미정도리의 변수는 길이0의 문자열에 전개된다.
「#NoEnv」지령을 사용하는 것으로, 환경 변수의 참조를 무효화해, 처리 효율을 높일 수 있다.
이 경우에서도, 「EnvGet」커멘드를 사용하면, 환경 변수의 값을 읽어들이는 것은 가능하다.
미리 준비된 편입 변수로 불리는 변수도 있다.
사용할 수 있는 편입 변수에 대해서는,편입 변수의 항을 참조.
많은 편입 변수는 대입에 의해 직접 변경하는 것은 할 수 없다.
잘 사용되는 편입 변수로서 커멘드의 실행 결과를 격납한다ErrorLevel변수가 있다.
변수에 값을 격납하면, 값의 용량보다 약간 좀 많은 메모리가 확보된다.
이것은, 내용의 변경으로 용량이 많아졌을 때, 하나 하나 메모리를 다시 확보할 필요가 없게 하기 위한(해)이다.
「var=」라고 하도록(듯이), 하늘의 값을 할당하는 것으로, 할당할 수 있었던 메모리를 개방할 수 있다.
하나의 변수의 용량의 상한은64KB까지되고 있지만,#MaxMem지령으로 변경할 수 있다.
변수가 수치의 경우,EnvAdd, EnvSub, EnvMult, EnvDiv커멘드로 사칙 연산을 실시할 수 있다.
이것들 커멘드의 생략형으로서 「+=」,「-=」,「*=」,「/=」(이)가 사용할 수 있다.
좌변에는 변수명이 오지만, 우변에는 값이 오지 않으면 안 되기 때문에, 「%」(으)로 사이에 두어 변수의 내용을 전개하도록(듯이) 할 필요가 있다.
posX = 0
posX += %speedX%
이러한 커멘드에서는, 제1인수와 제2인수의 어느쪽이나가 정수라면 결과는 정수에, 어느 쪽인지 한편에라도 소수 형식의 값이 포함되어 있으면 결과는 소수가 된다.
정수로 제산을 실시해 결과를 소수로 얻고 싶은 경우, 다음과 같이 소수 형식의 값으로 나누어 줄 필요가 있다.
var=10
var/=3.0
또,0(을)를 더하는 등의 결과가 변하지 않는 계산을 실시하는 것으로, 형식의 변환만을 실시할 수 있다.
SetFormat,FLOAT,0.0 ;소수의 소수점 이하를 잘라 버리도록(듯이) 한다
var+=0 ;var의 내용이 정수 형식에 변환된다
var+=0.0 ;var의 내용을 소수 형식에 변환
「:=」에 의한 대입이나 「If()」에 의한 조건 분기등에서는, 복잡한 식을 사용할 수도 있다.
1회의 사칙 연산 뿐이라면 「v:=v+1」보다 「v+=1」(분)편이 고속으로 실행되지만,2회이상의 연산은 복수의 커멘드로 나누는 것보다 하나의 식으로 하는 것이 고속으로 실행될 가능성이 있다.
「StringTrimLeft」 등, 「String」(으)로부터 시작되는 커멘드에서는, 문자열의 시작이나 분할등의 문자열 처리를 실시할 수 있다.
문자열을 차례로 줄서 바꾸는 「Sort」커멘드 등도 있다.
또,Transform커멘드의 서브 커멘드 「Deref」에서는, 「value is %var%」(와)과 같은 문자열의 변수 참조를 전개시킬 수 있다.
템플릿 파일에 항목을 묻거나 하는데 이용할 수 있다.
If커멘드로 조건 분기를 실시할 수 있다.
비교 조건은,if var = value
그렇다고 하는 형태로 기술할 수 있다.
비교 연산자는, 「=」, 「<>」(not equal), 「>」 「<」 「>=」 「<=」(이)가 사용할 수 있다.
좌변에는 변수명이 오지만, 우변에는 값이 오지 않으면 안 되기 때문에, 「%」(으)로 사이에 두어 변수의 내용을 전개하도록(듯이) 할 필요가 있다.
If MyVar > %Max%
MsgBox,over
else
MsgBox,not over
그 외에도, 몇개의 조건문을 사용할 수 있다.
- If/IfEqual/IfNotEqual/IfLess/IfLessOrEqual/IfGreater/IfGreaterOrEqual
- 변수의 비교(「=」 「<>」 「>」 「<」 「>=」 「<=」와 같다)
- if(식)
- 식의 결과의 값에 의해서 분기
- IfExist / IfNotExist
- 파일의 존재의 유무
- IfInString / IfNotInString
- 문자열중으로 지정의 문자열이 포함될지
- If var [not] in values / If var [not] contains values
- var의 내용이values에 열거한 문자열과 일치할지
- If var is [not] type
- 변수의 데이터 형식
- IfMsgBox
- 제일 최근의MsgBox커멘드로 밀린 버튼
- IfWinActive
- 지정한 윈도우가 액티브할지
- IfWinExist
- 지정한 윈도우가 존재할지
Loop문장으로 반복 처리를 사용할 수 있다.
반복 회수나, 대상 데이터는편입 변수(으)로서 취득할 수 있다.
복수행의 처리를 반복할 때는,Continue커멘드로 나머지의 처리를 스킵 해 다음의 회의 실행으로 옮길 수 있다.
또,Break커멘드에서는 반복을 즉석에서 종료할 수 있다.
많은 프로그램 언어에 존재한다while구문이나for구문에 해당하는 것은 없기 때문에,If커멘드나Break커멘드를 사용해 자기 부담으로 기술할 필요가 있다.
반복에는, 이하의 종류가 있다.
- Loop
- 지정 회수의 반복
- LoopFile
- 와일드 카드 등에 매치하는 파일이나 폴더 각각 대하는 처리
- LoopReg
- 레지스트리의 지정 키 이하의 키에 대한 처리
- LoopReadFile
- 파일을1행씩 읽으면서 처리
- LoopParse
- 문자열의1문자마다, 혹은 지정의 단락 기호로 단락지어진 필드 마다 처리
Goto커멘드를 실행하면, 지정한 라벨의 행에 점프 하고, 그 다음의 행으로부터를 실행시킬 수 있다.
또,Return커멘드로 점프 원래대로 돌아갈 수 있다Gosub커멘드도 있다.
Goto문장을 너무 다용하면 프로그램을 알 수 있기 힘들어지므로, 가능한 한 사용하지 않는 것이 좋다.
함수(을)를 사용하면, 호출해 먼저 인수를 건네주거나 돌아가 값을 되돌리거나 다른 장소의 변수와 격리된 로컬 변수를 사용하거나 할 수 있다.
이하의 커멘드로 라벨을 지정해 두면, 특정의 이벤트가 발생했을 때에 그 써브루틴이 불려 가게 된다.
이러한 써브루틴 호출에서는,스렛드의 세치기를 한다.
- SetTimer
- 타이머에 정기적으로 실행되는 써브루틴을 지정
- Menu
- 커스텀 메뉴를 작성해, 선택되었을 때에 실행되는 써브루틴을 지정
- GUI
- GUI(을)를 작성해, 버튼이 밀렸을 때 등에 실행되는 써브루틴을 지정
- OnExit
- 스크립트가 종료할 경우에 실행되는 써브루틴을 지정
- Hotkey
- 지정된 hot key가 밀렸을 때에 실행되는 써브루틴을 지정
- 핫 스트링
- 특정의 문자열을 타이프 쳤을 때에 써브루틴이 실행되도록(듯이) 설정
커멘드의 인수 중(안)에서 특별한 의미가 있는 기호를 포함한 문자열을 취급하고 싶은 경우는, 기호의 전에 이스케이프 문자를 붙여 이스케이프 할 필요가 있다.
많은 프로그램 언어에서는 「\」(이)가 이스케이프 문자로서 사용되고 있지만,AutoHotkey그럼 파일 패스의 「\」의 이스케이프의 필요를 없애기 위해 「`」(Shift+@)하지만 사용된다.
이하와 같은 escape sequence가 있다.
그 이외의 문자를 이스케이프 했을 경우, 그 문자 자신이 된다.(례:「`x」→「x」)
#EscapeChar지령그리고 이스케이프 문자를 변경할 수 있다.
escape sequence 일람
기호 |
의미 |
`,
|
「,」(콤마)의 문자.
커멘드의 단락과 구별하기 위해(때문에), 이스케이프가 필요.
덧붙여 커멘드의 마지막 인수내에서는, 문자로서의 콤마인 것이 자명하기 때문에, 콤마를 이스케이프 할 필요는 없다.
|
`;
|
「;」(세미콜론)의 문자.
반각 스페이스인가Tab문자의 다음에 오는 경우만, 코멘트의 개시 기호와 구별하기 위해서 이스케이프 할 필요가 있다.
|
`::
|
문자열 「::」(코론 둘).핫 스트링등에서 사용.
|
`%
|
「%」(퍼센트 기호)
|
`n
|
개행(LF/0x0A)
|
`r
|
복귀(CR/0x0D)
|
`t
|
Tab문자(0x09)
|
`v
|
수직Tab(0x0B)
|
`b
|
BackSpace문자(0x08)
|
`a
|
Bell문자(0x07)
|
`f
|
개페이지(0x0C)
|
``
|
「`」자신.
(이스케이프 문자2개로 이스케이프 문자 자신이 된다.)
|
스크립트는 읽어들여 때에 해석되어최적화된다.
문법 에러는 읽어들여 때에 체크되어 수정될 때까지 실행할 수 없다.
스크립트가 읽히면, 최초로Return인가Exit하지만 실행되는지,hot key 라벨하지만 기술되고 있는 행이나 스크립트의 마지막에 이를 때까지, 스크립트가 실행된다.
이 부분을,auto-execute섹션이라고 부른다.
hot key를 할당할 수 있거나#Persistent지령,Lock계 키의 고정등에서 상주 상태로 되지 않는 경우,auto-execute섹션이 종료한 시점에서 스크립트는 종료한다.
hot key,커스텀 메뉴 아이템,타이머그리고 기동된다스렛드그럼, 아래와 같은 커멘드로 설정되는 값은 각각 독립하고 있다.
이러한 초기치는Auto-execute섹션으로 설정할 수 있다.
설정을 하기 전에 스렛드가 불려 가면, 기대한 동작이 되지 않는 것이 있으므로,Auto-execute섹션의 가능한 한 최초의 분으로 설정하면 좋다.
스크립트의 디버그
스크립트가 기대 대로에 동작하고 있는지를 확인하려면 , 스크립트의 요소 요소에MsgBox커멘드를 넣고, 동작 상황이나 변수의 내용을 표시하면 좋다.
그 밖에도,ListVars커멘드와Pause커멘드로 변수의 내용을 정리해 표시한다고 하는 방법도 있다.
이러한 디버그는, 액티브 윈도우가 바뀌어 버리면 정상적으로 동작하지 않는 듯한 곳에서는 사용할 수 없기 때문에 주의가 필요하다.