今回はトラブルのため画面仕様等をかつさせて頂きます。
発生している事情(トラブル概要)については以下となります。
自作している HTA + VBScript ベースのツールにおいて、ツールの機能の一つである
「画面上に実行結果を表示する処理」が正常に動作しないというトラブルが発生しました。
トラブルの確認ポイントについては以下となります。
ここがこのツールにおける重要な分岐点になりますので、まず切り分けとして以下の点を確認します。
・実機環境申請書(Excel)の出力が成功しているかどうか
考えられる発生原因については以下となります。
確認結果に応じて、原因の切り分けを行います。
① 実機環境申請書の出力が失敗している場合
この場合、tool_script.vbs 側の問題である可能性が最も高いと考えられます。
想定されるポイントは以下です。
・HTA から渡している引数が正しく受け取れていない
・引数は受け取れているが、Excel への出力処理で失敗している
② 実機環境申請書の出力は成功しているが、画面に表示されない場合
Excel 出力が正常に行われているにもかかわらず、HTA 画面の実行結果に反映されない場合は、
HTA 側の処理に問題がある可能性が高いと判断でできます。
トラブルの解決方法については以下となります。
① tool_script.vbs 側が疑わしい場合
以下の手順で切り分けを行います。
・HTA から渡している引数が正しく受け取れているかをMsgBox で確認
・引数が問題なく取得できている場合は、Excel の出力先セルやシート指定が正しいかを確認
ここで引数の値や出力先が想定どおりであれば、VBScript 側の基本的な処理は正常と判断。
② HTA 側が疑わしい場合
Excel への出力が成功している場合は、処理のタイミングが原因で画面に反映されていない
可能性があるため以下で動作を確認してみる。
・Sleep を入れて処理を遅延させることで遅延後に実行結果が画面に表示されるかを確認
この方法で、「処理自体は成功しているが、画面更新のタイミングが早すぎた」という問題か
どうかを切り分けます。
今回は「② HTA 側が疑わしい場合」であったためログの出力と合わして解決方法をご紹介いたします。
'=========================================================================================================================
' 外部 VBS を呼び出して申請書のセルに情報を追記していく
'=========================================================================================================================
Sub RunExternalVBS(vbs_tabName, vbs_setDateStr, vbs_shinseiUser_furigana, vbs_ShinseiUser, vbs_ShinseiName2, vbs_WorkStartDate, vbs_workEndDate, vbs_BasePath, vbs_SrcPath, vbs_OutPath)
' 外部VBSファイルのパス
vbsPath = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".") & "\tool_script.vbs"
MsgBox "実行結果取得開始いたします"
cmd = "powershell -WindowStyle Hidden -Command " & _
"""& { " & _
"$out = & cscript //nologo '" & vbsPath & "' " & _
"'" & vbs_tabName & "' " & _
"'" & vbs_setDateStr & "' " & _
"'" & vbs_shinseiUser_furigana & "' " & _
"'" & vbs_ShinseiUser & "' " & _
"'" & vbs_ShinseiName2 & "' " & _
"'" & vbs_WorkStartDate & "' " & _
"'" & vbs_workEndDate & "' " & _
"'" & vbs_BasePath & "' " & _
"'" & vbs_SrcPath & "' " & _
"'" & vbs_OutPath & "'; " & _
"$out }"""
MsgBox "実機環境作業申請書を作成中のため30~50秒ほどお待ちください。"
'========================================
' 外部VBS 実行
'========================================
Set exec = shell.Exec(cmd)
' ★ 必須:終了待ち
Do While exec.Status = 0
shell.Run "powershell -WindowStyle Hidden -Command Start-Sleep -Seconds 3", 0, True
Loop
Do Until exec.StdOut.AtEndOfStream
line = exec.StdOut.ReadLine
' ★ログ用に必ず貯める
stdoutBuffer = stdoutBuffer & line & vbCrLf
arr = Split(line, "|")
If UBound(arr) = 3 Then
Call AddResultRow(arr(0), arr(1), arr(2), arr(3))
End If
Loop
'========================================
' ★ここからがログ取得処理(この位置!)
'========================================
' ※ StdOut はすでに ReadLine で消費されているため
' バッファ変数を使う
stdOut = stdoutBuffer
stdErr = exec.StdErr.ReadAll
exitCode = exec.ExitCode
Set fso = CreateObject("Scripting.FileSystemObject")
logPath = vbs_BasePath & "\exec_log.txt"
Set logFile = fso.OpenTextFile(logPath, 8, True)
logFile.WriteLine "========================================"
logFile.WriteLine "実行日時 : " & Now
logFile.WriteLine ""
logFile.WriteLine "--- EXEC CMD ---"
logFile.WriteLine cmd
logFile.WriteLine ""
logFile.WriteLine "--- ARGS ---"
logFile.WriteLine "tabName : [" & vbs_tabName & "]"
logFile.WriteLine "setDateStr : [" & vbs_setDateStr & "]"
logFile.WriteLine "furigana : [" & vbs_shinseiUser_furigana & "]"
logFile.WriteLine "user : [" & vbs_ShinseiUser & "]"
logFile.WriteLine "name2 : [" & vbs_ShinseiName2 & "]"
logFile.WriteLine "startDate : [" & vbs_WorkStartDate & "]"
logFile.WriteLine "endDate : [" & vbs_workEndDate & "]"
logFile.WriteLine "basePath : [" & vbs_BasePath & "]"
logFile.WriteLine "srcPath : [" & vbs_SrcPath & "]"
logFile.WriteLine "outPath : [" & vbs_OutPath & "]"
logFile.WriteLine ""
logFile.WriteLine "--- RESULT ---"
logFile.WriteLine "ExitCode : " & exitCode
logFile.WriteLine "--- StdOut ---"
logFile.WriteLine stdOut
logFile.WriteLine "--- StdErr ---"
logFile.WriteLine stdErr
logFile.Close
Set shell = Nothing
MsgBox "申請書作成完了"
End Sub
Sub AddResultRow(appDate, workDate, serverID, serverName)
Dim tbl, newRow
Set tbl = Document.getElementById("resultTable")
Set newRow = tbl.insertRow(tbl.rows.length)
newRow.insertCell(0).innerText = appDate
newRow.insertCell(1).innerText = workDate
newRow.insertCell(2).innerText = serverID
newRow.insertCell(3).innerText = serverName
End Sub

