ファイル書き込み処理でバッチファイル作成
ファイル書き込み処理を使ってバッチファイルを作成してみたいと思います。ファイル書き込みには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