のら(NORA)のブログ

主にソフトについて備忘録で(手抜き)書いていますねー。困った人の役とかに立てばいいかなー。とかそういう程度の奴でーす。むぎゅぎゅ~。更新停滞中ですね~。

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:文法エラーをダイアログ表示せずに標準出力に出力する
    • 詳細については「#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, 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
}

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

スクリプトファイルに含まれる文字は、ファイルのロードに使用される文字コードによって制限される まあ大体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 / 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)