LoginSignup
15
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-28

はじめに

すでに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"文字列")

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

さいごに

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

15
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17