のら(NORA)のブログ

主にソフトについて備忘録で(手抜き)書いているのです!ご自由に観覧しやがれ、です。

autohotkey2.0勉強中(翻訳)その4-2(スクリプト編その2)

スクリプト編(その2)

その1はこちら

現在修正中

プログラムのコマンドライン引数

AutoHotkeyコマンドラインの書式は以下の通り
* AutoHotkey.exe [Switches] [Script Filename] [Script Parameters] * CompiledScript.exe [Switches] [Script Parameters]

[Switches] には以下のものを指定もしくは入力なし

コンパイル後でも使えるもの

  • /f(または/force):警告ダイアログを出さずに、強制的に起動
    • #SingleInstance Offと同じ効果
  • /r(または/restart):スクリプトを再読み込みしたいときに使用
  • /ErrorStdOut:文法エラーをダイアログ表示せずに標準出力に出力する
    • 詳細については「#ErrorStdOut」を参照(後ほど)
    • これを/iLibと組み合わせて、スクリプトを実行せずに検証することができる コンパイル後では使えないもの
  • /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] には任意の数の文字列をスペース区切りで渡せる
  • 文字列スペースを含みたい場合は「"」で囲む
    • 引用符で囲まれた引数(「"C:\ My Documents \“」など)のバックスラッシュは、リテラルの引用符として扱われる(つまり、スクリプトは「"C:\ My Documents"」という文字列を受け取る)
    • この引用符を削除するには、A_Args [1] := StrReplace(A_Args [1]、 “”)とすればいい
  • 渡された引数は、組み込み変数「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, param in A_Args  ; For each parameter:
{
    MsgBox, Parameter number %n% is %param%.
}

スクリプトファイルの文字コード

スクリプトファイルに含まれる文字は、ファイルのロードに使用される文字コードによって制限される

  • ファイルがUTF-8またはUTF-16(LE)バイト順序マークで始まる場合、適切な文字コードが使用され、/CP「n」スイッチ(コマンドライン引数のswitchオプションの/CPnのこと前述済み)は無視される
  • /CP「n」スイッチがコマンドラインで渡されると、文字コード「n」が使用される
    • 有効な文字コード識別子の数値一覧については、「MSDN」を参照(後ほど)
  • それ以外の場合は、システムのデフォルトの「ANSI」が使用される
    • まあ大体UTF-8で書くだろうからあんま気にしなくていいんじゃないかな
    • ボム付きにすれば基本的に問題ない
  • これは、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 := \\'\\"%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%

スクリプトのEXE(実行ファイル)化

方法

  • ahk2exe.exeを使うことで、スクリプトを実行ファイル化することが可能
  • ahk1には同封されていたが2はないので別途ダウンが必要というかダウンしてコード変えないとじゃね疑惑
  • Ahk2Exeは、以下の三つの方法で使用できる

    1.GUIインターフェイス:スタートメニューの「.ahkから.exeへの変換」を実行
    2.右クリック:開いているエクスプローラウィンドウ内で任意の.ahkファイルを右クリックし、[スクリプトコンパイル]を選択(AutoHotkeyのインストール時にスクリプトコンパイラオプションが選択されている場合のみ使用可能)
    これにより、スクリプトと同じ基本ファイル名のEXEファイルが作成される
    このファイルは、同じディレクトリに短時間で表示される
    注:EXEファイルは、同じカスタムアイコン、.binファイルを使用して作成され、上記の方法1で最後に使用されたMPRESS設定を使用される
    3.コマンドラインコンパイラは、コマンドラインから次の引数を指定して実行できる

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"ファイルを編集することで、コンパイル済みのスクリプトにバージョン情報(エクスプローラのファイルプロパティダイアログに表示されるやつ)を編集(追加)できる
  • また、Compile_AHK IIを使うとこのプロセスを容易にできる

コンパイルされたスクリプトを圧縮するには

Tips

  • コンパイルされたスクリプトでは通常、タスクトレイメニューからメインウィンドウを表示することは出来ない
  • #NoTrayIconコマンドと “Menu、Tray、ShowMainWindow"コマンドは、コンパイルされたスクリプトの動作に影響する
  • 「Menu,TRAY,MainWindow」でメインウィンドウを表示可能にできる
  • スクリプト側が、コンパイルされた状態で実行されているかどうかを知るには、「A_IsCompiled」変数を使用する、「1」ならコンパイルされている(それ以外は「0」)
  • コンパイラも公開されているが、パスワードで暗号化すれば逆コンパイルを防げる
  • 作成した実行ファイルの配布は自由
  • 実行可能ファイルを圧縮すると、メモ帳やPEリソースエディタなどのプレーンテキストエディタを使用してスクリプトソースコードを簡単に検査することはできませんが、その目的専用のツールでソースコードを抽出することができなくなる

次→(autohotkey勉強中その5)