Frequently Asked Questions (FAQ)

この章ではフォーラムでよく訊かれる質問をとりあげます。 ここであなたの探している回答が見つからない場合はまずフォーラムで尋ねてみてください。

質問

1. なぜ私のAutoIt v2.64のスクリプトはv3で動作しないのでしょうか?

2. v3は以前のバージョンより難しいのでしょうか?

3. どうすれば私のv2.64のスクリプトをv3用に変換できますか?

4. "goto"コマンドはどこへいってしまったのですか?

5. どうすればDOSプログラムをAutoItから実行できますか?

6. なぜRun()は.exeファイルと.comファイルの実行にしか利用できないのでしょうか? .msi / .txtなど他のファイルはどうすればいいのでしょうか?

7. ダブルコーテーション(")使用時にエラーが起きるのはなぜでしょか?

8. ウィンドウの"title"、"text"パラメータは何を意味するのでしょうか?

9. "My var is $variable"としても変数が表示されないのはなぜでしょうか?

10. Send()を使用して変数を送信すると変なことが起きるのはなぜでしょうか?

11. 値のreturnと@errorの違いはなんでしょうか?

12. ホットキーを使用してスクリプトを終了するにはどうすればいいでしょうか?

13. スクリプトのコンパイル時にカスタムアイコンを使用するにはどうすればいいでしょうか?

14. スクリプトのコピーが多重実行されていないことを保証するにはどうすればいいでしょうか?

15. 現在のAutoIt v3の技術的な限界は?

16. Examples下のヘルプファイルで画像が見つからないというメッセージがでるのですが。

 

 

1. なぜ私のAutoIt v2.64のスクリプトはv3で動作しないのでしょうか?

v3はv2.64とは異なった言語構造を持っています。

AutoItの以前のバージョンはソフトウェアのインストールを手助けするためのシンプルなスクリプトを書くためにデザインされていました。しかしAutoItは時間がたつにつれて汎用的で複雑なスクリプト処理をおこなうために使われるようになりはじめました。そのような処理は過去の文法構造でも可能でしたが非常に難しくて面倒でした。その結果、汎用的な自動化処理をおこうなうのにより適していて、より標準的でBasicライクに作られたAutoItを作成することが決定されました。これはあなたが既にスクリプト言語を知っていれば、簡単にAutoIt v3を使うことができるということも意味しています。

 

トップに戻る

2. v3は以前のバージョンより難しいのでしょうか?

そんなことはありません。実際のところ、この言語では実現不可能なことをやろうとしない限りは多くの場合で以前のバージョンよりも簡単になっています。またBASICライクな言語仕様が採用されており、BASICは...ベーシックなことで有名です:)

 

古いAutoItスクリプトの大半はソフトウェアのインストールとダイアログボックス内の大量の"Next"ボタンをクリックすることに焦点が当てられていました。このようなスクリプトのほとんどはカッコを付け加えることで簡単にv3スクリプトに変換することが可能です。下にv2とv3で書かれたそのようなスクリプトの例を示します(NextボタンとFinish ボタンをもつ複数のダイアログによるソフトウェアのインストールのシミュレーション)。

 

; v2.64 スクリプト
WinWaitActive, Welcome, Welcome to the XSoft installation
Send, !n
WinWaitActive, Choose Destination, Please choose the
Send, !n
WinWaitActive, Ready to install, Click Next to install
Send, !n
WinWaitActive, Installation Complete, Click Finish to exit
Send, !f
WinWaitClose, Installation Complete

; v3 スクリプト
WinWaitActive("Welcome", "Welcome to the XSoft installation")
Send("!n")
WinWaitActive("Choose Destination", "Please choose the")
Send("!n")
WinWaitActive("Ready to install", "Click Next to install")
Send("!n")
WinWaitActive("Installation Complete", "Click Finish to exit")
Send("!f")
WinWaitClose("Installation Complete")

 

これは改良の結果です!:) 全ての"文字列"をコーテーションで囲むことで、テキスト内の前後のスペースによって引き起こされる問題と格闘する必要はもはやありません。また多くのテキストエディタですばらしいサポートが提供されており、 v3スクリプトを書く際に多くのことを簡単にしてくれる構文の強調表示を使用することができます。

 

トップに戻る

3. どうすれば私のv2.64のスクリプトをv3用に変換できますか?

最初に確認しなければならないのは"自分のスクリプトを変換する必要があるか?"ということです。v2.64は今後もダウンロード可能ですし、サポートも継続されます。従って理由がない限り(あなたがそうしたいのでない限り:))、あなたのスクリプト全てをアップデートする必要はありません。

 

ヘルプファイルにv2とv3のコマンドの関係を示した章があります。こちらをクリックしてページを参照してください。

 

AutoIt v3作成者の1人がv2のスクリプトをv3のスクリプトに自動変換してくれるユーティリティを書いています。変換はあなたのコードがgoto文の巣窟でない限りはかなり正しくおこなわれます :) コンバーターは"Extras"ディレクトリ(Start \ AutoIt v3 \ Extras - またはあなたがAutoIt v3をインストールしたディレクトリ)内にあります。

 

トップに戻る

4. "goto"コマンドはどこへいってしまったのですか?

消えました。Gotoは悪です。質問は受け付けません-悪なのです。 映画Time Banditsのラストに出てくる電子レンジの中の岩の塊のようなものです:)

 

AutoIt v3の大きな特徴は"ループ"を使用できるようになったことでもはやGotoを必要としなくなったことです。物事を処理する近代的な方法である WhileDoForExitLoopContinueLoopFunctions を見てください:) そしてヘルプファイルを読むときにループ文条件文関数についての章もチェックしてください。一度コツを覚えれば事実上どのような言語でも数分でスクリプトを書くことができるようになることを約束します。

 

はじめてみましょう。バージョン2.64でもっとも基本的なGotoの使用法は次のような無限ループです:

:mylabel
...処理をおこなう...
...別の処理をおこなう...
goto, mylabel

この処理のシンプルv3バージョンは常に"true"のWhileループです。

While 1 = 1
   ...処理をおこなう...
   ...別の処理をおこなう...
Wend

 

トップに戻る

5. どうすればDOSプログラムをAutoItから実行できますか?

DOSの"Dir"コマンドなどを実行したい場合、コマンドインタープリタ(command.comまたはcmd.exe。OSによって異なります)を使用する必要があります。@Comspecマクロにこのファイルの正しい位置が格納されています。DOSプログラムの終了を待ってからスクリプトの次の行を実行したい場合はRunWait()関数を使用する必要があります。下にDOSのDirコマンドをC:ドライブに対して使用する例(コマンドcommand.com /c Dir C:\ の実行)を示します。

    RunWait(@COMSPEC & " /c Dir C:\")

 

トップに戻る

6. なぜRun()は.exeファイルと.comファイルの実行にしか利用できないのでしょうか? .msi / .txtなど他のファイルはどうすればいいのでしょうか?

通常、"実行可能"であることを示す拡張子はほんのわずかです。.exe、.bat、.com、.pifがそれにあたります。.txtや.msiなどのその他のファイルタイプは実際は他のプログラムを使って実行されています。 "myfile.msi"というファイルをダブルクリックしたときに実際にバックグラウンドでおこなわれることは"msiexec.exe myfile.msi"の実行です。従って、.msiファイルをAutoItから実行するには次のようにしなければなりません。

    RunWait("msiexec myfile.msi")

 

また同じくらいシンプルな方法としては"start"コマンドの実行があります。このコマンドは自動でファイルの実行方法を判別して実行します。

    RunWait(@COMSPEC & " /c Start myfile.msi")

 

またはShellExecuteWait関数を使用します。このコマンドは自動でファイルの実行方法を判別して実行します。

    ShellExecuteWait("myfile.msi")

 

トップに戻る

7. ダブルコーテーション(")使用時にエラーが起きるのはなぜでしょか?

文字列内でダブルコーテーションを使用したい場合、それらを"2重にする"必要があります。つまりコーテーションを1つ使いたい場所に2つ書くのです。例えば変数に文字列:A word in "this" sentence has quotes around it!を設定したい場合は次のようにします。

    $var = "A word in ""this"" sentence has quotes around it!"

代わりにシングルコーテーションを使う方法もあります。

    $var = 'A word in "this" sentence has quotes around it!'

 

トップに戻る

8. ウィンドウの"title"、"text"パラメータは何を意味するのでしょうか?

こちらに詳細な説明があります。

 

トップに戻る

9. "My var is $variable"としても変数が表示されないのはなぜでしょうか?

$msgという変数があってそれをMsgBox内に表示したい場合、次の方法ではうまくいきません。

    MsgBox(0, "Example", "My variable is $msg")

上記の場合、そのままMy variable is $msgと表示されてしまいます。& 演算子を使ってAutoItに対して文字列と変数を連結するように教える必要があります。

    MsgBox(0, "Example", "My variable is " & $msg)

 

応用:たくさんの変数を文字列内で使用したい場合、StringFormat()関数が便利です。 例えば、文字列内に$var1から$var5を挿入したい場合、次のようにすると簡単です。

     $msg = StringFormat("Var1 is %s, Var2 is %s, Var3 is %s, Var4 is %s, Var5 is %s", $var1, $var2, $var3, $var4, $var5)
     MsgBox(0, "Example", $msg)

 

トップに戻る

10. Send()を使用して変数を送信すると変なことが起きるのはなぜでしょうか?

変数を送信している場合、注意しなければならないのは送信内容に! ^ + {SPACE}などの特殊な送信文字が含まれていないかどうかということです。これらはめったに必要にならないような特殊なキーストロークに変換されます。この問題を解決するためにはSend() のRAWモードを使用して特殊キーの変換をおこなわないようにします。

    Send($myvar, 1)

 

トップに戻る

11. 値のreturnと@errorの違いはなんでしょうか?

一般的には値のreturnは関数が成功したかどうかを表すために使われます。しかし関数が(WinGetText()のように )既になにか返している場合、関数が成功したかどうかを判別する方法が必要になります。その際、代わりに@errorを設定します。

 

トップに戻る

12. ホットキーを使用してスクリプトを終了するにはどうすればいいでしょうか?

実に簡単です。特定のキーの組み合わせを押すとスクリプトが終了するようにしたい場合、HotKeySet() 関数を使用して希望のキーが押された際に実行されるユーザー関数を作成します。このユーザー関数にはExitキーワードのみを書いておきます。

下記にCTRL+ALT+xが押された場合にスクリプトが終了するコードを示します。

HotKeySet("^!x", "MyExit")
...
...
; その他のスクリプト処理
...
...
Func MyExit()
    Exit
EndFunc

 

トップに戻る

13. スクリプトのコンパイル時にカスタムアイコンを使用するにはどうすればいいでしょうか?

(単にスクリプトを右クリックしてコンパイルを選ぶのではなく)完全なコンパイラプログラムを実行する必要があります。このページ でコンパイラの詳細について述べています。

 

トップに戻る

14. スクリプトのコピーが多重実行されていないことを保証するにはどうすればいいでしょうか?

_Singleton()関数を使用してください。Singleton()の詳細とその使用方法についてはUser Defined Functionsドキュメントを参照してください。

トップに戻る

15. 現在のAutoIt v3の技術的な限界は?

下記に現在のAutoItの技術的な限界の詳細を示します。注意してもらいたいのはこれらの限界のいくつかは理論的なものであって、実際の限界に到達する前にパフォーマンス面、メモリー面で問題が起きることがあるということです。

 

スクリプトの一行の最大長:4,095
文字列の最大長:2,147,483,647文字

数値の範囲(浮動小数):15桁の精度で 1.7E-308 から1.7E+308
数値の範囲(整数):64ビット符号付整数
16進数:32ビット符号付整数(0x80000000 から 0x7FFFFFFF)

配列:最大64次元、合計16000000要素まで
再帰的な関数呼び出しの最大深度:5100レベル

一度に使用できる変数の最大数:無制限
ユーザー定義関数の最大数:無制限

GUIウィンドウの最大数:無制限
GUIコントロールの最大数:65532

 

トップに戻る

16. Examples下のヘルプファイルで画像が見つからないというメッセージがでるのですが。

ヘルプファイル内の例を開くためのOpenボタンのことでしょう。
この問題はhhctrl.ocxが適切に登録されていないか、壊れていることで起きます。
コマンドプロンプトから"regsvr32 hhctrl.ocx"をおこなって登録を試みるか、ファイルが壊れていないかどうか確認してみてください。
 

トップに戻る