ファイル書き込み処理でバッチファイル作成

ファイル書き込み処理を使ってバッチファイルを作成してみたいと思います。ファイル書き込みにはTextStreamオブジェクトのWriteLineメソッドを使います。WriteLineメソッドはテキストファイルに一行ずつ文字列を書き込みます。バッチファイルのソースを一行ずつ書き込むのですが、問題点としてはバッチファイル内の「"」などをどうするかということです。結果からいうと「"""」ではなくて「""""」と指定するみたいです。以下の例は「"」をメッセージボックスに表示します。

Public Sub test()
    MsgBox """"
End Sub

あとは一行ずつ文字列を書き込んで行くだけです。今回は、セルから文字列を取得し、それをバッチファイルに盛り込めるようにしました。具体的には、A列のセルに複数のサービス名を入力しておきます。このサービスをプログラムに読み込んで、現在起動されているかどうかを確認するバッチを作成します。

↓作成したバッチの実行結果





以下がプログラムソースです。

Option Explicit

Public Sub createbat()

    '-----------------------------
    ' 事前準備
    '-----------------------------
    'FileSystemObjectを生成
    Dim objFS As FileSystemObject
    Set objFS = CreateObject("Scripting.FileSystemObject")
    
    '以前のファイルがあった場合は削除
    If objFS.FileExists(ThisWorkbook.Path & "\CHECK_SERVICE.bat") = True Then
        objFS.DeleteFile (ThisWorkbook.Path & "\CHECK_SERVICE.bat")
    End If

    'TextStreamオブジェクト取得
    Dim objTS As TextStream
    Set objTS = objFS.OpenTextFile(ThisWorkbook.Path & "\CHECK_SERVICE.bat", ForAppending, True)
    Set objFS = Nothing 'FileSystemObjectは解放しておく
    
    '-----------------------------
    ' バッチファイル作成
    '-----------------------------
    'ヘッダ部を書き込む
    objTS.WriteLine "@echo off"
    objTS.WriteLine ""
    objTS.WriteLine "Rem =============================="
    objTS.WriteLine "Rem サービス起動状態確認"
    objTS.WriteLine "Rem =============================="
    objTS.WriteLine ""
    
    
    'サービス分ループ
    Dim y As Integer
    Dim sName As String
    Dim sName_wk
    For y = 3 To 999
        If Cells(y, "A").Value = "" Then Exit For   '空白だったら抜ける
        'サービス名取得
        sName = Cells(y, "A")
        sName_wk = Replace(sName, " ", ".")
        
        '確認処理を書き込む
        objTS.WriteLine "Rem " & sName & "の確認"
        objTS.WriteLine "net start | findstr /X /R" & " """ & "^..." & sName_wk & "$" & """ " & ">NUL"
        objTS.WriteLine "if A%errorlevel%A == A0A ("
        objTS.WriteLine "   echo " & "[OK]   " & sName
        objTS.WriteLine ") else ("
        objTS.WriteLine "   echo " & "[NG]   " & sName
        objTS.WriteLine ")"
        objTS.WriteLine ""
    Next
    
    '終了処理部分を書き込む
    objTS.WriteLine "pause"
    objTS.WriteLine ""
    objTS.WriteLine "Rem 終了"
    objTS.WriteLine "exit /B"
    
    '-----------------------------
    ' 終了処理
    '-----------------------------
    Set objTS = Nothing 'TextStreamオブジェクトの解放
    MsgBox "完了しました。"

End Sub