解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

既存の VBScript を関数化する VBScript を作成する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。



この記事の目次



目的


リンクの記事で VBScript から VBScript を作成して、実行する事に成功しました。
VBScript から VBScript を作成する - 解析エンジニアの自動化 blog

作成するための VBScript コードは VBScript ファイル毎に異なってきます。

せっかく今まで作成してきた VBScript が1つにまとめられるのに、まとめるためのプログラムを書く時間が増えてしまうのはもったいないです。

今まで作成した VBScript を簡単に関数化する VBScript を作成します。



関数

ソースコード


 
ForReading = 1   ' OpenTextFile 引数用変数
ForWriting = 2   ' OpenTextFile 引数用変数
ForAppending = 8 ' OpenTextFile 引数用変数
 
'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
If WScript.Arguments.count = 0 then
   WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
                "ファイルをドロップしてください。"
   WScript.Quit
End If
 
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
 
'-------------------------------------------------------------------------------------------------------
' ドロップされた引数がファイル以外ならアラートして終了する
For each args In WScript.Arguments
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされた引数がフォルダかファイルかを判定する
   If objFileSys.FolderExists(args) then
      '-------------------------------------------------------------------------------------------------
      ' is folder.
      ' ファイルシステムオブジェクトの破棄
      Set objFileSys = Nothing
      WScript.Echo "フォルダがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   ElseIf objFileSys.FileExists(args) then
      '-------------------------------------------------------------------------------------------------
      ' is file.
      If Instr(1, args, ".vbs") = 0 Then
         '----------------------------------------------------------------------------------------------
         ' is not VBScript file.
         ' ファイルシステムオブジェクトの破棄
         Set objFileSys = Nothing
         WScript.Echo "VBScript では無いファイルがドロップされました。" & vbNewLine & _
                      "処理を終了します。"
         WScript.Quit
      End If
   Else
      '-------------------------------------------------------------------------------------------------
      ' is unknown.
      ' ファイルシステムオブジェクトの破棄
      Set objFileSys = Nothing
      WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
                  "処理を終了します。"
      WScript.Quit
   End If
  
Next
 
'-------------------------------------------------------------------------------------------------------
' VBScript ファイルを作成するパスの作成
WrapperVBSDir = SelfPath()
 
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
 
'-------------------------------------------------------------------------------------------------------
' 引数の VBScript ファイルの読み込み
For each args In WScript.Arguments
  
   ' 引数の VBScript ファイルオープン
   Set InputFile = objFileSys.OpenTextFile(args, ForReading, False)
  
   ' ファイル名のみ抽出
   InputFileName = objFileSys.getFileName(args)
  
   ' コード格納用変数
   code = ""
  
   ' 引数の VBScript ファイルを最終行まで読み込む
   Do Until InputFile.AtEndOfStream
     
      ' 1行読み込む
      strLine = InputFile.ReadLine
     
      ' 「"」を「""」に置換する
      strLine = Replace(strLine, """", """""")
     
      ' 読み込んだ文字列を「"」で囲む
      strLine = """" & strLine & """"
     
      ' コード格納用変数が空なら
      If code = "" Then
        
         ' Array 関数の文字列と合わせて代入する
         code = "   arrCode = Array(" & """" & "Wrapped" & InputFileName & """" & ", " & strLine
        
      ' コード格納用変数が既に代入済みなら
      Else
        
         ' 「, 」文字列で区切って代入する
         code = code & ", " & strLine
        
      End If
     
   Loop
  
   ' Array 関数の最後の「)」を代入する
   code = code & ")" & vbcrlf & vbcrlf
  
   ' Function コードの追加
   code = "Function Wrapper_" & Left(InputFileName, InstrRev(InputFileName, ".") - 1) & "()" & vbcrlf & vbcrlf & code
  
   ' VBScript 作成コードの追加
   code = code & "   ' VBScript 作成コード" & vbcrlf
   code = code & "   ForWriting = 2   ' OpenTextFile 引数用変数" & vbcrlf
   code = code & "   With CreateObject(""Scripting.FileSystemObject"").OpenTextFile(arrCode(0), ForWriting, True)" & vbcrlf
   code = code & "      for i = LBound(arrCode) + 1 to UBound(arrCode)" & vbcrlf
   code = code & "         .WriteLine arrCode(i)" & vbcrlf
   code = code & "      next" & vbcrlf
   code = code & "      .Close" & vbcrlf
   code = code & "   End With" & vbcrlf & vbcrlf
  
   ' 作成した VBScript ファイルの実行コードの追加
   code = code & "   ' シェルオブジェクト作成" & vbcrlf
   code = code & "   Set objWsh = WScript.CreateObject(""WScript.Shell"")" & vbcrlf & vbcrlf
   code = code & "   ' Wrapped" & InputFileName & " を実行" & vbcrlf
   code = code & "   ret = objWsh.Run(""Wrapped" & InputFileName & """, , True)" & vbcrlf & vbcrlf
   code = code & "   ' シェルオブジェクトの破棄" & vbcrlf
   code = code & "   Set objWsh = Nothing" & vbcrlf & vbcrlf
  
   ' 戻り値を返すコードの追加
   code = code & "   ' 戻り値を返す" & vbcrlf
   code = code & "   Wrapper_" & Left(InputFileName, InstrRev(InputFileName, ".") - 1) & " = ret" & vbcrlf & vbcrlf
  
   ' 作成した VBScript ファイルの削除コードの追加
   code = code & "   ' ファイルシステムオブジェクトの作成" & vbcrlf
   code = code & "   Set objFso = CreateObject(""Scripting.FileSystemObject"")" & vbcrlf & vbcrlf
   code = code & "   ' 作成した VBScript ファイルの削除" & vbcrlf
   code = code & "   Call objFso.DeleteFile(arrCode(0), True)" & vbcrlf & vbcrlf
   code = code & "   ' ファイルシステムオブジェクトの破棄" & vbcrlf
   code = code & "   Set objFso = Nothing" & vbcrlf
  
   ' Function コードの追加
   code = code & vbcrlf & "End Function"
  
   ' 出力ファイルオープン
  Set OutputFile = objFileSys.OpenTextFile(WrapperVBSDir & "\Wrapper-" & InputFileName, ForWriting, True)
  
   ' 出力
   OutputFile.WriteLine code
  
   ' 引数の VBScript ファイルクローズ
   InputFile.Close
  
   ' 出力ファイルクローズ
   OutputFile.Close
  
Next
 
'-------------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクトの破棄
Set objFileSys = Nothing
 
 
Function SelfPath()
  
   ' ファイルシステムオブジェクト作成
   Set objFileSys = CreateObject("Scripting.FileSystemObject")
  
   ' 自分のパスの取得
   SelfPath = objFileSys.getParentFolderName(WScript.ScriptFullName)
  
   ' ファイルシステムオブジェクトの破棄
   Set objFileSys = Nothing
  
End Function

使い方

既存の VBScript ファイルをドラッグ&ドロップすると、『Wrapper-[ドロップしたファイル名].vbs』という VBScript ファイルを作成します。

ファイルの中身は『Wrapper_ [ドロップしたファイル名]』という関数名の VBScript が記述されています。

この関数をコピペして、関数を使用すればドラッグ&ドロップした VBScript が実行出来ます。

ソースコード
〜ドロップした VBScript


Sample2.vbs
msg = "これは Sample2.vbs です。"
MsgBox msg
WScript.Quit(101) ' 戻り値


ソースコード
〜関数化した VBScript


Wrapper-Sample2.vbs
Function Wrapper_Sample2()
 
   arrCode = Array("WrappedSample2.vbs", "msg = ""これは Sample2.vbs です。""", "MsgBox msg", "WScript.Quit(101) ' 戻り値")
 
   ' VBScript 作成コード
   ForWriting = 2   ' OpenTextFile 引数用変数
   With CreateObject("Scripting.FileSystemObject").OpenTextFile(arrCode(0), ForWriting, True)
      for i = LBound(arrCode) + 1 to UBound(arrCode)
         .WriteLine arrCode(i)
      next
      .Close
   End With
 
   ' シェルオブジェクト作成
   Set objWsh = WScript.CreateObject("WScript.Shell")
 
   ' WrappedSample2.vbs を実行
   ret = objWsh.Run("WrappedSample2.vbs", , True)
 
   ' シェルオブジェクトの破棄
   Set objWsh = Nothing
 
   ' 戻り値を返す
   Wrapper_Sample2 = ret
 
   ' ファイルシステムオブジェクトの作成
   Set objFso = CreateObject("Scripting.FileSystemObject")
 
   ' 作成した VBScript ファイルの削除
   Call objFso.DeleteFile(arrCode(0), True)
 
   ' ファイルシステムオブジェクトの破棄
   Set objFso = Nothing
 
End Function



コメント

VBScript を関数化する事が出来ましたが、引数を必要とする VBScript には対応出来ません。

完全に関数化出来るようにしたいです。

あと Array 関数の引数が何個設定出来るのか情報が無くて、実行時エラーが発生しないかなぁって考えたりしてます。



以上