スクリプト・コンパイラ・ディレクティブ

目次

はじめに

スクリプトコンパイラディレクティブにより、Ahk2Exeで、どのようにスクリプトをコンパイルするかの詳細を指定することができます。いくつかの特徴を挙げよう:

スクリプトコンパイラは、ソーススクリプト内の特別なコメントを探し、コンパイラディレクティブとして認識します。すべてのコンパイラディレクティブは@Ahk2Exe-という文字列で始まり、その前にコメントフラグ (通常は;) が付きます。

スクリプトの動作を制御するディレクティブ

ディレクティブで囲むことによって、コンパイルされたスクリプトからコードセクションを削除することができる:

MsgBox "This message appears in both the compiled and uncompiled script"
;@Ahk2Exe-IgnoreBegin
MsgBox "This message does NOT appear in the compiled script"
;@Ahk2Exe-IgnoreEnd
MsgBox "This message appears in both the compiled and uncompiled script"

その逆も可能である。つまり、コンパイルされたスクリプトでのみ実行されるコードセクションをマークするのである:

/*@Ahk2Exe-Keep
MsgBox "This message appears only in the compiled script"
*/
MsgBox "This message appears in both the compiled and uncompiled script"

これはA_IsCompiledよりも利点がある。なぜなら、前処理中にコンパイルされたスクリプトからコードが完全に取り除かれるため、コンパイルされたスクリプトが小さくなるからだ。逆もまた然りである:このコードは、コンパイルされていないスクリプトのコメント・ブロック内にあるので、A_IsCompiledをチェックする必要はない。

実行メタデータを制御するディレクティブ

はじめに

これらのディレクティブのパラメータでは、以下のエスケープシーケンスがサポートされています:``, `,, `n, `r and `t. カンマは、パラメータの位置に関係なく、にエスケープする必要がある。「整数」とは、符号なし16ビット整数(0~0xFFFF)を指す。

必要であれば、ディレクティブパラメータは、変数名を%記号で囲むことによって、以下の標準組み込み変数のリストを参照することができます:

Group 1: A_AhkPath, A_AppData, A_AppDataCommon, A_ComputerName, A_ComSpec, A_Desktop, A_DesktopCommon, A_MyDocuments, A_ProgramFiles, A_Programs, A_ProgramsCommon, A_ScriptDir, A_ScriptFullPath, A_ScriptName, A_Space, A_StartMenu, A_StartMenuCommon, A_Startup, A_StartupCommon, A_Tab, A_Temp, A_UserName, A_WinDir.

Group 2: A_AhkVersion, A_IsCompiled, A_PtrSize.

これらの変数名に加えて、特殊変数A_WorkFileNameは、処理された.exeファイルの一時的な名前を保持する。これは、生成された .exe にアクセスする必要のあるPostExecディレクティブのパラメータとしてファイル名を渡すために使われます。

さらに、特別な変数A_BasePathは、選択されたベースファイルのフルパスと名前を含んでいる。

また、特殊変数A_PriorLineには、現在のコンパイラ指令の直前のソース行が格納される。空白やコメントだけの行は無視され、コンパイラ指令の行も無視される。この変数は、スクリプトのソースから定数情報を「抜き取り」、後のコンパイラのディレクティブで使用するために使うことができる。例えば、頻繁に変更される可能性のあるスクリプトのバージョン番号にアクセスするような場合である。この方法でバージョン番号にアクセスするということは、バージョン番号をソースコードの中で一度だけ変更すればよく、その変更は必要なディレクティブにコピーされるということです。(詳細は以下のRegExの例を参照)。

また、以下に説明するLetディレクティブとObeyディレクティブを使用して、特別なユーザー変数をU_Name形式で作成することもできます。

すべての変数は、AddResourceディレクティブのパラメータとして利用できるだけでなく、以下のAddResourceディレクティブに与えられたRT_MENU、RT_DIALOG、RT_STRING、RT_ACCELERATORS、RT_HTML、RT_MANIFESTファイルからアクセスすることができます。

必要であれば、上記の変数から返される値は、組み込み変数名の末尾の%より前に、チルダ~で区切られた2つまでのパラメータ(p2とp3と呼ばれる)を含めることで操作できる。p2 と p3 パラメータは、RegExReplace関数の 2 番目と 3 番目のパラメータでリテラルとして使用され、返される値を操作します。(RegExクイックリファレンス参照。) p3はオプションであることに注意。

p2またはp3にチルダをデータとして含めるには、チルダの前にバックチック、すなわち`~を付ける。バックティック文字をp2またはp3のデータとして含めるには、それをダブルにする``

RegEx の例:

その他の例:ダウンロードして調べることができる他の実例は、ここから入手できる。

AddResource

コンパイル済みの実行ファイルにリソースを追加する。(以下のUseResourceLangも参照)。

;@Ahk2Exe-AddResource FileName , ResourceName
FileName
追加するリソースのファイル名。絶対パスが指定されていない場合、ファイルはスクリプト自身のディレクトリにある(または相対的な)ものとみなされます。リソースのタイプ(整数または文字列)を明示的に指定するには、その前にアスタリスクを付ける:*type Filename. 省略された場合、Ahk2Exeはファイルの拡張子によって自動的にタイプを検出します。
リソース名
(オプション)リソースの名前 (文字列または整数)。省略された場合、デフォルトは大文字のファイル名(パスなし)である。

以下は、一般的な標準リソースタイプと、それをデフォルトでトリガーするエクステンションのリストです。

例1:メインアイコン以外の)標準アイコンを置き換える場合:

;@Ahk2Exe-AddResource Icon1.ico, 160  ; Replaces 'H on blue'
;@Ahk2Exe-AddResource Icon2.ico, 206  ; Replaces 'S on green'
;@Ahk2Exe-AddResource Icon3.ico, 207  ; Replaces 'H on red'
;@Ahk2Exe-AddResource Icon4.ico, 208  ; Replaces 'S on red'

例2:別のスクリプトを別のRCDATAリソースとして含める場合(「埋め込みスクリプト」を参照):

;@Ahk2Exe-AddResource MyScript1.ahk, #2
;@Ahk2Exe-AddResource MyScript2.ahk, MYRESOURCE

このディレクティブで追加された各スクリプトは、コンパイラによって完全かつ個別に処理され、さらにディレクティブを含めることができることに注意してください。全体として競合するディレクティブがあれば、コンパイラが最後に見つけたものが使われる。

Bin / Base

.exeファイルの生成に使用するAutoHotkeyのベースバージョンを指定します。このディレクティブは、GUIまたはCLIで指定されたベースファイルのパラメータによって上書きされる可能性があります。このディレクティブは、必要であれば何度でも指定できるが、トップレベルのスクリプトファイルでのみ指定する(つまり、#Includeファイルでは指定しない)。コンパイラは、Bin/Baseディレクティブが見つかるたびに少なくとも1回は実行されます。(このディレクティブに実際のコメントを付加する場合は、;フラグを使用しなければならない。このディレクティブを本当にコメントアウトするには、最初のコメントフラグの後にスペースを挿入する)。

;@Ahk2Exe-Bin  [Path\]Name , [Exe_path\][Name], Codepage ; Deprecated
;@Ahk2Exe-Base [Path\]Name , [Exe_path\][Name], Codepage
[Path\]Name
使用する*.binまたは*.exeファイル。拡張子が与えられない場合は、.binとみなされる。絶対パスが指定されていない場合、ファイルはコンパイラー自身のディレクトリにある(または相対的な)ものとみなされる。DOSマスクは、例えばANSI*Unicode 32*Unicode 64*、またはこれら3つすべてに*bitを指定することができる。コンパイラーは、マッチした*.binまたは*.exeファイルごとに実行される。ビルトイン変数の置換は、上記グループ1のものでなければならない。
[Exe_path\][Name]
(オプション).exeに付けるファイル名。提供された拡張子はすべて.exeに置き換えられます。パスが指定されていない場合、.exeはスクリプト・フォルダーに作成されます。名前を指定しない場合、.exeはデフォルトの名前になる。Any use of built-in variable replacements must only be from group 1 above. (This parameter can be overridden by the ExeName directive.)
Codepage
(オプション) スクリプトファイルの処理に使われるデフォルトのコードページを上書きする。(スクリプトはユニコードのバイトオーダーマーク(BOM)で始まるはずなので、このパラメータの使用は不要です)。

ConsoleApp

実行サブシステムをコンソールモードに変更する。

;@Ahk2Exe-ConsoleApp

Cont

直前のディレクティブの継続行を指定する。これにより、長い行のディレクティブをソースコード上で読みやすいように書式設定することができます。

;@Ahk2Exe-Cont Text
Text
その行が処理される前に、前の指示行に追加されるテキスト。テキストはContキーワードに続く半角スペースの後に始まる。

Debug

デバッグ用に、指定したテキストでメッセージボックスを表示する。

;@Ahk2Exe-Debug Text
Text
表示するテキスト。操作された)内容を見るには、%記号の間に特別な変数を含める。

ExeName

生成される .exe ファイルの場所と名前を指定します。(Baseディレクティブも参照してください。) このディレクティブは、GUIやCLIで指定された出力ファイルによって上書きされることがあります。

;@Ahk2Exe-ExeName [Path\][Name]
[Path\][Name]
The .exe file name. 提供された拡張子はすべて.exeに置き換えられます。パスが指定されていない場合、.exeはスクリプト・フォルダーに作成されます。名前を指定しない場合、.exeはデフォルトの名前になる。
Example:
;@Ahk2Exe-Obey U_bits, = %A_PtrSize% * 8
;@Ahk2Exe-Obey U_type, = "%A_IsUnicode%" ? "Unicode" : "ANSI"
;@Ahk2Exe-ExeName %A_ScriptName~\.[^\.]+$%_%U_type%_%U_bits%

Let

組み込み変数(上記参照)と同様に、%U_Name%でアクセスできる 1 つ以上のユーザー変数を作成(または変更)します。

;@Ahk2Exe-Let Name = Value , Name = Value, ...
名前
変数名(先頭のU_はあってもなくてもよい)。
使用する値。

Nop

何もしない。

;@Ahk2Exe-Nop Text
Text
(オプショナル)任意のテキスト 。
Example:
Ver := A_AhkVersion "" ; If quoted literal not empty, do 'SetVersion'
;@Ahk2Exe-Obey U_V, = "%A_PriorLine~U)^(.+")(.*)".*$~$2%" ? "SetVersion" : "Nop"
;@Ahk2Exe-%U_V%        %A_AhkVersion%%A_PriorLine~U)^(.+")(.*)".*$~$2%

Obey

孤立した AutoHotkey コマンドまたは式に従います。

;@Ahk2Exe-Obey Name, CmdOrExp , Extra
名前
結果を受け取る変数名(先頭のU_はあってもなくてもよい)。
CmdOrExp

従えという命令や表現。

コマンド・フォーマットでは、出力変数(多くの場合、最初のパラメーター)としてNameを使用しなければならない。

;@Ahk2Exe-Obey U_date, FormatTime U_date`, R D2 T2

の書式は=で始まる必要があります。

;@Ahk2Exe-Obey U_type, = "%A_IsUnicode%" ? "Unicode" : "ANSI"

式はコマンド形式で書くことができる。

;@Ahk2Exe-Obey U_bits, U_bits := %A_PtrSize% * 8

必要であれば、複数のコマンドや式を「n」で区切ってください。

Extra
(オプション)返す追加結果の数を指定する数値(1~9)。例えば、extra = 2の場合、結果はU_U_1<//c3>、U_2<//c5>で返される。名前の値は、まず式やコマンドによって設定されなければならない。

PostExec

コンパイルに成功した後、.exeに圧縮が適用される前(または後)に実行されるプログラムを指定します。このディレクティブは何度も指定することができ、Whenパラメータで指定された適切なキューで、コンパイラが見つけた順番に実行される。

;@Ahk2Exe-PostExec Program [parameters] , When, WorkingDir, Hidden, IgnoreErrors
プログラム [パラメーター]
実行するプログラムとパラメータ。処理された.exeファイルへのアクセスを許可するには、"%A_WorkFileName%"のように、引用符で囲まれたパラメータとして特殊変数A_WorkFileNameを指定する。プログラムが.exeを変更した場合、変更された.exeは、プログラムによって%A_WorkFileName%で指定された入力ファイルに戻される必要があります。(.exeにはバイナリデータが含まれることに注意)。
When

(オプション) 圧縮が実行される前に実行する場合は空白のままにします。そうでない場合は、以下のように圧縮後に実行する数値を設定する:

  • 0 - 圧縮が指定されていない場合にのみ実行される。
  • 1 - MPRESS 圧縮が指定されているときのみ実行される。
  • 2 - UPX圧縮が指定されている場合にのみ実行される。
WorkingDir
(オプション)プログラムの作業ディレクトリ。空白を含む場合でも、ダブルクォーテーションで囲まないでください。省略された場合は、コンパイラ(Ahk2Exe)のディレクトリが使用されます。
非表示
(オプション)1に設定すると、プログラムは隠れて起動する。
IgnoreErrors
(オプション)1に設定すると、プログラムの起動中または実行中に発生したエラーは、ユーザーに報告されない。

例1:(最初の2つの例を使うには、まずBinMod.ahkをダウンロードし、ダウンロードしたスクリプトの指示に従ってコンパイルする)

この例は、生成された.exeから "AutoHotkey"への参照を削除し、コンパイルされたAutoHotkeyスクリプトであることを偽装するために使用できます:

;@Ahk2Exe-Obey U_au, = "%A_IsUnicode%" ? 2 : 1    ; Script ANSI or Unicode?
;@Ahk2Exe-PostExec "BinMod.exe" "%A_WorkFileName%"
;@Ahk2Exe-Cont  "%U_au%2.>AUTOHOTKEY SCRIPT<. DATA              "

例 2:UPX で圧縮された .exe をUPX -dで解凍できないようにする例です:

;@Ahk2Exe-PostExec "BinMod.exe" "%A_WorkFileName%"
;@Ahk2Exe-Cont  "11.UPX." "1.UPX!.", 2

(BinMod.ahkスクリプトには他にも例がある)。

例3:この例では、CLIまたはGUIで何も指定されていない場合に、コンパイルされたスクリプトで使用する圧縮を指定します。コンパイラが通常使用するデフォルト・パラメータを示す。

For MPRESS:

;@Ahk2Exe-PostExec "MPRESS.exe" "%A_WorkFileName%" -q -x, 0,, 1

For UPX:

;@Ahk2Exe-PostExec "UPX.exe" "%A_WorkFileName%"
;@Ahk2Exe-Cont  -q --all-methods --compress-icons=0, 0,, 1

ResourceID

.exe ベースファイルを使用するコンパイルのメインスクリプトに使用する非標準のリソース ID を割り当てます (「埋め込みスクリプト」を参照)。このディレクティブは、GUIまたはCLIで指定されたリソースIDによって上書きされる。このディレクティブは、AddResourceディレクティブによって挿入されたスクリプトの中に現れると無視されます。

リソースID名前
名前
使用するリソースID。数値リソースIDは、ハッシュ記号(#)に続く10進数で構成されなければならない。

メインアイコンの設定

コンパイルに使用されるカスタム EXE アイコンを上書きします。(他のアイコンを変更するには、AddResourceの例を参照のこと。) このディレクティブは、GUIまたはCLIで指定されたアイコンファイルによって上書きされることがある。しかし、Ahk2ExeファイルメニューからWindowsアイコンの更新を選択することで、新しいアイコンを表示することができます。

;@Ahk2Exe-SetMainIcon IcoFile
IcoFile
(オプション)使用するアイコンファイル。省略された場合、デフォルトのAutoHotkeyアイコンが使用されます。

SetProp

コンパイルされた実行ファイルのバージョン情報のプロパティを変更します。すべてのプロパティは、指定された順番に関係なく、アルファベット順に処理されることに注意してください。

;@Ahk2Exe-SetProp Value
Prop

変更するプロパティの名前。以下のいずれかに該当すること。

Property 説明
CompanyName 社名を変更する。
Copyright 法的な著作権情報を変更します。
説明 ファイルの説明を変更します。Windows 8以上では、タスクマネージャの「プロセス」でスクリプトの名前も変更されます。
FileVersion ファイルのバージョンを、テキスト形式と生のバイナリ形式の両方で変更します。(詳細は下記バージョンを参照)。
InternalName 内部名称を変更する。
言語 言語コードを変更する。16進数には0xのプレフィックスが必要です。
LegalTrademarks 法定商標情報を変更する。
名前 製品名と内部名称を変更します。
OrigFilename 元のファイル名情報を変更する。
ProductName 商品名を変更します。
ProductVersion 製品バージョンを、テキスト形式と生のバイナリ形式の両方で変更します。(詳細は下記バージョンを参照)。
バージョン

ファイルのバージョンと製品のバージョンを、テキスト形式と生のバイナリ形式の両方で変更します。

Ahk2Exe はバイナリのバージョンフィールドに、バージョンテキストの先頭に表示されるピリオドで区切られた数字(最大4つ)を入力します。未記入のフィールドはゼロに設定される。たとえば、1.3-alphaなら、バイナリのバージョン番号は1.3.0.0となる。このプロパティが変更されない場合、スクリプトのコンパイルに使用されたAutoHotkeyのバージョンがデフォルトになります。

プロパティを設定する値。

Set

SetPropディレクティブでカバーされていない、 コンパイルされた実行ファイルのバージョン情報の その他の雑多なプロパティを変更する。すべてのプロパティは、指定された順番に関係なく、アルファベット順に処理されることに注意してください。本指令は特殊用途にのみ適用される。

;@Ahk2Exe-Set Prop, Value
Prop
変更するプロパティの名前。
プロパティを設定する値。

UpdateManifest

.exe のマニフェストの詳細を変更します。本指令は特殊用途にのみ適用される。

;@Ahk2Exe-UpdateManifest RequireAdmin , Name, Version, UIAccess
RequireAdmin
実行時に管理者権限を必要とする実行ファイルに変更するには1を設定する。実行時に利用可能な最高権限を要求するように実行ファイルを変更するには2を設定する。変更しない場合は0を設定する。
名前
(オプション)マニフェストに設定する名前。
バージョン
(オプション)マニフェストに設定するバージョン。
UIAccess
(オプション) マニフェストでUIAccessをtrueにするには1を設定します。

UseResourceLang

AddResourceが使用するリソース言語を変更します。このディレクティブは位置指定であり、それに続くすべてのAddResourceディレクティブに影響します。

;@Ahk2Exe-UseResourceLang LangCode
LangCode
言語コード。16進数には0xのプレフィックスが必要です。デフォルトのリソース言語はUS English (0x0409)です。