VBScript(WSH)で外部Functionを呼出して戻り値を受ける方法と注意点

VBScript(WSH)で外部Functionを呼出して戻り値を受ける方法と注意点
以前に記事『 VBScriptのsubとFunctionの動作の違い 』で記載した通りVBScriptではFunctionを使う事で戻り値を受ける関数を外に出すことができます。
で、いくつもの場所で利用する『共通関数』が出来たら【外部Function】にして色んなファイルから呼び出したいと思います。
その方がメンテナンス性は向上するしますし、流用できるものも含めて1ファイルごとに記載するなんて面倒は嫌なものです。
外部Function呼出しの実験
フォルダ構成
よくありそうな下のフォルダ構成で実験します。
├── 実行ファイル.vbs
├── 共通Function.vbs ※1
├── 楽天市場/
│ ├── 楽天処理1.vbs
│ ├── 楽天処理2.vbs
│ ├── 楽天処理3.vbs
│ └── 楽天共通Function.vbs ※2
├── Amazon/
│ ├── Amazon1.vbs
│ ├── Amazon.vbs
│ ├── Amazon3.vbs
│ └── Amazon共通Function.vbs ※2
※1 モールをまたいで共有できる関数の置き場所※2 モール内だけで通用する関数の置き場所
実行ファイル.vbsの中身
1 2 3 4 5 6 7 8 |
Option Explicit Dim objAct Set objAct = WScript.CreateObject("WScript.Shell") objAct.Run "楽天市場\楽天処理1.vbs "&fileDirectory, 1, true objAct.Run "楽天市場\楽天処理2.vbs "&fileDirectory, 1, true Set objAct = Nothing |
処理をモールフォルダの処理Scriptに丸投げしています。
処理Script(楽天処理1.vbs)の中身
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Option Explicit Include("../共通Function.vbs") objT = oldDateCalc("2020/09/18","D",20,NULL) MsgBox(objT) '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ '外部 Function 読込準備 '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Function Include(strFile) Dim objFso Dim objWsh Dim strPath Set objFso = Wscript.CreateObject("Scripting.FileSystemObject") Set objWsh = objFso.OpenTextFile(strFile) ExecuteGlobal objWsh.ReadAll() objWsh.Close Set objWsh = Nothing Set objFso = Nothing End Function |
こちらも実際の処理を Function oldDateCalc に丸投げしてます。そしてこの Function oldDateCalc は外部の 共通処理.vbs に存在するという構成です。
共通Function.vbsの中身
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ '共通処理 '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Option Explicit Function oldDateCalc(startDate,FL,Count,FixedDate) Dim oldDate '送られた日付に / が入っているか確認、ない場合は / で区切る If InStr(startDate,"/")<>0 then '入っている場合 Else '入っていない場合Y,M,Dに分けて/を加算して結合する Dim Y Dim M Dim D Y = Left(startDate,4) M = Mid(startDate,5,2) D = Right(startDate,2) startDate = Y&"/"&M&"/"&D Set Y = Nothing Set M = Nothing Set D = Nothing End If If(IsNull(FixedDate)) = True Then '固定値 FixedDate がNULLの時 'FLで場合分け Select Case FL Case "Y" oldDate = Dateadd("yyyy","-"&Count,startDate) Case "M" oldDate = Dateadd("m","-"&Count,startDate) Case "W" oldDate = Dateadd("ww","-"&Count,startDate) Case "D" oldDate = Dateadd("d","-"&Count,startDate) Case Else '何もしない oldDate = startDate End Select Else '固定値 FixedDate に日付が入っているとき oldDate = FixedDate End If oldDateCalc = oldDate Set oldDate = Nothing End Function |
3か月前のデータが取れる場合、それを指示する事で3か月前の日付を返すというScriptが入っています。
楽天処理1.vbsを単体で実行すると動くが実行ファイル.vbsから呼び出すとエラーになる
楽天処理1.vbsにはそこから見た共通Function.vbsの位置をIncludeで指示しています。
で、実行ファイル.vbsから楽天処理1.vbsを呼び出してもこの構図は変わらないだろうと思っていたのですが「ファイルが見つかりません」と怒られてしまいます。
ちなみに、楽天処理1.vbsを単体で実行すると動きます。
そして、実行ファイル.vbsから動かすときには実行ファイルから見た共通Function.vbsの位置を楽天処理1.vbsに記載すると動きます。
つまりこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 |
'■ 実行ファイル.vbsから動かす場合 '▼ 動かない Include("../共通Function.vbs") '▼ 動く ※実行ファイル.vbsから見える位置を記載する Include("共通Function.vbs") '■ 楽天処理1.vbsから動かす場合 '▼ 動く Include("../共通Function.vbs") '▼ 動かない Include("共通Function.vbs") |
なるほど。
それなら、親ファイル(実行ファイル.vbs)に全部書いたら動くんじゃね?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'実行ファイル.vbs Option Explicit Dim objAct Include("共通Function.vbs") Set objAct = WScript.CreateObject("WScript.Shell") objAct.Run "楽天市場\楽天処理1.vbs "&fileDirectory, 1, true objAct.Run "楽天市場\楽天処理2.vbs "&fileDirectory, 1, true Set objAct = Nothing '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ '外部 Function 読込準備 '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Function Include(strFile) Dim objFso Dim objWsh Dim strPath Set objFso = Wscript.CreateObject("Scripting.FileSystemObject") Set objWsh = objFso.OpenTextFile(strFile) ExecuteGlobal objWsh.ReadAll() objWsh.Close Set objWsh = Nothing Set objFso = Nothing End Function |
1 2 3 4 5 6 |
'楽天処理1.vbs Option Explicit objT = oldDateCalc("2020/09/18","D",20,NULL) MsgBox(objT) |
これ、残念ながら動きません。楽天処理1.vbsで「oldDateCalc が未設定」と怒られます。
親のinclude情報を引き継ぐわけではないようです。
まとめ
共通Functionの配置場所指示にはどこから読み込まれたものかを考えて記載する必要があります。
フォルダを分けないで1つのフォルダ内で分割した方が無難かな?
でもねぇ、所在が分かりやすいのはメンテしやすさにつながるからなぁ…。
-
前の記事
VBScript(WSH)で発生する『改行』や『〜(全角チルダ)』などの変換問題の解決法 2020.09.17
-
次の記事
楽天市場で【アクセス数急増】が発生した面白い事例 2020.09.28
コメントを残す