Edited at

UWSC を AutoIT 置き換えをしてみよう(2)

More than 1 year has passed since last update.


はじめに

すでにUWSCを愛用している方であればご存知の通り、UWSCの製作者umiumi氏が消息を絶ってしまい、現在Free版はベクターから入手できるものの今後の更新や入手が困難になることが予想されることから、UWSCをAutoIT3に置き換えることを検討したいと思い、記事を起こしました。

量があるので、何回かに分けて投稿の予定です。今回は2回目です


UWSCに対するAutoITの構文について

今回も、UWSCの関数や構文をAutoITのどの構文に置き換えできるのかまとめていこうと思います


WITH文


  • UWSC

 // モジュール、COMオブジェクトの表記(ドット構文)にてモジュール名、オブジェクトを省略できます

 WITH 省略部
     .変数      // 省略部.変数
     .関数名()    // 省略部.関数名()
 ENDWITH

 変数、関数名の先頭には .ドットを付けてください


  • AutoIT

With 省略部

     .変数      ; 省略部.変数
     .関数名()    ; 省略部.関数名()
EndWith

例としてComのExcelに対してセルの操作を渡す場合

Local $oExcel = ObjCreate("Excel.Application")

$oExcel.visible = 1
$oExcel.workbooks.add

With $oExcel.activesheet
.cells(2, 2).value = 1
.range("A1:B2").clear
EndWith

$oExcel.quit


複数行文字列の定義


  • UWSC

 // 複数行にわたる文字列を定数として定義します

 TEXTBLOCK 定義名
    文字列..........
    文字列..........
 ENDTEXTBLOCK


  • AutoIT

 変数名("複数にわたる文字列は" & _

", _, 文字を使って分割します。")


連想配列


  • UWSC

 // 連想配列の宣言

 HASHTBL 変数

 HASHTBL 変数 = HASH_CASECARE  // 大文字小文字を区別する(デフォルトは区別しない)

 HASHTBL 変数 = HASH_SORT    // 順列で読出す時にキーはソートされている

 // 値の設定・読出しは一次元配列と同じ (読出し時、キーが無ければEMPTYを返す)

 変数[キー] = データ

 // キーが存在するか

 変数[キー, HASH_EXISTS]     // キーが存在すればTrueを返す

 // 削除

 変数[キー, HASH_REMOVE]     // 削除できればTrueを返す

 // 順列読出し

 変数[順列番号, HASH_KEY]     // キーを返す

 変数[順列番号, HASH_VAL]     // 値を返す

 // 中身のクリア

 変数 = HASH_REMOVEALL

 ※ 削除 HASH_REMOVE は必要無くとも変数で受ける必要あり


  • AutoIT

残念ながらAutoIT単独で連想配列の機能を持っていないため、Windowsのスクリプトランタイム[Scripting.Dictionary]を呼び出して扱うことになります。

Global $vKey, $sItem, $sMsg, $oDictionary 

; Create dictionary object
$oDictionary = ObjCreate("Scripting.Dictionary")

If @error Then
MsgBox(0, '', 'Error creating the dictionary object')
Else
; Add keys with items
$oDictionary.Add ("One", "Same" )
$oDictionary.Add ("Two", "Car" )
$oDictionary.Add ("Three", "House" )
$oDictionary.Add ("Four", "Boat" )

If $oDictionary.Exists('One') Then
; Display item
MsgBox(0x0, 'Item One', $oDictionary.Item('One'), 2)
; Set an item
$oDictionary.Item('One') = 'Changed'
; Display item
MsgBox(0x20, 'Did Item One Change?', $oDictionary.Item('One'), 3)
; Remove key
$oDictionary.Remove('One')
;
$oDictionary.Key ('Two') = 'Bike'
EndIf

Sleep(1000)

; Store items into a variable
For $vKey In $oDictionary
$sItem &= $oDictionary.Item($vKey) & @CRLF
Next

; Display items
MsgBox(0x0, 'Items Count: ' & $oDictionary.Count, $sItem, 3)

; Add items into an array
$aItems = $oDictionary.Items

; Display items in the array
For $i = 0 To $oDictionary.Count -1
MsgBox(0x0, 'Items [ ' & $i & ' ]', $aItems[$i], 2)
Next

Sleep(1000)

; Add keys into an array
$aKeys = $oDictionary.Keys

; Display keys in the array
For $i = 0 To $oDictionary.Count -1
MsgBox(0x0, 'Keys [ ' & $i & ' ]', $aKeys[$i], 2)
Next
EndIf


例外処理


  • UWSC

 // TRY - FINALLY ルーチン中断時にも必ず実行されます

 TRY
   処理(EXIT)
 FINALLY
   処理
 ENDTRY

 // TRY - EXCEPT 実行時エラーが起きた時に実行されます

 TRY
   処理(エラー)
 EXCEPT
   処理
 ENDTRY

 ※ エラーメッセージは特殊変数 TRY_ERRMSG に格納

   エラー行は特殊変数 TRY_ERRLINE に格納


  • AutoIT

 AutoITにはTRY-EXCEPTが存在しません。そのため組み込みマクロの@errorを利用して例外処理をすることになります

ユーザ関数()

If @error Then
ConsoleWrite( "エラーがありました : " & @error)
Else
ConsoleWrite( "エラーはありませんでした")
EndIf


関数の定義


  • UWSC

 関数はメインルーチンの後に書いてください。

  (メインルーチンは関数前までであり、関数後にメインルーチンを書いても実行されません)

 関数名に次の文字は使えません , + * = < > ( ) ! ?


  • AutoIT

 関数自体はできればメインルーチンの後に書いてください。ただ、前に書いても動きはします

 関数名に次の文字は使えません , + * = < > ( ) ! ?


ユーザ関数 手続き型(戻り値なし)


  • UWSC

 // Procedure - Fend    手続き型(戻り値なし)

 PROCEDURE 関数名( 引数, Var 引数, 引数[], Var引数[][], 引数=定数, .... )

    処理
 FEND

 Var 宣言を付けると引数を変更可能とする (参照引数)

 配列変数には次元数分 []を付ける (2次元配列の場合 引数[][] )

 = 定数 にてデフォルトパラメータを指定できる(デフォルトパラメータ以降に通常引数を書く事はNG)


  • AutoIT

 Func functioname ( [Const] [ByRef] $param1, ..., [Const] [ByRef] $paramN, $optionalpar1 = value, ...)

処理
 EndFunc


ユーザ関数 関数(戻り値あり)


  • UWSC

 // Function - Fend    関数(戻り値あり)

 FUNCTION 関数名( 引数, Var 引数, 引数[], Var 引数[][], 引数=定数, .... )
    処理
    RESULT = 戻り値    // Result に戻り値を入れる
 FEND

 Var 宣言を付けると引数を変更可能とする

 配列変数には次元数分 []を付ける (2次元配列の場合 引数[][] )

 = 定数 にてデフォルトパラメータを指定できる(デフォルトパラメータ以降に通常引数を書く事はNG)


  • AutoIT

Func functioname ( [Const] [ByRef] $param1, ..., [Const] [ByRef] $paramN, $optionalpar1 = value, ...)

処理
Return [value]
EndFunc


IF文


  • UWSC

 // 1行の IF 文

 IF 式 THEN 真 [ELSE 偽]

 // IF のブロック文 IF(もしくはIFB) ENDIF
 IF 式 [THEN] (もしくはIFB)
   真
 [ELSEIF 式 [THEN]]
   :
 [ELSE]
   偽
 ENDIF


  • AutoIT

If 式 Then


ElseIf 式 Then

Else

EndIf


For文


  • UWSC

 // For To Next 文  初期値から終了値までループ

 FOR 変数 = 初期値 TO 終了値 [STEP 刻み値] 
   処理
 NEXT       // NEXTの後に変数を書いてはダメ

 // For In Next 文  配列の要素数分ループ

 FOR 変数 IN 配列変数 
   処理
 NEXT

 ※ 配列変数には配列の他に COMのコレクション、または次の関数が指定可能: GetDir, GetItem, GetAllWin

 ※ 配列変数に文字列が指定された場合には1文字づつ要素分解


  • AutoIT

For 変数 = 初期値 To 終了値 [Step 刻み値]

処理
Next

For 変数 In 配列変数

処理
Next

 UWSCと全く変わりません

 

 


WHILE文


  • UWSC

 WHILE 式        // 式が True の間実行

   処理
 WEND


  • AutoIT

While 式        ; 式が True の間実行

処理
If $val < 0 Then ExitLoop ; Whileの条件式以外の値でループを中断するとき
If $val = 7 Then ContinueLoop ; Whileで無限ループにした場合などで、特定の値のときスキップする場合
WEnd


Until 文


  • UWSC

 REPEAT

   処理
 UNTIL 式        // 式が False の間実行


  • AutoIT

Do

処理
Until 式        ; 式が False の間実行


CASE文


  • UWSC

 // Select Selend 文

 SELECT 式
  CASE 式       // 数値でも文字でも変数でもOK
    処理
  [CASE 式, 式]    // ,カンマによる複数表記可
    処理
  [DEFAULT]      // デフォルト
    処理
 SELEND


  • AutoIT

Select

Case 式
処理
Case 式
処理
Case Else
判別外の処理
EndSelect

Switch 変数

Case 値
処理

Case 値
処理

Case 値
処理

Case 値
処理

Case Else
判別外の処理
EndSwitch


外部スクリプト呼び出し


  • UWSC

 CALL UWSファイル名             // 拡張子(uws)は省略可

 CALL UWSファイル名.uws(xxx, xxx, ...)  // 引数を付けた場合に値は PARAM_STR[] 変数に入る

 ※ UWSファイル名の割り当てに変数を使用する事はできません


  • AutoIT

 なし、実行するならRunで代用

 Run("AutoIt3.exe", @ScriptDir & "\" & UWSファイル名, @SW_MAXIMIZE)

 


ループを中断


  • UWSC

 // FOR, WHILE, REPEAT のループを中断

 BREAK [定数]   

 多重ループ中にて定数が指定された場合に、その定数分ループをBREAKする (デフォルト 定数=1)


  • AutoIT

; FOR, WHILE, Do のループを中断

Break


ループ内でスキップ


  • UWSC

 // FOR, WHILE, REPEAT のループの先頭へ

 CONTINUE [定数]   

 多重ループ中にて定数が指定された場合に、その定数分ループをCONTINUEする (デフォルト 定数=1)


  • AutoIT

If 式 Then ContinueLoop ; Whileで無限ループにした場合などで、特定の値/式が成り立つときスキップする


関数中断


  • UWSC

 // 関数を抜ける

 EXIT

 // 直ちにプログラムを終了  

 EXITEXIT [終了コード]


  • AutoIT

If 式 Then ExitLoop ; 特定の値/式が成り立つとき中断する

Exit ; 関数を抜ける

;中断用関数を用しておけば、UWSCのEXITEXITは以下の関数で代用できる

Func Terminate()

Exit 0
EndFunc

Print文


  • UWSC

 // Print文 ロギング

 PRINT 表示文

 表示用のウインドウが1つ勝手に開きます

 又、同じ内容をUWSC.LOGに保存 (最大行数は uwsc.ini の LogLines= にて指定可、もしくはOptionにて)


  • AutoIT

ConsoleWrite ( "表示文" )

ConsoleWrite ( 変数 )

ログを取る場合は明示的に以下のようにする、(ライブラリFile.au3のインクルードを忘れないこと)

  #include <File.au3>

Local $hFile = FileOpen(@ScriptDir & "\autoit.log", 1)
_FileWriteLog($hFile, 書き込む変数or文字列)

のようにして、_FileWriteLogでファイルハンドラに文字列を渡す方法もあるが、なるべく短くしたいなら

#include <File.au3>

_FileWriteLog(@ScriptDir & "\autoit.log", 書き込む変数or"文字列")

のように、一行で済ませることもできる


さいごに

今回は、制御文の置き換えを書いてみました、次回は、組み込み関数の置き換えを書いていきたいと思います