스크립트

관련 주제:

목차

들어가는 말

각 스크립트는 평범한 텍스트 파일로서 안에 있는 줄들을 프로그램이 실행합니다 (AutoHotkey.exe). 스크립트는 또 핫키핫스트링 심지어 모조리 그것들로 구성되기도 합니다. 그렇지만, 핫키와 핫스링이 없다면 스크립트는 기동된 순간 그의 명령어들을 순서대로 위에서부터 아래로 수행합니다.

프로그램은 스크립트를 메모리 안으로 한 줄씩 적재합니다. 각 줄은 길이가 16,383 문자입니다. 적재하는 동안, 스크립트는 최적화되고 평가됩니다. 구문 에러는 화면에 보여지고 그 에러를 반드시 수정해야 스크립트를 실행할 수 있습니다.

스크립트의 상단 (자동-실행 섹션)

스크립트가 적재된 후, 제일 윗 줄부터 실행을 시작해 Return, Exit, 핫키/핫스트링 라벨, 또는 물리적으로 끝에 다다를 때까지 실행을 계속합니다 (순서에 상관이 없습니다). 스크립트에서 이 상단 부분을 자동-실행 섹션이라고 지칭합니다.

Note: While the script's first hotkey/hotstring label has the same effect as return, other hotkeys and labels do not.

If the script is not persistent, it will terminate after the auto-execute section has completed. Otherwise, it will stay running in an idle state, responding to events such as hotkeys, hotstrings, GUI events, custom menu items, and timers. A script is automatically persistent if it contains hotkeys, hotstrings, OnMessage() or GUI, and in a few other cases. The #Persistent directive can also be used to explicitly make the script persistent.

핫키, 핫스트링, 메뉴 항목, GUI 이벤트, 또는 타이머가 기동하는 쓰레드마다 새롭게 기본 값을 가지고 시작합니다. 다음과 같은 속성들이 자동-실행 섹션에 설정되어 있습니다. 언셋하면, (각 페이지 문서에 기재된 대로) 표준 기본 값이 적용됩니다: AutoTrim, CoordMode, Critical, DetectHiddenText, DetectHiddenWindows, FileEncoding, ListLines, SendLevel, SendMode, SetBatchLines, SetControlDelay, SetDefaultMouseSpeed, SetFormat, SetKeyDelay, SetMouseDelay, SetRegView, SetStoreCapsLockMode, SetTitleMatchMode, SetWinDelay, StringCaseSense, and Thread.

자동-실행 섹션을 완료하는데 시간이 많이 걸린다면 (또는 완료되지 않는다면), 위의 설정에 대한 기본값은 100 밀리초 후에 효과를 발휘합니다. 자동-실행 섹션이 마침내 완료될 때, 기본 값은 자동-실행 섹션의 끝에서 효과가 있던 값들로 다시 갱신됩니다. 그리하여, 보통 제일 좋은 방법은 스크립트의 상단에 있는 기본 값들을 변경하는 것입니다. 여기에 핫키, 핫스트링, 타이머, 또는 맞춤 메뉴 항목이 들어 있습니다. 또 각 쓰레드마다 따로 위의 설정을 보유하고 있다는 것을 주목하십시오. 그런 설정은 변경해도 다른 쓰레드에 영향을 미치지 않습니다.

긴 줄을 여러 개의 짧은 줄로 가르기

긴 줄은 작은 줄들로 쪼개어 가독성과 유지관리성을 향상시킬 수 있습니다. 이렇게 하더라도 스크립트의 실행 속도는 감소하지 않습니다. 왜냐하면 그런 줄들은 스크립트가 기동하는 순간 메모리에서 합병되기 때문입니다.

방법 #1: 줄이 "and", "or", ||, &&, 쉼표, 또는 마침표로 시작하면 자동으로 윗 줄과 합병됩니다 (v1.0.46+에서, ++와 --를 제외하고 다른 모든 표현식 연산자에도 마찬가지로 적용됩니다). 다음 예제에서, 두 번째 줄은 첫 번째 줄에 붙는데 쉼표로 시작하기 때문입니다:

FileAppend, 이것은 추가할 텍스트입니다.`n   ; 여기에 주석이 허용됩니다.
    , %A_ProgramFiles%\SomeApplication\LogFile.txt  ; 주석입니다.

비슷하게, 다음의 줄들은 하나의 줄로 합병될 것입니다. 왜냐하면 마지막 두 줄이 "and" 또는 "or"로 시작하기 때문입니다:

if (Color = "Red" or Color = "Green"  or Color = "Blue"   ; 주석입니다.
    or Color = "Black" or Color = "Gray" or Color = "White")   ; 주석입니다.
    and ProductIsAvailableInColor(Product, Color)   ; 주석입니다.

삼진 연산자도 훌륭한 후보입니다:

ProductIsAvailable := (Color = "Red")
    ? false  ; 우리는 바이러스 제품이 없습니다. 그러니 걱정하지 말고 함수를 호출하십시오.
    : ProductIsAvailableInColor(Product, Color)

위의 예제에 사용된 들여쓰기는 선택적이지만, 어느 줄이 위의 어느 줄에 속하는지 보여주기 때문에 가독성이 향상됩니다. 또, "AND" 그리고 "OR" 같은 단어로 시작하는 줄들은 따로 더 스페이스를 포함할 필요가 없습니다; 오토핫키가 자동으로 추가해 줍니다. 마지막으로, 빈 줄이나 주석은 위의 예제에서 줄 사이 또는 줄 끝에 추가할 수 있습니다.

방법 #2: 엄청나게 많은 줄을 병합하려면 또는 방법 #1이 적당하지 않을 때 이 방법을 사용해야 합니다. 자동-교체 핫스트링에 이 방법이 특별히 유용하지만, 명령어 또는 표현식에도 사용할 수 있습니다. 예를 들어:

; 예제 #1:
Var =
(
한 줄의 텍스트.
By default, the hard carriage return (Enter) between the previous line and this one will be stored as a linefeed (`n).
    By default, the spaces to the left of this line will also be stored (the same is true for tabs).
기본값으로, %Var%과 같은 변수 참조는 변수의 내용으로 결정됩니다.
)

; EXAMPLE #2 - expression syntax (recommended):
Var := "
(
Same as above, except that variable references such as %Var% are not resolved.
Instead, specify variables as follows:" Var "
)"

; 예제 #3:
FileAppend,  ; 이 경우 쉼표가 필요합니다.
(
1 번 줄 텍스트
2 번 줄 텍스트. 기본값으로, 라인피드(`n)가 줄 사이에 존재합니다.
), C:\My File.txt

위의 예제에서, 일련의 줄들은 한 쌍의 괄호로 상단과 하단에 경계가 있습니다. 이런 것을 계속 섹션이라고 부릅니다. 하단 줄에 닫는 괄호 다음에 FileAppend의 마지막 매개변수가 있음에 주목하십시오. 이 관례는 선택적입니다; 이와 같은 경우에 쉼표는 문자 그대로의 쉼표가 아니라 매개변수-가름자로 보이게 됩니다.

계속 섹션의 기본 행위를 오버라이드 할 수 있습니다. 계속 섹션의 여는 괄호의 오른쪽에 다음 옵션 중 하나 또는 여러개를 포함하면 됩니다. 옵션이 여럿 존재하면, 스페이스로 앞의 옵션과 각각 구별합니다. 예를 들어: ( LTrim Join| %.

Join: 어떻게 줄을 연결할지 지정합니다. 이 옵션이 생략되면, 각 줄은 마지막 줄을 제외하고 다음에 줄넘김 문자 (`n)가 따라옵니다. 단어 Join 자체만 지정하면, 줄들은 직접적으로 그 사이에 아무 문자 없이 서로 결합합니다. 그렇지 않으면 단어 Join 다음에 즉시 15개 까지의 문자가 따라와야 합니다. 예를 들어, Join`s는 마지막 줄을 제외하고 각 줄 뒤에 스페이스를 삽입합니다 -- 오로지 Join만 인식하는 특별한 피신 연속열입니다). 또다른 예는 Join`r`n인데, 이것은 줄과 줄 사이에 CR+LF를 삽입합니다. 비슷하게, Join|는 줄 사이에 파이프를 삽입합니다. 계속 섹션의 마지막 줄도 연결-문자로 끝내려면, 계속 섹션의 닫는 괄호 바로 위에 즉시 빈줄을 포함시킵니다.

알려진 한계: 문자열 Join이 쌍점으로 끝나면, 그 줄에서 마지막 옵션으로 취급하면 안됩니다. 예를 들어, (Join:은 라벨 "(Join"으로 취급되고 (LTrim Join:은 지원하지 않습니다. 그러나 (Join: C는 좋습니다.

LTrim: 각 줄의 선두에서 스페이스와 탭을 걷어냅니다. 스페이스와 탭은 주로 계속 섹션을 들여쓰기 하는 데 사용됩니다. 또, 이 옵션은 여러 계속 섹션에 대해서도 활성화할 수 있습니다. 한 줄에 #LTrim만 지정하면 됩니다. #LTrim은 위치에 영향을 받습니다: 물리적으로 그 아래에 있는 모든 계속 섹션에 영향을 미칩니다. #LTrim Off를 통하여 설정을 끌 수 있습니다.

RTrim0 (RTrim 다음에 0): 각 줄의 끝으로부터 스페이스와 탭을 걷어내지 못하게 막습니다.

Comments (또는 Comment 또는 Com 또는 C) [v1.0.45.03+]: 쌍반점 주석을 계속 섹션 안에 허용합니다 (그러나 /*..*/ 안에는 허용하지 않습니다). 그런 주석들은 (왼쪽에 있는 스페이스와 탭과 함께) 결합된 결과로부터 모조리 제거됩니다. 기호 텍스트로 취급되지 않습니다. 각 주석은 줄의 오른쪽 또는 그 자체로 새 줄에 나타날 수 있습니다.

% (퍼센트 사인): 퍼센트 사인을 변수 참조가 아니라 기호 그대로 취급합니다. 그래서 각 퍼센트 사인을 기호 그대로 만들기 위해 피신시킬 필요가 없습니다. 자동-교체 핫스트링과 같이, 이미 퍼센트 사인이 기호인 경우에 이 옵션은 필요하지 않습니다.

, (쉼표): 쉼표를 문자 그대로의 쉼표가 아니라 가름자로 취급합니다. 별로 사용되지 않는 이 옵션은 명령어 매개변수 사이의 쉼표에 대해서만 꼭 필요합니다. 왜냐하면 함수 호출에서, 쉼표의 종류는 문제가 되지 않기 때문입니다. 또 이 옵션은 실제로 매개변수 사이를 가르는 쉼표들만 변형합니다. 다른 말로 하면, 일단 명령어의 마지막 매개변수에 다다르면 (즉, 더 이상 매개변수가 없으면), 연이어 나오는 쉼표는 이 옵션에 상관 없이 문자 그대로 쉼표로 취급됩니다.

` (액센트): 각 백틱 문자를 피신 문자가 아니라 문자 그대로 취급합니다. 이것은 또 쉼표와 퍼센트 사인이 명시적으로 그리고 개별적으로 피신되지 못하도록 막습니다. 게다가, `r 그리고 `t와 같이 명시적으로 지정된 피신 연속열을 변환하지 못하도록 막습니다.

) [v1.1.01+]: 닫는 괄호가 계속 섹션의 옵션에 나타나면 (Join 옵션의 매개변수로 나타나면 제외), 그 줄은 계속 섹션의 시작이 아니라 표현식으로 재번역됩니다. 이렇게 하면 여는 괄호를 피신시킬 필요 없이 (x.y)[z]()와 같은 표현식을 작동시킬 수 있습니다.

논평

`n (줄넘김)와 `t (탭) 같은 피신 연속열은 계속 섹션 안에서 지원됩니다. 단 accent (`) 옵션이 지정되어 있는 경우는 제외합니다.

주석 옵션이 없으면, 쌍반점과 /*..*/ 주석이 계속 섹션 안에서 지원되지 않습니다. 왜냐하면 기호 텍스트로 보이기 때문입니다. 그렇지만, 주석은 계속 섹션의 상단 줄과 하단 줄에 포함될 수 있습니다. 예를 들어:

FileAppend,   ; 주석입니다.
; 주석입니다.
( LTrim Join    ; 주석입니다.
     ; 이것은 주석이 아닙니다; 문자 그대로입니다. 윗 줄에 단어 Comments를 포함하면 주석이 됩니다.
), C:\File.txt   ; 주석입니다.

위의 결과로, 쌍반점은 계속 섹션 안에서 피신시킬 필요가 없습니다.

계속 섹션은 16,383 문자가 넘는 줄을 생산하지 못합니다 (시도하면, 프로그램은 스크립트가 기동하는 순간 경고를 보냅니다). 이를 돌아가는 한 가지 방법은 일렬로 결합해서 변수에 넣는 것입니다. 예를 들어:

Var := "
(
...
)"
Var .= "`n  ; 또다른 계속 섹션을 통하여 변수에 더 많은 텍스트를 추가합니다.
(
...
)"
FileAppend, %Var%, C:\My File.txt

닫는 괄호는 연속 섹션의 끝을 나타내기 때문에, 줄을 닫는 괄호로 시작하려면, 앞에다 액센트/백틱을 배치해야 합니다: `).

계속 섹션 다음에 즉시 따라오는 줄에 또다른 계속 섹션을 여는 괄호가 담길 수 있습니다. 이렇게 하면 한 개의 줄을 구성하는 동안 위에 언급한 옵션들이 달라질 수 있습니다.

#Include를 이용하여 계속 섹션을 구성하는 방법은 지원하지 않습니다.

스크립트를 EXE (Ahk2Exe)로 변환하기

A script compiler (courtesy of fincs, with additions by TAC109) is included with the program.

Once a script is compiled, it becomes a standalone executable; that is, AutoHotkey.exe is not required in order to run the script. 컴파일 과정을 통해 실행 파일이 생성됩니다. 안에 다음과 같이 포함됩니다. 오토핫키 인터프리터, 스크립트, 그리고 기타 포함된 파일, 그리고 FileInstall 명령어를 통하여 병합한 파일들. [v1.1.33+]: Additional files can be included using compiler directives.

Compiler Topics

Running the Compiler

Ahk2Exe는 다음과 같은 방식으로 사용할 수 있습니다:

주의:

컴파일러의 소스 코드와 새 버전은 GitHub에서 얻을 수 있습니다.

Base Executable File

Each compiled script .exe is based on an executable file which implements the interpreter. The base files included in the Compiler directory have the ".bin" extension; these are versions of the interpreter which do not include the capability to load external script files. Instead, the program looks for a Win32 (RCDATA) resource named ">AUTOHOTKEY SCRIPT<" and loads that, or fails if it is not found.

[v1.1.34+]: The standard AutoHotkey executable files can also be used as the base of a compiled script, by embedding a Win32 (RCDATA) resource with ID 1. (Additional scripts can be added with the AddResource compiler directive.) This allows the compiled script .exe to be used with the /script switch to execute scripts other than the main embedded script. For more details, see Embedded Scripts.

Script Compiler Directives

[v1.1.33+]: Script compiler directives allow the user to specify details of how a script is to be compiled. Some of the features are:

See Script Compiler Directives for more details.

Compressing Compiled Scripts

Ahk2Exe optionally uses MPRESS or [v1.1.33+] UPX freeware to compress compiled scripts. If MPRESS.exe and/or UPX.exe has been copied to the "Compiler" subfolder where AutoHotkey was installed, either can be used to compress the .exe as directed by the /compress parameter or the GUI setting.

MPRESS official website (downloads and information): http://www.matcode.com/mpress.htm
MPRESS mirror: https://www.autohotkey.com/mpress/

UPX official website (downloads and information): https://upx.github.io/

Note: While compressing the script executable prevents casual inspection of the script's source code using a plain text editor like Notepad or a PE resource editor, it does not prevent the source code from being extracted by tools dedicated to that purpose.

Background Information

In [v1.1.33.10+], the following folder structure is supported, where the running version of Ahk2Exe.exe is in the first \Compiler directory shown below:

\AutoHotkey 
   AutoHotkeyA32.exe 
   AutoHotkeyU32.exe
   AutoHotkeyU64.exe
   \Compiler
      Ahk2Exe.exe  ; the master version of Ahk2Exe
      ANSI 32-bit.bin
      Unicode 32-bit.bin
      Unicode 64-bit.bin
   \AutoHotkey v2.0-a135
      AutoHotkey32.exe
      AutoHotkey64.exe
      \Compiler
   \v2.0-beta.1
      AutoHotkey32.exe
      AutoHotkey64.exe

The base file search algorithm runs for a short amount of time when Ahk2Exe starts, and works as follows:

Qualifying AutoHotkey .exe files and all .bin files are searched for in the compiler's directory, the compiler's parent directory, and any of the compiler's sibling directories with directory names that start with AutoHotkey or V, but do not start with AutoHotkey_H. The selected directories are searched recursively. Any AutoHotkey.exe files found are excluded, leaving files such as AutoHotkeyA32.exe, AutoHotkey64.exe, etc. plus all .bin files found. All .exe files that are included must have a name starting with AutoHotkey and a file description containing the word AutoHotkey, and must have a version of 1.1.34+ or 2.0-a135+.

A version of the AutoHotkey interpreter is also needed (as a utility) for a successful compile, and one is selected using a similar algorithm. In most cases the version of the interpreter used will match the version of the base file selected by the user for the compile.

스크립트에 명령 줄 매개변수 건네기

스크립트는 명령줄 매개변수를 지원합니다. 형식은 다음과 같습니다:

AutoHotkey.exe [스위치] [Script Filename] [스크립트 매개변수]

그리고 컴파일된 스크립트라면 그 형식은 다음과 같습니다:

CompiledScript.exe [스위치] [스크립트 매개변수]

스위치: 다음 중 하나 또는 그 이상:

스위치의미Works compiled?
/f 또는 /force 무조건 기동합니다. 경고 대화상자를 전부 무시합니다. This has the same effect as #SingleInstance Off.
/r 또는 /restart Indicate that the script is being restarted and should attempt to close a previous instance of the script (this is also used by the Reload command, internally).
/ErrorStdOut

/ErrorStdOut=Encoding

Send syntax errors that prevent a script from launching to the standard error stream (stderr) rather than displaying a dialog. 자세한 것은 #ErrorStdOut를 참조하십시오. 이것을 /iLib와 조합하면 스크립트를 실행하지 않고 평가할 수 있습니다.

[v1.1.33+]: An encoding can optionally be specified. For example, /ErrorStdOut=UTF-8 encodes messages as UTF-8 before writing them to stderr.

/Debug [AHK_L 11+]: 디버깅 클라이언트에 접속합니다. 더 자세한 것은 상호대화 디버깅을 참조합니다. 아니
/CPn

[AHK_L 51+]: 스크립트 파일을 읽는 데 사용된 기본 코드페이지를 오버라이드 합니다. 더 자세한 정보는 스크립트 파일 코드페이지를 참조하십시오.

[v1.1.33+]: If "Default to UTF-8" is enabled in the installer, the ".ahk" file type is registered with a command line including /CP65001. This causes all scripts launched through the shell (Explorer) to default to UTF-8 in the absence of a UTF-16 byte order mark. Scripts launched by running AutoHotkey.exe directly still default to CP0, as the /CP65001 switch is absent.

아니
/iLib "OutFile"

[v1.0.47+]: AutoHotkey는 스크립트를 적재하지만 실행하지는 않습니다. 라이브러리 메커니즘을 통하여 자동으로-포함된 각 스크립트 파일에 대하여, OutFile이 지정한 파일에 두 줄이 씌여집니다. 다음과 같은 형식으로 작성됩니다. LibDir은 Lib 폴더의 완전한 경로이고 LibFile은 그 라이브러리의 파일이름입니다:

#Include LibDir\
#IncludeAgain LibDir\LibFile.ahk

출력 파일에 존재하면, 덮어씁니다. OutFile*이면 표준출력(stdout)에 씁니다.

스크립트에 구문에러가 있다면, 출력 파일은 비어 있을 수 있습니다. 프로세스 종료 코드를 사용하면 이 상황을 탐지할 수 있습니다; 구문에러가 있다면, 종료 코드는 2입니다. /ErrorStdOut 스위치를 사용하면 에러 메시지를 누르거나 나포할 수 있습니다.

아니
/include "IncFile"

[v1.1.34+]: Includes a file prior to the main script. Only a single file can be included by this method. When the script is reloaded, this switch is automatically passed to the new instance.

아니
/script

[v1.1.34+]: When used with a compiled script based on an .exe file, this switch causes the program to ignore the main embedded script. This allows a compiled script .exe to execute external script files or embedded scripts other than the main one. Other switches not normally supported by compiled scripts can be used but must be listed to the right of this switch. 예를 들어:

CompiledScript.exe /script /ErrorStdOut MyScript.ahk "Script's arg 1"

If the current executable file does not have an embedded script, this switch is permitted but has no effect.

This switch is not supported by compiled scripts which are based on a .bin file.

다음 참조: Base Executable File (Ahk2Exe)

N/A

스크립트 파일이름: 스크립트 매개변수가 없다면 생략할 수 있습니다. 생략되면 (예를 들어 오토핫키를 시작 메뉴로부터 직접 실행하면), 프로그램은 AutoHotkey.ahk를 다음 위치에서 순서대로 찾습니다:

파일이름 AutoHotkey.ahk는 스크립트를 실행하는 데 사용된 실행파일의 이름에 따라 다릅니다. 예를 들어, AutoHotkey.exe를 MyScript.exe로 이름을 바꾸었다면, MyScript.ahk를 찾으려고 시도합니다. AutoHotkeyU32.exe를 매개변수 없이 실행하면 AutoHotkeyU32.ahk를 찾습니다.

주의: revision 51 이전의 버전에서는 AutoHotkey.ini를 작업 디렉토리에서 찾거나 AutoHotkey.ahk를 나의 문서에서 찾았습니다.

[v1.1.17+]: 별표(*)를 파일이름에 지정해 표준 입력(stdin)으로부터 스크립트 텍스트를 읽어 들입니다. 예를 들어, ExecScript()를 참조하십시오.

[v1.1.34+]: If the current executable file has embedded scripts, this parameter can be an asterisk followed by the resource name or ID of an embedded script. For compiled scripts (i.e. if an embedded script with the ID #1 exists), this parameter must be preceded by the /script switch.

Script Parameters: The string(s) you want to pass into the script, with each separated from the next by one or more spaces. 스페이스가 포함된 매개변수는 인용부호로 둘러싸야 합니다. If you want to pass an empty string as a parameter, specify two consecutive quotation marks. 기호 그대로의 인용부호는 역사선(\")을 앞에 붙여서 건넬 수 있습니다. 결과적으로, 인용부호 매개변수에 뒤따르는 역사선은 (예를 들어 "C:\My Documents\") 기호 그대로의 인용부호로 취급됩니다 (즉, 스크립트는 문자열 C:\My Documents"를 받습니다). 그런 따옴표를 제거하려면, StringReplace, 1, 1, ",, All를 사용하십시오.

[v1.1.27+]: Incoming parameters, if present, are stored as an array in the built-in variable A_Args, and can be accessed using array syntax. A_Args[1] contains the first parameter. 다음 예제는 너무 매개변수가 적게 건네어지면 스크립트를 종료합니다:

if A_Args.Length() < 3
{
    MsgBox % "이 스크립트는 적어도 3 개의 매개변수가 들어오기를 요구하지만, 겨우 " A_Args.Length() " 개를 받았습니다."
    ExitApp
}

스크립트로 건네지는 매개변수의 개수가 달라지면 (사용자가 스크립트에 파일들을 끌어 떨구는 경우), 다음 예제는 매개변수를 하나씩 추출합니다:

for n, param in A_Args  ; 각 매개변수에 대하여:
{
    MsgBox 매개변수 번호 %n%는 %param%입니다.
}

매개변수가 파일 이름이면, 다음 예제와 같이 그 이름을 완전한/절대 경로를 포함하여 대소문자를 교정한 기다란 이름으로 변환할 수 있습니다 (파일 시스템에 저장된 것과 같은):

for n, GivenPath in A_Args  ; 각 매개변수에 대하여 (또는 스크립트에 떨군 각 파일에 대하여):
{
    Loop Files, %GivenPath%, FD  ; 파일과 디렉토리를 포함합니다.
        LongPath := A_LoopFileFullPath
    MsgBox 대소문자를 교정한 기다란 경로의 파일이름은`n%GivenPath%`n다음과 같습니다:`n%LongPath%
}

알려진 한계: 파일을 끌어 .ahk 스크립트에 떨어트릴 때 NTFS 파일 시스템에서 8-점-3 (짧은) 이름이 꺼져 있으면 제대로 작동하지 못할 가능성이 높습니다. 한 가지 우회책은 스크립트를 컴파일한 다음 그 결과 파일을 그 결과 EXE 파일 위에 끌어 떨구는 것입니다.

Legacy: The command line parameters are also stored in the variables %1%, %2%, and so on, as in versions prior to [v1.1.27]. 게다가, %0%에는 건네어진 매개변수의 개수가 담겨 있습니다 (없으면 0). 그렇지만, 이런 변수들은 표현식 안에서 직접적으로 참조할 수 없습니다. 왜냐하면 변수가 아니라 숫자로 보이기 때문입니다. 다음 예제는 너무 매개변수가 적게 건네어지면 스크립트를 종료합니다:

if 0 < 3  ; 비-표현식 if-서술문의 왼쪽은 언제나 변수의 이름입니다.
{
    MsgBox 이 스크립트는 적어도 3 개의 매개변수가 들어오기를 요구하지만, 겨우 %0% 개를 받았습니다.
    ExitApp
}

스크립트로 건네지는 매개변수의 개수가 달라지면 (사용자가 스크립트에 파일들을 끌어 떨구는 경우), 다음 예제는 매개변수를 하나씩 추출합니다:

Loop, %0%  ; 각 매개변수에 대하여:
{
    param := %A_Index%  ; A_Index에 포함된 이름의 변수의 내용을 가져옵니다.
    MsgBox, 4,, 매개변수 번호 %A_Index%는 %param%입니다.  계속할까요?
    IfMsgBox, No
        break
}

매개변수가 파일 이름이면, 다음 예제와 같이 그 이름을 완전한/절대 경로를 포함하여 대소문자를 교정한 기다란 이름으로 변환할 수 있습니다 (파일 시스템에 저장된 것과 같은):

Loop %0%  ; 각 매개변수에 대하여 (또는 스크립트에 떨군 각 파일에 대하여):
{
    GivenPath := %A_Index%  ; A_Index에 포함된 이름의 변수의 내용을 가져옵니다.
    Loop %GivenPath%, 1
        LongPath := A_LoopFileLongPath
    MsgBox 대소문자를 교정한 기다란 경로의 파일이름은`n%GivenPath%`n다음과 같습니다:`n%LongPath%
}

스크립트 파일 코드페이지 [AHK_L 51+]

In order for non-ASCII characters to be read correctly from file, the encoding used when the file was saved (typically by the text editor) must match what AutoHotkey uses when it reads the file. If it does not match, characters will be decoded incorrectly. AutoHotkey uses the following rules to decide which encoding to use:

이 원칙은 오토핫키가 적재하는 스크립트 파일에만 적용됩니다. 스크립트 자체의 파일 I/O에는 적용되지 않는다는 것을 주의하십시오. 파일인코딩은 스크립트가 읽고 쓰는 기본 인코딩을 제어합니다. 반면에 IniReadIniWrite는 언제나 UTF-16 또는 ANSI를 취급합니다.

모든 텍스트가 (필요하면) 고유의 문자열 형식으로 변환되므로, 유효하지 않거나 고유의 코드페이지에 존재하지 않는 문자는 위치보유자로 교체됩니다: ANSI라면 '?'로 교체되고 Unicode는 '�'로 교체됩니다. 유니코드 빌드본은 오직 스크립트 파일에 인코딩 에러가 있을 경우 또는 파일을 적재하고 저장하는 데 사용된 코드 페이지가 일치하지 않을 경우에만 교체가 일어납니다.

RegWrite는 익스플로러로 기동된 스크립트에 대하여 기본값을 설정하는 데 사용할 수 있습니다(예, 더블클릭 실행):

; 아래의 적절한 줄에 주석을 걷어내고 모두 주석 처리해서
; 현재 빌드의 기본값으로 리셋합니다. 필요한 대로 변경합니다:
; codepage := 0        ; 시스템 기본 ANSI 코드페이지
; codepage := 65001    ; UTF-8
; codepage := 1200     ; UTF-16
; codepage := 1252     ; ANSI 라틴 1; 서구 유럽 (윈도우즈)
if (codepage != "")
    codepage := " /CP" . codepage
cmd="%A_AhkPath%"%codepage% "`%1" `%*
key=AutoHotkeyScript\Shell\Open\Command
if A_IsAdmin    ; 모든 사용자를 위해 설정합니다.
    RegWrite, REG_SZ, HKCR, %key%,, %cmd%
else            ; 현재 사용자에 대해서만 설정합니다.
    RegWrite, REG_SZ, HKCU, Software\Classes\%key%,, %cmd%

이미 오토핫키가 설치되어 있다고 가정합니다. 그렇지 않다면 결과가 불만족스러울 수도 있습니다.

스크립트 디버깅하기

ListVarsPause같은 명령어들은 스크립트를 디버그하는 데 도움을 줄 수 있습니다. 예를 들어, 다음의 두 줄을 주의 깊게 선택된 위치에 임시로 삽입하면, 스크립트에 "정지 점"을 만듭니다:

ListVars
Pause

스크립트가 이 두 줄을 만나면, 모든 변수의 현재 내용을 화면에 보여주므로 조사할 수 있습니다. 재개할 준비가 되면, File이나 Tray 메뉴를 통하여 재개합니다. 그러면 스크립트는 (혹 있다면) 다음 "정지 점"에 도달할 때까지 계속 진행합니다.

일반적으로 이런 "정지 점"들을 활성 창이 스크립트에 영향을 주지 않는 곳에 배치하는 것이 제일 좋습니다. 예를 들어 WinActivate 명령어 바로 다음이 좋습니다. 이렇게 하면 스크립트는 적절하게 연산을 재개할 수 있습니다.

다음 명령어들도 또한 디버깅에 유용합니다: ListLines, KeyHistory, 그리고 OutputDebug.

아주 흔한 에러로, 철자 오류나 "global" 선언을 빼먹는 경우, 경고를 켜면 탐지할 수 있습니다.

상호대화 디버깅 [AHK_L 11+]

상호대화 디버깅은 지원되는 DBGp 클라이언트로 가능합니다. 전형적으로 다음 조치가 가능합니다:

Note that this functionality is disabled for compiled scripts which are based on a BIN file. For compiled scripts based on an EXE file, /debug must be specified after /script.

상호대화 디버깅을 켜려면, 먼저 지원되는 디버거 클라이언트를 기동한 다음, 그 스크립트를 /Debug 명령어 줄 스위치와 함께 기동합니다.

AutoHotkey.exe /Debug=SERVER:PORT ...

SERVERPORT는 생략해도 됩니다. 예를 들어, 다음은 서로 동등합니다:

AutoHotkey /Debug "myscript.ahk"
AutoHotkey /Debug=localhost:9000 "myscript.ahk"

[AHK_L 59+]: 디버거를 이미 실행중인 스크립트에 붙이려면, 아래와 같은 메시지를 전송하십시오:

ScriptPath := "" ; 여기에 스크립트의 전체 경로를 설정하십시오
DetectHiddenWindows On
if WinExist(ScriptPath " ahk_class AutoHotkey")
    ; 선택적 매개변수:
    ;   wParam  = 디버거 클라이언트의  IPv4 주소, 32-비트 정수.
    ;   lParam  = 디버거 클라이언트가 주시하고 있는 포트.
    PostMessage DllCall("RegisterWindowMessage", "str", "AHK_ATTACH_DEBUGGER")

디버거 클라이언트가 접속되면, 스크립트를 종료하지 않고도 뗄 수 있습니다. "detach" DBGp 명령어를 전송하면 됩니다.

스크립트 예제

유용한 스크립트는 이 페이지에서 보실 수 있습니다.