VBSで自動化を目指す - 初級編

# VBSで自動化を目指す - 初級編

## はじめに

まずはじめに、自動化には色々ある。
Pythonが慣れているので、Pythonで書きたいのだが、
閉鎖空間の中ではメンテナンス含め、大変だと思ったので、
動作可能なVBScriptで書くことにする。
※今後、廃止予定の言語だということなので、とりあえずしのぎ程度に作ろうかと思います。

## 初級
本言語になれるため、まずは、いろいろと試したいことをまとめて書き出す。
VBScriptの特徴として、TypeScriptっぽい感じだった。
また、日本語を扱うのが苦手みたいで、直接日本語で書くと基本的には文字化けします。
作法としては、日本語を取り扱う場合は、Shift_JISで保存します。

拡張子は、「.vbs」となります。

GoToステートメントは用意されていませんが、エラー値判定とエラーハンドラへのGoToのみがエラー処理として存在しており、他の言語に比べるとエラー処理を追加するだけなのに、結構癖が強いです。

まずは、短期習得を目指すので、必要な箇所にターゲットを絞り、学習します。
要件定義を出してみようと思います。

最低限必要な機能として、「ファイル出力」、「キーハンドラ」、「画像によるエビデンス」、「初期設定ファイルの読み込み」、「判定機能」、「いろいろな用途への柔軟性」...など、出せばいくらでも出せそうなので、
ひとまず動くものを作成します。

システムのメインとなる箇所は、「ファイルの読み込み、書き込み、出力」です。
操作結果や対応処理後のファイル出力等は、必須の項目なので、最初それらにターゲットを絞り、作成していきます。

はじめに、ファイルの読み込み部分です。
コンフィグファイルは、次の通りです。

```ini:config.ini
[init]
Version=1.0.0
DebugMode=True

[General]
Language=English
Theme=Light

[User]
Name=John Doe
Email=john-doe@example.com

[Network]
IPAddress=192.168.1.100
Port=8080

[Preferences]
Notifications=Enabled
FontSize=12
```

ファイル読み込みの部分は次の通りです。
```vb:Init_test.vbs
Option Explicit

' ============================
'          Init Test
' ============================
' TestCodes.
' ============================
' ============================

Dim config, pattern, regEx, matches
Set config = CreateObject("Scripting.Dictionary")
Set regEx = New RegExp


' INIファイルから値を読み取る関数
Function ReadIniFile(strFilePath)
    Dim objFSO, objTextFile, strLine, strCurrentSection, arrKeyValue, SplitKeyValue
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTextFile = objFSO.OpenTextFile(strFilePath, 1)
    
    Do Until objTextFile.AtEndOfStream
        strLine = Trim(objTextFile.ReadLine)
        ' セクションの開始を検出
        If Left(strLine, 1) = "[" And Right(strLine, 1) = "]" Then
        	pattern = "^\[(.*?)\]$"
			With regEx
			    .Pattern    = pattern   'パターンを設定します
			    .IgnoreCase = True      '大文字と小文字を区別するか(False)、しないか(True)
			    .Global     = False     '文字列全体を検索するか(True)、しないか(False)
			End With
			Set matches = regEx.Execute(strLine)
            strCurrentSection = matches(0).SubMatches(0)
            Set config(strCurrentSection) = CreateObject("Scripting.Dictionary")
        End If
        ' セクションごとに、keyとValueを格納する
        If InStr(strLine, "=") > 0 Then
        	pattern = "[=]"
			With regEx
			    .Pattern    = pattern   'パターンを設定します
			    .IgnoreCase = True      '大文字と小文字を区別するか(False)、しないか(True)
			    .Global     = False     '文字列全体を検索するか(True)、しないか(False)
			End With
            ' キーと値を分割
            arrKeyValue = Split(regEx.Replace(strLine, ","), "," ,2)
            config(strCurrentSection).Add Trim(arrKeyValue(0)), Trim(arrKeyValue(1))
        End If
    Loop

    ' 見つからない場合は空文字を返す
    ReadIniFile = ""
    objTextFile.Close
    Set objTextFile = Nothing
    Set objFSO = Nothing
End Function

Private Sub Init()
    ' 初期化実行
    ReadIniFile "E:\tmp\config.ini"

    ' 初期化完了後のConfigを確認するだけのコード
    Dim strSection, strKey, strValue
    For Each strSection In config
    	WScript.Echo "Section: " & strSection
    	For Each strKey In config(strSection)
    		strValue = config(strSection)(strKey)
    		WScript.Echo "Key: " & strKey & " Value: " & strValue
    	Next
    Next
End Sub

Call Init

```
一通り、動く形になりました。

今回の目標は、言語の基礎的な部分を「必要最低限」習得しました。
ファイル操作、変数への格納(配列含め)、For文(Do~Loop含む)やIf文、
合わせて「正規表現」等を習得しました。
また、不要になったオブジェクトは`Nothing`を利用して、メモリを開放しましょう。
メインとなる「ファイルの読み込み、書き込み、出力」を達成しましたので、
今回はこの辺で終わります。