[VBScript] 禁断の「Goto」ステートメントを実現する
2020年 12月 31日
初期化・終了処理をシンプルするためのGotoならば積極的に使うべき
- 禁忌としてGotoを使わないという考え方もあるようですね。というか、禁忌とした意図や背景を理解せずに「Goto=悪」ととらえている人も多そうです。
ボキは、用途を限定するならば積極的に使うべき、と考えています。
![[VBScript] 禁断の「Goto」ステートメントを実現する_a0021757_13303487.png](https://pds.exblog.jp/pds/1/202105/07/57/a0021757_13303487.png)
- というか、VBScriptではスパゲティプログラムとなるようなGotoはそもそも実現できませんので、シンプルにループを抜ける用途での利用となります。
これは、[VBScript] ループ制御コマンド「Continue」っぽいものを美しく実装する、を応用したものです。これの活用例が、[VBScript] 処理ダイアログを表示したコピー・移動処理を実現する、となります。
Do ~ Loop Until 1で「Goto」を利用したい処理を挟み、Goto相当の動きをさせたいときに、「Exit Do」する。
このテクニックを利用していることを明示するため、
「::::」をDo ~ Loop Until 1冒頭に付けました。
欠点は、Doを多段実装と併用しづらいこと。多段でループ処理させたい場合は、ForやWhileで代用するとよいです。
サンプルソース
- Exit Do(≒GoTo)を活用した方が圧倒的に読みやすいことが分かると思います。
Exit Do(≒GoTo)を活用したもの
' ------------------------------------------------------------------------------
' vbCommon.vbsデバッグ
' ------------------------------------------------------------------------------
If objFS.GetFileName(WScript.ScriptFullName) = "vbCommon.vbs" Then
::::Do
If InStr(LCase(WSCript.FullName), "wscript") = 0 Then Exit Do
If Not Ping(サーバIP) Then Exit Do
Dim fpth: fpth = "\" & サーバIP & "フォルダパスbCommon.vbs"
If Not objFS.FileExists(fpth) Then Exit Do
If objFS.GetFile(fpth).DateLastModified <= objFS.GetFile(WScript.ScriptFullName).DateLastModified Then Exit Do
If objWS.Popup(WScript.ScriptFullName & "を更新します。",5, "プログラム更新", vbOkCancel + vbInformation) <> vbCancel Then
objFS.CopyFile fpth, WScript.ScriptFullName, True
End If
::::Loop Until 1
SetScriptHost("cscript")
dprintf "デバッグモード"
End If
Exit Do(≒GoTo)を活用せず、If文のみで表現したもの
' ------------------------------------------------------------------------------
' vbCommon.vbsデバッグ
' ------------------------------------------------------------------------------
If objFS.GetFileName(WScript.ScriptFullName) = "vbCommon.vbs" Then
If InStr(LCase(WSCript.FullName), "wscript") <> 0 Then
' WScriptホストでの実行
If Ping(サーバIP) Then
' サーバにPingが通る
Dim fpth: fpth = "\" & サーバIP & "フォルダパスbCommon.vbs"
If objFS.FileExists(fpth) Then
' サーバにファイルが存在する
If objFS.GetFile(fpth).DateLastModified > objFS.GetFile(WScript.ScriptFullName).DateLastModified Then
' サーバのファイルの方が新しい
If objWS.Popup(WScript.ScriptFullName & "を更新します。",5, "プログラム更新", vbOkCancel + vbInformation) <> vbCancel Then
' キャンセルボタンが押されなかった(タイムアウトも含む)
objFS.CopyFile fpth, WScript.ScriptFullName, True
End If
End If
End If
End If
End If
SetScriptHost("cscript")
dprintf "デバッグモード"
End If

にほんブログ村