既存の 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 関数の引数が何個設定出来るのか情報が無くて、実行時エラーが発生しないかなぁって考えたりしてます。
以上