autohotkey2.0勉強中(翻訳)その4-2~スクリプト編その2~
最終更新日:2017/10/30日(整形のみ)
前回のその1はこちら
目次
はじめに
その2では、これらの事について扱っている
これらは知らなくても普通に使えるため、結構適当
一部コンテンツ記載してないけど
+ AHKのコマンドライン引数
+ スクリプトの文字コード
+ スクリプトのEXE化(コンパイル)
その1はこちら
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
スクリプト編(その2)
プログラムのコマンドライン引数
AutoHotkeyのコマンドラインの書式は以下の通り
AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]
コンパイル済みのexe(実行ファイル)については以下の通りになる
CompiledScript.exe [Switches] [Script Parameters]
以下ではそれぞれの場所に使用できるものについて書いてある
[Switches] に使用できるオプション
オプションのため、使用しなくても構わない コンパイル後でも使用できるもの、できないものがある
コンパイル後でも使えるもの
- /f(または/force):警告ダイアログを出さずに、強制的に起動
- #SingleInstance Offと同じ効果
- /r(または/restart):スクリプトを再読み込みしたいときに使用
- /ErrorStdOut:文法エラーをダイアログ表示せずに標準出力に出力する
コンパイル後では使えないもの
- /Debug:デバッグクライアントに接続する
- 詳細については、「対話型デバッグ」を参照(後ほど)
- /CP「n」:スクリプトファイルの読み取りに使用されるデフォルトの文字コードを上書きする
/iLib "Outfile" AutoHotkeyはスクリプトをロードしますが、実行せず、ライブラリ機構を介して自動的にインクルードされるスクリプトファイルごとに、OutFileで指定されたファイルに2行づつ書き込まれる
- 書き込まれる行は、次の形式で記述される
LibDirはLibフォルダのフルパスで、LibFileはライブラリのファイル名 \#Include LibDir\ \#IncludeAgain LibDir\LibFile.ahk
出力ファイルが既に存在する場合は上書きされる
- OutFileは、「"」の代わりに「*」で囲むと標準出力(stdout{standardout})にできる
- 詳細は「標準出力」を参照(後ほど)
- スクリプトに構文エラーが含まれていると、出力ファイルが空になることがある
- プロセス終了コードを使用してこの状態を検出できる
- 構文エラーがある場合、終了コードは2になる
- /ErrorStdOutスイッチ(↑のやつ)を使用すると、エラーメッセージを抑制またはキャプチャできる
[Script Filename] に使用できるオプション
- [Script Filename] は引数がない場合は省略可能
- [Script Filename] を省略した場合(スタートメニューから直接AutoHotkeyを実行する場合など)は、「~.ahk」の名前のファイル(詳細は後述)を以下の順で検索する
1.AutoHotkey実行可能ファイルを含むディレクトリ 2.現在のユーザーのドキュメントフォルダの順番で検索される
- ファイルが存在しない場合、デフォルトのファイルを作成するかをたずねるダイアログが出る
- スクリプトに引数を渡したい場合は省略できない
- また、検索するファイル名(上記の「~.ahk」)は、スクリプトを実行するために使用される実行ファイルの名前によって異なる
- AutoHotkey.exeの名前をMyScript.exeに変更すると、MyScript.ahkが検索される
引数なしで*AutoHotkeyU64*.exeを実行すると、*AutoHotkeyU64*.ahkが検索される
[Script Parameters] に使用できるオプション
- [Script Parameters] には任意の数の文字列をスペース区切りで渡せる
- 文字列スペースを含みたい場合は「"」で囲む
- 渡された引数は、組み込み変数「A_Args」に配列に格納され、配列構文を使用して参照できる
- 「A_Args [0]」には引数の数が格納されるらしい
- スクリプトに渡される引数の数がわからない場合(一連のファイルをスクリプトにドラッグアンドドロップした時など)、次の例を使用してそれらを1つずつ抽出できる
ex:
for n, param in A_Args ; For each parameter: { MsgBox "Parameter number " n " is " param "." }
- 引数がファイル名である場合、次の例を使用して、ファイルシステムに格納されている大文字と小文字を区別した長い名前に変換できる(完全/完全パスを含む)
ex:
for n, GivenPath in A_Args ; For each parameter (or file dropped onto a script): { Loop Files, GivenPath, "FD" ; Include files and directories. LongPath := A_LoopFileFullPath MsgBox "The case-corrected long path name of file`n" GivenPath "`nis:`n" LongPath }
- なお、スクリプト自身のパスを取得するには「A_ScriptFullPath」変数を使用する
- 既知の制限:ファイルを.ahkスクリプトにドラッグすると、NTFSファイルシステムで8.3の名前が無効になっていると正常に動作しなくなる可能性があるらしい
スクリプトファイルの文字コード
スクリプトファイルに含まれる文字は、ファイルのロードに使用される文字コードによって制限される
まあ大体UTF-8で書くだろうからあんま気にしなくていいんじゃないかな
ボム付きにすれば基本的に問題ないんじゃない?
ファイルがUTF-8またはUTF-16(LE)バイト順序マークで始まる場合、適切な文字コードが使用され、/CP「n」スイッチ(コマンドライン引数のswitchオプションの/CPnのこと前述済み)は無視される
/CP「n」スイッチがコマンドラインで渡されると、文字コード「n」が使用される
有効な文字コード識別子の数値一覧については、「MSDN」を参照(後ほど)
それ以外の場合は、システムのデフォルトの「ANSI」が使用される
これは、AutoHotkeyで読み込まれたスクリプトファイルにのみ適用され、スクリプト自体の中でI/Oファイルには適用されないことに注意
FileEncodingは、スクリプトによって読み書きされるファイルのデフォルトのエンコーディングを制御する
IniReadおよびIniWriteは常にUTF-16またはANSIを処理する
すべてのテキストが(必要な場合)ネイティブの文字列形式に変換されるため、無効またはネイティブコードページに存在しない文字は、プレースホルダ' 'に置き換えられる
これは、スクリプトファイルにエンコーディングエラーがある場合、またはファイルの保存とロードに使用されたコードページが一致しない場合にのみ発生する
RegWriteを使用して、エクスプローラから起動されたスクリプトのデフォルトを設定することができる(ファイルをダブルクリックするなど)
ex:HELPそのまま、autohotkeyがインストールされている前提
; 下の行のコメントを外すか、コメントにすべてコメントしておく ; 現在のビルドのデフォルトにリセットするなど、必要に応じて変更する ; ↑のコメント二つ適当に訳した ; codepage := 0 ; システムデフォルトのANSI ; codepage := 65001 ; UTF-8 ; codepage := 1200 ; UTF-16 ; codepage := 1252 ; ANSI ラテン語 1; 西ヨーロッパ(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
スクリプトのEXE(実行ファイル)化
方法
- ahk2exe.exeを使うことで、スクリプトを実行ファイル化することが可能
- 最新のahk2にはコンパイラが同封しているみたい使用方法はたぶんそのままで大丈夫だと思う
Ahk2Exeは、以下の三つの方法で使用できる
1.GUIインターフェイス:スタートメニューの「.ahkから.exeへの変換」を実行
2.右クリック:開いているエクスプローラウィンドウ内で任意の.ahkファイルを右クリックし、[スクリプトのコンパイル]を選択(AutoHotkeyのインストール時にスクリプトコンパイラオプションが選択されている場合のみ使用可能)これにより、スクリプトと同じ基本ファイル名のEXEファイルが作成される
このファイルは、同じディレクトリに短時間で表示される
注:EXEファイルは、同じカスタムアイコン、.binファイルを使用して作成され、上記の方法1で最後に使用されたMPRESS設定を使用される
Ahk2Exe.exe / in MyScript.ahk [/ out MyScript.exe] [/ icon MyIcon.ico] [/ bin AutoHotkeySC.bin] [/ mpress 0or1]
スペースを含む引数は二重引用符で囲む必要がある
"out"項目を省略すると、EXEはスクリプト自体と同じベースファイル名を持つようになる
ex)Ahk2Exe.exe /in "MyScript.ahk" /icon "MyIcon.ico"
- 引数がAhk2Exeに渡されると、コンパイルプロセスの成功または失敗を示すメッセージがstdoutに書き込まれる。メッセージはコマンドプロンプトに表示されないが、出力をファイルにリダイレクトするなどの手段で「キャッチ」できる
- さらに、エラーの場合、Ahk2Exeには、発生したエラーの種類を示す終了コードがあり、これらのエラーコードはGitHub(ErrorCodes.md)にあるってさ
- リソースハッカー(フリーウェア)などのユーティリティを使用して"AutoHotkeySC.bin"ファイルを編集することで、コンパイル済みのスクリプトにバージョン情報(エクスプローラのファイルプロパティダイアログに表示されるやつ)を編集(追加)できる
- このファイルはAutoHotkeyがインストールされた "コンパイラ"サブフォルダに含まれている
- また、Compile_AHK IIを使うとこのプロセスを容易にできる
コンパイルされたスクリプトを圧縮するには
- Ahk2Exeはオプションで、コンパイルされたスクリプトを圧縮するためにMPRESS(MATCODEソフトウェアのフリーウェア)を使用する
- mpress.exeがAutoHotkeyがインストールされた "コンパイラ"サブフォルダに存在する場合、/ mpress 0またはGUI設定によって無効にされない限り、自動的に使用される
- オフィシャルウェブサイト(2016年3月オフライン):http://www.matcode.com/mpress.htm
- ミラーサイト(ダウンロードと情報):https://autohotkey.com/mpress/
Tips
- コンパイルされたスクリプトでは通常、タスクトレイメニューからメインウィンドウを表示することは出来ない
- #NoTrayIconコマンドと "Menu、Tray、ShowMainWindow"コマンドは、コンパイルされたスクリプトの動作に影響する
- 「Menu,TRAY,MainWindow」でメインウィンドウを表示可能にできる
- スクリプト側が、コンパイルされた状態で実行されているかどうかを知るには、「A_IsCompiled」変数を使用する、「1」ならコンパイルされている(それ以外は「0」)
- 逆コンパイラも公開されているが、パスワードで暗号化すれば逆コンパイルを防げる
- 作成した実行ファイルの配布は自由
- 実行可能ファイルを圧縮すると、メモ帳やPEリソースエディタなどのプレーンテキストエディタを使用してスクリプトのソースコードを簡単に検査することはできませんが、その目的専用のツールでソースコードを抽出することができなくなる