はじめに
すでに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"文字列")
のように、一行で済ませることもできる
さいごに
今回は、制御文の置き換えを書いてみました、次回は、組み込み関数の置き換えを書いていきたいと思います