関連トピック:
各スクリプトは、プログラム(AutoHotkey.exe)によって実行される行を含むプレーンテキストファイルです。スクリプトには、ホットキーや ホットストリングが含まれることもありますし、それらだけで構成されることもあります。しかし、ホットキーやホットストリングがない場合、スクリプトは起動した瞬間に上から下へと順次機能を実行する。
プログラムはスクリプトを一行ずつメモリにロードする。ロード中、スクリプトは最適化され、検証される。構文エラーはすべて表示され、スクリプトを実行する前に修正する必要があります。
スクリプトが読み込まれた後、自動実行スレッドは、スクリプトの先頭行で実行を開始し、Return、ExitApp、Exitなどの停止指示があるまで実行を続ける。スクリプトの物理的な端は、Exitとしても機能します。
ホットキー、ホットストリング、表示可能なGUI、アクティブタイマー、クリップボードモニター、InputHooksがなく、Persistent関数を呼び出していない場合、スクリプトは起動完了後に終了します。Otherwise, it will stay running in an idle state, responding to events such as hotkeys, hotstrings, GUI events, custom menu items, and timers. 起動完了後にこれらの条件が変更された場合(たとえば、最後のタイマーが無効になった場合)、最後に実行されたスレッドが完了するか、最後のGUIが閉じると、スクリプトが終了することがあります。
新しいスレッドが(ホットキー、ホットストリング、タイマー、その他のイベントによって)起動されるたびに、以下の設定が自動実行スレッドからコピーされます。自動実行スレッドによって設定されていない場合は、標準のデフォルトが適用される(以下の各ページに記載):CoordMode、Critical、DetectHiddenText、DetectHiddenWindows、FileEncoding、ListLines、SendLevel、SendMode、SetControlDelay、SetDefaultMouseSpeed、SetKeyDelay、SetMouseDelay、SetRegView、SetStoreCapsLockMode、SetTitleMatchMode、SetWinDelay、Thread。
各スレッドは上記の設定のコレクションを保持するため、これらの設定を変更しても他のスレッドには影響しない。
上記の関数の「デフォルト設定」とは、通常、自動実行スレッドの現在の設定を指し、プログラム定義のデフォルト設定と同じように開始される。
伝統的に、スクリプトの最上部は自動実行セクションと呼ばれてきた。しかし、自動実行スレッドはスクリプトの先頭だけに限定されるわけではない。自動実行スレッドで呼び出される関数も、デフォルト設定に影響を与える可能性がある。ディレクティブや関数、ホットキー、ホットストリング、クラス定義は、実行中に遭遇するとスキップされるため、起動コードを各ファイル全体に配置することが可能です。例えば、ホットキーのグループで使用されるグローバル変数は、スクリプトの先頭ではなく、それらのホットキーの上(または下)で初期化することができます。
長い行を小さな行の集まりに分割することで、読みやすさと保守性を向上させることができる。このような行は、スクリプトが起動した瞬間にメモリ上にマージされるため、スクリプトの実行速度が低下することはない。
3つの方法があり、一般的に組み合わせて使うことができる:
継続演算子:カンマまたはその他の式演算子(++と--を除く)で始まる行は、その直上の行に自動的にマージされる。同様に、式演算子で終わる行は、自動的にその下の行にマージされる。次の例では、2行目はコンマで始まっているため、1行目に追加される:
FileAppend "This is the text to append.`n" ; A comment is allowed here. , A_ProgramFiles "\SomeApplication\LogFile.txt" ; Comment.
同様に、次の2行は "and"または "or"で始まるので、1行にまとめられる:
if Color = "Red" or Color = "Green" or Color = "Blue" ; Comment. or Color = "Black" or Color = "Gray" or Color = "White" ; Comment. and ProductIsAvailableInColor(Product, Color) ; Comment.
三項演算子も良い候補である:
ProductIsAvailable := (Color = "Red") ? false ; We don't have any red products, so don't bother calling the function. : ProductIsAvailableInColor(Product, Color)
以下の例は上記と同等である:
FileAppend "This is the text to append.`n", ; A comment is allowed here. A_ProgramFiles "\SomeApplication\LogFile.txt" ; Comment. if Color = "Red" or Color = "Green" or Color = "Blue" or ; Comment. Color = "Black" or Color = "Gray" or Color = "White" and ; Comment. ProductIsAvailableInColor(Product, Color) ; Comment. ProductIsAvailable := (Color = "Red") ? false : ; We don't have any red products, so don't bother calling the function. ProductIsAvailableInColor(Product, Color)
上の例で使われているインデントは任意だが、どの行がその上の行に属するかを示すことで、より明瞭になるかもしれない。また、上記の例の行間や行末に空行やコメントを追加してもよい。
継続演算子は、自動置換ホットストリングや#HotIf以外のディレクティブでは使用できません。
囲みによる継続:ある行に式や関数・プロパティの定義があり、その定義が閉じていない(
/[
/{
場合、開閉記号の数が釣り合うまで後続の行と結合される。言い換えれば、括弧、ブラケット、ブレースで囲まれた部分式は、ほとんどの場合、自動的に複数行にまたがることができる。事例:
myarray := [ "item 1", "item 2", ] MsgBox( "The value of item 2 is " myarray[2], "Title", "ok iconi" )
継続表現は両方のタイプのコメントを含むことができる。
継続表現は通常の継続セクションを含むことができる。したがって、式を含むすべての行と同様に、エスケープされていない開括弧((
)で始まる行は、同じ行に閉括弧()
)がない限り、継続セクションの開始とみなされる。
引用符で囲まれた文字列は、この方法だけでは複数行にまたがることはできない。ただし、上記を参照のこと。
囲みによる継続は、継続演算子と組み合わせることができる。事例:
myarray := ; The assignment operator causes continuation. [ ; Brackets enclose the following two lines. "item 1", "item 2", ]
行末のブレース({
)は、オブジェクト・リテラルの開始ではなく、ブロックの開始(OTBスタイル)として解釈されるべきであるとプログラムが判断した場合、継続を引き起こさない。具体的には(優先順位の高い順に):
(
/[
/{
がある場合、中括弧はブロックの開始と解釈されることはない。例えば、If ({
のブレースはオブジェクト・リテラルの開始である。)
または]
に続くことはできないので、中括弧がこれらの記号のどちらかに続く場合(空白を除く)、(関数やプロパティ定義のような)ブロックの開始として解釈される。:= {
や for x in {
のような演算子が先行する場合に限り、オブジェクト・リテラルの開始とすることができる。特に、Loop {
の中括弧は常にブロック開始であり、If {
と While {
は常にエラーである。中括弧は、本文を必要としない関数呼び出し、式、制御フロー文であれば、行の継続のために安全に使うことができる。事例:
myfn() { return { key: "value" } }
継続セクション:この方法は、多数の行を統合する場合や、行が他の方法に適さない場合に使用する。このメソッドは自動置換ホットストリングに特に有効ですが、どんな式にも使えます。事例:
; EXAMPLE #1: Var := " ( A line of text. By default, the hard carriage return (Enter) between the previous line and this one will be stored. This line is indented with a tab; by default, that tab will also be stored. Additionally, "quote marks" are automatically escaped when appropriate. )" ; EXAMPLE #2: FileAppend " ( Line 1 of the text. Line 2 of the text. By default, a linefeed (`n) is present between lines. )", A_Desktop "\My File.txt"
上記の例では、一連の線は上下に括弧で囲まれている。これは継続区間として知られている。閉じ括弧の後のコードも(区切り記号なしで)他の行と結合されるが、開き括弧と閉じ括弧は含まれないことに注意。
継続セクションの上の行が名前文字で終わっており、そのセクションが引用符で囲まれた文字列で始まっていない場合、名前と継続セクションの内容を区切るために、1つのスペースが自動的に挿入される。
上記の例のように、引用符で囲まれた文字列の中で継続セクションが始まる場合、引用符は自動的にエスケープされる(つまり、リテラル文字として解釈される)。それ以外の場合、引用符は通常と同じように機能する。つまり、継続セクションは引用符で囲まれた文字列を含むことができる。
デフォルトでは、継続セクション内の最初の行のインデントに基づいて、先頭のスペースやタブが省略される。最初の行にスペースとタブが混在している場合、最初の種類の文字だけがインデントとして扱われます。もし、ある行が最初の行より小さくインデントされたり、間違った文字でインデントされた場合、その行のすべての先頭の空白はそのまま残されます。
By default, trailing spaces or tabs are omitted.
継続セクションのデフォルトの動作は、セクションの開始括弧の右側に以下のオプションを1つ以上含めることで上書きすることができる。複数のオプションがある場合は、それぞれをスペースで区切る。事例:( LTrim Join|
。
JoinString:線をどのようにつなげるかを指定します。If this option is not used, each line except the last will be followed by a linefeed character (`n). If String is omitted, lines are connected directly to each other without any characters in between. Otherwise, specify for String a string of up to 15 characters. 例えば、Join`s
は最後の行を除く各行の後にスペースを挿入する。他の例としては、行と行の間にCR+LFを挿入するJoin`r`n
がある。同様に、Join|
は行間にパイプを挿入する。To have the final line in the section also ended by String, include a blank line immediately above the section's closing parenthesis.
LTrim:各行の先頭のスペースとタブをすべて削除する。デフォルトの "スマート"な振る舞いのため、これは通常不要である。
LTrim0(LTrimの後に0が続く):行頭のスペースとタブの省略をオフにする。
RTrim0(RTrimの後に0が続く):行末のスペースとタブの省略をオフにする。
Comments(または Comment または Com または C):継続セクション内でのセミコロン・コメントを許可する(ただし/*..*/
は不可)。そのようなコメントは(その左にあるスペースやタブとともに)、リテラルテキストとして扱われるのではなく、結合結果から完全に省略される。各コメントは、行の右側に表示することも、それ自体で改行することもできる。
`(アクセント):各バックティック文字をエスケープ文字としてではなく、文字通りに扱う。また、`r
や`t
のような明示的に指定されたエスケープシーケンスも変換されなくなる。
( または ):最初の開始括弧の右側に開始括弧または閉じ括弧がある場合(Joinオプションのパラメータを除く)、その行は継続セクションの開始ではなく、式として再解釈される。これにより、(x.y)[z]()
のような式を行頭で使用できるようになり、また、複数行の式を ((
や(MyFunc(
のように行で始めることもできる。
`n(改行)や `t(タブ)などのエスケープシーケンスは、アクセント(`)オプションが指定されている場合を除き、継続セクションの内部でサポートされています。
commentオプションがない場合、セミコロンと/*..*/コメントは、リテラルテキストとみなされるため、継続セクションの内部ではサポートされない。ただし、セクションの最下行と最上行にコメントを入れることができる。事例:
FileAppend " ; Comment. ; Comment. ( LTrim Join ; Comment. ; This is not a comment; it is literal. Include the word Comments in the line above to make it a comment. )", "C:\File.txt" ; Comment.
上記の結果、セミコロンを継続セクション内でエスケープする必要はない。
閉じ括弧は継続セクションの終わりを示すので、リテラルな閉じ括弧で行を開始するには、その前にアクセント記号/バックチックを付ける:`)
。ただし、アクセント(`)オプションとの併用はできない。
継続セクションの直後に、別の継続セクションの開括弧を含む行を続けることができる。これにより、1つのラインを構築する過程で、上記のオプションを変化させることができる。
Includeによる継続セクションの断片的な構築はサポートされていない。
ライブラリフォルダは、#Includeによって他のスクリプトが利用する共有スクリプトを保管するための、いくつかの標準的な場所を提供する。ライブラリ・スクリプトには通常、このように使用・再利用されるように設計された関数やクラスが含まれている。ライブラリスクリプトをこれらの場所のいずれかに置くと、他の人と共有でき、複数のセットアップで動作するスクリプトを簡単に書くことができます。図書館の場所は以下の通り:
A_ScriptDir "\Lib\" ; Local library. A_MyDocuments "\AutoHotkey\Lib\" ; User library. "directory-of-the-currently-running-AutoHotkey.exe\Lib\" ; Standard library.
ライブラリフォルダは上記の順序で検索されます。
例えば、スクリプトに#Include <MyLib>
という行が含まれていると、プログラムはローカル・ ライブラリから「MyLib.ahk」という名前のファイルを探す。そこで見つからなければ、ユーザー・ライブラリーを探し、次に標準ライブラリーを探す。それでも一致するものが見つからず、ライブラリ名にアンダースコア(例:MyPrefix_MyFunc
)が含まれている場合、プログラムは接頭辞(例:MyPrefix.ahk
)だけで再度検索を行います。
通常、ライブラリ・ファイルには、ファイル名と同じ名前の関数やクラスが1つだけ含まれるのが通例だが、そのファイルによってのみ呼び出されるプライベート関数が含まれることもある。しかし、このような関数は、グローバル名前空間に存在するため、かなり明確な名前を持つ必要がある。
A script compiler (courtesy of fincs, with additions by TAC109) is available as a separate automatic download.
つまり、スクリプトを実行するためにAutoHotkey.exeは必要ありません。コンパイル・プロセスは、以下を含む実行可能ファイルを作成する:AutoHotkeyインタープリタ、スクリプト、スクリプトに含まれるファイル、FileInstall関数で取り込んだファイル。コンパイラのディレクティブを使って、追加ファイルをインクルードすることができる。
v1.1とv2のスクリプトには同じコンパイラが使用される。コンパイラーは、提供されたベースファイルのメジャーバージョンをチェックすることで、スクリプトのバージョンを区別する。
Ahk2Exeは次のような使い方ができます:
GUIインターフェース:スタートメニューの「.ahkを.exeに変換」を実行します。(GUIを起動した後、ウィンドウが表示されるまで一時停止することがある。詳細は背景情報を参照。)
右クリックします:開いているエクスプローラウィンドウで、任意の.ahkファイルを右クリックし、"Compile Script"を選択します(AutoHotkeyのインストール時にスクリプトコンパイラオプションが選択されている場合のみ使用可能)。これにより、スクリプトと同じベースファイル名のEXEファイルが作成され、しばらくすると同じディレクトリに現れる。注:EXEファイルは、上記の方法#1で最後に保存したものと同じカスタムアイコン、.binファイル、圧縮設定、またはスクリプト内の関連するコンパイラディレクティブで指定されたものを使用して作成されます。
コマンドライン:コンパイラーは、以下に示すパラメーターを使用してコマンドラインから実行することができる。コマンドラインパラメーターが使われた場合、/gui
が使われない限り、スクリプトは直ちにコンパイルされる。/gui
または/in
パラメータが1つなければならないことを除いて、すべてのパラメータはオプションである。
パラメータペア | 意味 |
---|---|
/in script_name | コンパイルするスクリプトのパスと名前。これは、/gui が使用されていない限り、他のパラメータが使用されている場合は必須である。 |
/out exe_name | 作成される出力.exeのパス名。デフォルトは、入力ファイルのディレクトリベース名と拡張子.exe、またはスクリプト内の関連するコンパイラディレクティブである。 |
/icon icon_name | 使用するアイコンファイル。デフォルトは、GUIインターフェイスに最後に保存されたアイコンか、スクリプトのSetMainIconコンパイラディレクティブです。 |
/base file_name | 使用するベースファイル(.binまたは.exeファイル)。使用するベースファイルのメジャーバージョンは、コンパイルするスクリプトのバージョンと同じでなければならない。デフォルトは、GUIインターフェイスで最後に保存されたベースファイル名、またはスクリプト内の任意のBaseコンパイラディレクティブです。 |
/resourceid name | .exe ベースファイルを使用するコンパイルのメインスクリプトに使用する非標準のリソース ID を割り当てます(「埋め込みスクリプト」を参照)。数値リソースIDは、ハッシュ記号(#)に続く10進数で構成されなければならない。デフォルトは#1、またはスクリプト中のResourceIDコンパイラディレクティブ。 |
/cp codepage | スクリプトファイルの読み込みに使われるデフォルトのコードページを上書きする。取り得る値のリストについては、コードページ識別子を参照のこと。Unicodeスクリプトはバイトオーダーマーク(BOM)で始まるべきであるので、このパラメータの使用は不要であることに注意してください。 |
/compress n | Compress the exe?0 = no, 1 = use MPRESS if present, 2 = use UPX if present. デフォルトは、GUI インターフェースで最後に保存された設定です。 |
/gui | すぐにコンパイルする代わりにGUIを表示する。その他のパラメーターは、GUIで最後に保存した設定を上書きするために使用できる。/in is optional in this case. |
/silent [verbose] | すべてのメッセージ・ボックスを無効にし、代わりに標準エラー・ストリーム(stderr)にエラーを出力する。stderrが失敗した場合は、標準出力ストリーム(stdout)にエラーを出力する。その他のメッセージも標準出力に出力される。オプションでverbose と入力すると、ステータス・メッセージを標準出力にも出力する。 |
非推奨: /ahk file_name |
スクリプトのコンパイル時にユーティリティとして使用するAutoHotkey.exeのパス名。 |
非推奨: /mpress 0or1 |
MPRESSでexeを圧縮しますか?0 = no, 1 = yes. デフォルトは、GUI インターフェースで最後に使用された設定です。 |
非推奨: /bin file_name |
使用する .bin ファイル。デフォルトは、GUIインターフェイスで最後に保存された.binファイル名です。 |
事例:
Ahk2Exe.exe /in "MyScript.ahk" /icon "MyIcon.ico"
注:
コンパイラーのソースコードと新しいバージョンはGitHubで見ることができる。
コンパイルされた各スクリプト.exeは、インタプリタを実装した実行ファイルをベースにしている。Compilerディレクトリに含まれる基本ファイルの拡張子は".bin "である。これらは、外部スクリプトファイルを読み込む機能を含まないバージョンのインタープリターである。代わりに、プログラムは">AUTOHOTKEY SCRIPT<"という名前のWin32 (RCDATA)リソースを探し、それをロードするか、見つからなければ失敗する。
標準のAutoHotkey実行ファイルは、ID 1のWin32 (RCDATA)リソースを埋め込むことで、コンパイル済みスクリプトのベースとして使用することもできます。(追加のスクリプトはAddResourceコンパイラディレクティブで追加できます。) これにより、コンパイルされたスクリプト.exeを/scriptスイッチで使用し、メインの埋め込みスクリプト以外のスクリプトを実行することができます。詳しくは埋め込みスクリプトをご覧ください。
スクリプトコンパイラディレクティブは、スクリプトのコンパイル方法の詳細を指定します。いくつかの特徴を挙げよう:
詳しくはスクリプト・コンパイラ・ディレクティブを参照してください。
Ahk2Exeはコンパイルされたスクリプトを圧縮するためにMPRESSまたはUPXフリーウェアをオプションで使用します。MPRESS.exeおよび/またはUPX.exeがAutoHotkeyがインストールされた "Compiler"サブフォルダにコピーされている場合、/compress
パラメータまたはGUI設定の指示に従い、どちらかを使用して.exeを圧縮することができます。
MPRESS公式サイト(ダウンロードと情報):http://www.matcode.com/mpress.htm
MPRESS mirror: https://www.autohotkey.com/mpress/
UPX公式サイト(ダウンロードと情報):https://upx.github.io/
注:スクリプトの実行ファイルを圧縮すると、メモ帳のようなプレーンテキストエディタやPEリソースエディタを使って、スクリプトのソースコードを気軽に閲覧することができなくなりますが、そのような目的に特化したツールによってソースコードが抽出されることは防げません。
以下のフォルダ構成がサポートされており、実行バージョンのAhk2Exe.exe
は、以下に示す1つ目の \compilerディレクトリにあります:
\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
ベースファイル検索アルゴリズムは、Ahk2Exeの起動時に短時間実行され、以下のように動作します:
修飾されたAutoHotkeyの.exeファイルとすべての.binファイルは、コンパイラのディレクトリ、コンパイラの親ディレクトリ、およびAutoHotkey
またはV
で始まり、AutoHotkey_H
で始まらないディレクトリ名を持つコンパイラの兄弟ディレクトリで検索されます。選択されたディレクトリは再帰的に検索される。検出されたAutoHotkey.exeファイルは除外され、AutoHotkeyA32.exe、AutoHotkey64.exeなどのファイルと、検出されたすべての.binファイルが残ります。含まれるすべての.exeファイルは、AutoHotkey
で始まる名前と、AutoHotkey
という単語を含むファイル説明が必要で、バージョンは1.1.34+
または2.0-a135+
でなければなりません。
コンパイルを成功させるには、AutoHotkeyインタプリタのバージョンも(ユーティリティとして)必要で、同様のアルゴリズムで選択されます。ほとんどの場合、使用されるインタープリターのバージョンは、ユーザーがコンパイル用に選択したベースファイルのバージョンと一致する。
スクリプトはコマンドラインパラメーターをサポートする。形式:
AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]
また、コンパイルされたスクリプトの場合、フォーマットは次のようになる:
CompiledScript.exe [Switches] [Script Parameters]
Switches:以下のうち0個以上:
Switch | 意味 | Works compiled? |
---|---|---|
/force | 無条件に起動し、警告ダイアログをスキップする。これは#SingleInstance Offと同じ効果を持つ。 | はい |
/restart | スクリプトが再起動され、スクリプトの以前のインスタンスを閉じようとしていることを示す(これは、内部的にReload関数でも使用される)。 | はい |
/ErrorStdOut /ErrorStdOut=Encoding |
スクリプトの起動を妨げる構文エラーを、ダイアログを表示するのではなく、標準エラーストリーム(stderr)に送る。詳細は#ErrorStdOutを参照。 オプションでエンコーディングを指定することもできる。例えば、 |
いいえ |
/Debug | デバッグ・クライアントに接続する。詳細はインタラクティブ・デバッグを参照。 | いいえ |
/CPn |
スクリプトファイルの読み込みに使われるデフォルトのコードページを上書きする。詳細はスクリプトファイルのコードページを参照。 |
いいえ |
/Validate |
AutoHotkeyはスクリプトをロードし、実行せずに終了します。 デフォルトでは、ロードタイムエラーと警告は通常通り表示される。ErrorStdOutスイッチを使用すると、エラーメッセージを抑止またはキャプチャすることができる。 プロセスの終了コードは、スクリプトのロードに成功した場合は0、エラーが発生した場合は0以外となる。 |
いいえ |
/iLib "OutFile" |
Deprecated: Equivalent to /validate; use that instead. "OutFile" must be specified but is ignored. 以前のバージョンのAutoHotkeyでは、自動インクルードされたファイルのファイル名は、#Includeディレクティブとしてフォーマットされ、OutFileで指定されたファイルに書き込まれました。 |
いいえ |
/include "IncFile" |
メインスクリプトの前にファイルを含む。このメソッドでインクルードできるファイルは1つだけです。スクリプトがリロードされると、このスイッチは自動的に新しいインスタンスに渡される。 |
いいえ |
/script |
.exeファイルに基づいてコンパイルされたスクリプトで使用する場合、このスイッチは、プログラムがメインの埋め込みスクリプトを無視するようにします。これにより、コンパイルされたスクリプト.exeは、メインスクリプト以外の外部スクリプトファイルや埋め込みスクリプトを実行できるようになる。コンパイル済みスクリプトでは通常サポートされていないその他のスイッチも使用できるが、このスイッチの右側に記載する必要がある。事例: CompiledScript.exe /script /ErrorStdOut MyScript.ahk "Script's arg 1" 現在の実行ファイルにスクリプトが埋め込まれていない場合、このスイッチは許可されるが、何の効果もない。 このスイッチは、.binファイルに基づいてコンパイルされたスクリプトではサポートされていません。 See also: Base Executable File (Ahk2Exe) |
該当なし |
スクリプトファイル名: スクリプトパラメータがない場合は省略可能。省略した場合は、AutoHotkey実行ファイルのパスと名前がデフォルトになり、".exe"は".ahk"に置き換えられます。たとえば、AutoHotkey.exeの名前をMyScript.exeに変更すると、MyScript.ahkをロードしようとします。パラメータなしでAutoHotkey32.exeを実行すると、AutoHotkey32.ahkをロードしようとします。
ファイル名にアスタリスク(*)を指定すると、スクリプトのテキストを標準入力(stdin)から読み込む。これによって、以下のことも有効になる:
例についてはExecScript()を参照。
現在の実行ファイルにスクリプトが埋め込まれている場合、このパラメータには、アスタリスクの後に埋め込みスクリプトのリソース名またはIDを付けることができる。コンパイル済みスクリプトの場合(つまり、ID #1の埋め込みスクリプトが存在する場合)、このパラメータの前に/script
スイッチを付ける必要があります。
スクリプトのパラメータ:スクリプトに渡す文字列を、空白で区切って指定します。スペースを含むパラメータは引用符で囲む。空文字列をパラメータとして渡したい場合は、連続する2つの引用符を指定する。リテラル引用符は、その前にバックスラッシュ( \")を付けることで渡すことができる。その結果、引用符で囲まれたパラメータ("C:\My Documents\"など)の末尾のスラッシュは、リテラル引用符として扱われます(つまり、スクリプトは "C:\My Documents"という文字列を受け取ります)。このような引用符を削除するには、A_Args[1] := StrReplace(A_Args[1], '"')
を使用する。
入力パラメータがある場合は、組み込み変数A_Argsに配列として格納され、配列構文を使ってアクセスできる。A_Args[1]
は最初のパラメーターを含む。以下の例では、渡されるパラメーターが少なすぎる場合にスクリプトを終了している:
if A_Args.Length < 3 { MsgBox "This script requires at least 3 parameters but it only received " A_Args.Length "." ExitApp }
スクリプトに渡されるパラメータの数がさまざまな場合(おそらく、ユーザーが一連のファイルをスクリプトにドラッグ&ドロップしたため)、次の例を使用して、パラメータを1つずつ抽出することができます:
for n, param in A_Args ; 各パラメータ: { MsgBox "Parameter number " n " is " param "." }
パラメータがファイル名の場合、以下の例を使用すると、完全/絶対パスを含め、(ファイルシステムに保存されている)大文字/小文字を補正した長い名前に変換することができる:
for n, GivenPath in A_Args ; 各パラメータ(またはスクリプトにドロップされたファイル): { Loop Files, GivenPath, "FD" ; ファイルやディレクトリをインクルードします。 LongPath := A_LoopFileFullPath MsgBox "The case-corrected long path name of file`n" GivenPath "`nis:`n" LongPath }
ASCII以外の文字をファイルから正しく読み取るには、ファイルが保存されたときに使用されたエンコーディング(通常はテキストエディタ)と、AutoHotkeyがファイルを読み取るときに使用するエンコーディングが一致している必要があります。一致しない場合、文字は正しくデコードされない。AutoHotkeyは以下のルールを使用して、使用するエンコーディングを決定します:
これは、AutoHotkeyによってロードされたスクリプトファイルにのみ適用され、スクリプト自体のファイルI/Oには適用されないことに注意してください。FileEncodingは、スクリプトが読み書きするファイルのデフォルトエンコーディングを制御し、IniReadと IniWriteは常にUTF-16またはANSIで処理する。
すべてのテキストは(必要に応じて)ネイティブの文字列形式に変換されるため、無効な文字やネイティブのコードページに存在しない文字はプレースホルダーに置き換えられます:'�'。これは、スクリプトファイルにエンコーディングエラーがあるか、ファイルの保存と読み込みに使用されたコードページが一致しない場合にのみ発生するはずです。
RegWriteは、エクスプローラーから起動したスクリプトのデフォルトを設定するために使用することができる(ファイルをダブルクリックするなど):
; Uncomment the appropriate line below or leave them all commented to ; reset to the default of the current build. Modify as necessary: ; codepage := 0 ; System default ANSI codepage ; codepage := 65001 ; UTF-8 ; codepage := 1200 ; UTF-16 ; codepage := 1252 ; ANSI Latin 1; Western European (Windows) if (codepage != "") codepage := " /CP" . codepage cmd := Format('"{1}"{2} "%1" %*', A_AhkPath, codepage) key := "AutoHotkeyScript\Shell\Open\Command" if A_IsAdmin ; Set for all users. RegWrite cmd, "REG_SZ", "HKCR\" key else ; Set for current user only. RegWrite cmd, "REG_SZ", "HKCU\Software\Classes\" key
これは、AutoHotkeyがすでにインストールされていることを前提としています。そうでない場合、結果は理想的とは言えないかもしれない。
ListVarsや Pauseなどの組み込み関数は、スクリプトのデバッグに役立ちます。たとえば、次の2行を注意深く選んだ位置に一時的に挿入すると、スクリプトに「ブレークポイント」ができる:
ListVars Pause
スクリプトがこの2行に出会うと、すべての変数の現在の内容が表示され、閲覧できるようになる。再開の準備ができたら、ファイルメニューまたはトレイメニューからスクリプトの一時停止を解除する。スクリプトは、次の「ブレークポイント」に達するまで続けられる(もしあれば)。
一般的に、これらの「ブレークポイント」は、WinActivate関数の直前など、スクリプトにとってアクティブウィンドウが重要でない位置に挿入するのがベストである。これにより、一時停止を解除したときにスクリプトが適切に動作を再開する。
以下の関数もデバッグに役立つ:ListLines、KeyHistory、OutputDebug。
タイプミスや「グローバル」宣言の欠落など、よくあるエラーのいくつかは、警告を有効にすることで検出できる。
サポートされているDBGpクライアントがあれば、インタラクティブなデバッグが可能です。通常、以下のようなアクションが可能である:
この機能は、BINファイルに基づいてコンパイルされたスクリプトには無効であることに注意してください。EXEファイルに基づいてコンパイルされたスクリプトの場合、/scriptの後に/debugを指定する必要があります。
対話型デバッグを有効にするには、まずサポートされているデバッガークライアントを起動し、/Debugコマンドラインスイッチを使用してスクリプトを起動します。
AutoHotkey.exe /Debug[=SERVER:PORT] ...
SERVERと PORTは省略できる。例えば、以下は同等である:
AutoHotkey /Debug "myscript.ahk" AutoHotkey /Debug=localhost:9000 "myscript.ahk"
すでに実行中のスクリプトにデバッガーをアタッチするには、以下のようにメッセージを送る:
ScriptPath := "" ; SET THIS TO THE FULL PATH OF THE SCRIPT A_DetectHiddenWindows := true if WinExist(ScriptPath " ahk_class AutoHotkey") ; Optional parameters: ; wParam = the IPv4 address of the debugger client, as a 32-bit integer. ; lParam = the port which the debugger client is listening on. PostMessage DllCall("RegisterWindowMessage", "Str", "AHK_ATTACH_DEBUGGER")
デバッガークライアントが接続されたら、"detach" DBGp コマンドを送信することで、スクリプトを終了せずにデタッチすることができる。
便利なスクリプトはこちらのページを参照。