(for Internet Explorer)
Sub  NotCallFinish()
Finish が呼ばれないで、クラスの Class_Terminate が呼ばれたときにエラー表示します。
関連
→ Class_Terminate の中のエラー
Private Sub  Class_Terminate()
  If en = 0 and not Me.IsFinished Then  NotCallFinish
End Sub
サンプル:
(src)
FinObj クラスを使うと、Finally ブロックに似た記述をすることができます。
エラーが発生しても、続きを実行したり、キャッチしたりしませんが、Finally ブロックは実行します。
Sub  FuncA( Path )
  Dim  fin : Set fin = new FinObj : fin.SetFunc "FuncA_Finally"

  ren  Path, "a.txt" : fin.SetVar "Path", Path  '// 戻すときのデータを記録
    :
  fin.SetVar "Path", Empty  '// 正常時は戻さないならデータを削除
End Sub
 Sub  FuncA_Finally( Vars )  '// Finally ブロックに相当
  Dim  en,ed : en = Err.Number : ed = Err.Description : On Error Resume Next  '// This clears error

  Dim  path : path = Vars.Item("Path")  '// 戻すデータを取得
  If not IsEmpty( path ) Then  ren  "a.txt", path  '// 戻す処理

  ErrorCheckInTerminate  en : On Error GoTo 0 : If en <> 0 Then  Err.Raise en,,ed  '// This sets en again
End Sub
FuncA_Finally
Path
FuncA_Finally
Path
ren  Path, "a.txt"
ren  "a.txt", path
記述例: 関数の場合
関連
→ Class_Terminate (デストラクタ)
(src)
ローカル変数のデストラクタが動く順番に依存しないようにしてください。
Sub  FuncA( Path )
  Dim  fin : Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
  Dim  ds_:Set ds_= New CurDirStack
  fin.SetVar "CurDir", g_fs.CurrentDirectory
    :
End Sub :  Sub  FuncA_Finally( Vars )
  del  Vars.Item("CurDir") + "\_temporary_folder"
End Sub
たとえば、下記のように、デストラクタでカレント・フォルダが変わるとき、FuncA_Finally が
呼ばれるタイミングが、カレント・フォルダが変わる前か後かどうか不定なので、Finally
ブロックで相対パスを指定することはできません。
Class  ClassA
Public Sub  FuncA( Path )
  Dim  fin : Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
     :
End Sub : Public Sub  FuncA_Finally( Vars )  '// Finally ブロックに相当
     :
End Sub
End Class

Sub  ClassA_FuncA_Finally( Vars ) : Vars.Item("Me").FuncA_Finally( Vars ) : End Sub
記述例: メソッドの場合
ResumePop
CallFinalizeInModules
:
Err.Raise
g_FinalizeInModulesCaller.Class_Terminate
CallFinalizeInModules
1
(= g_FinalizeModules(i))
FinalizeModule (vbslib.vbs)
0
(= g_FinalizeModules(i))
FinalizeModule (vbslib.vbs)
On Error Goto 0 していないときは 1
(メインvbs の vbslib include)
(メインvbs の vbslib include)
関連
エラーメッセージを見ても分からないときは、スクリプトの開発者に質問してください。
あなたが開発者であるときは、デバッグモードで動かしてみてください。
サポート
ホームページにあるサポート掲示板かメールアドレスへ
… スルーカウンタ
… デバッグ機能の設定場所
… 起動時のパラメーターを指定する
debugger.bat
Test.vbs ファイルをデバッガにアタッチします
@wscript //x Test.vbs
@pause
モジュールの一部が動きますが、
そこをデバッグするときは、下記のバッチファイルを実行してください。
デバッグを中止するときは、kill_wscript.bat を実行してください。
デバッグを中止するときは、コマンドプロンプトを閉じてください。
コマンドプロンプトが表示されていないときは、kill_wscript.bat を実行してください。
C:\home\sample.vbs(34, 3)
Microsoft VBScript 実行時エラー: この変数は宣言されていません。: 'e'
デバッガが無くても、g_debug=1 にすれば、エラーメッセージが詳しくなることがあります。
[ERROR](500) この変数は宣言されていません。
g_debug=0
g_debug=1
g_debug=1 にすると、詳しい動作内容が表示されたり、エラーが発生したらブレーク
したりするなど、若干動きが異なります。 この動きをさせないで、デバッガに接続する
には、g_debug=0 にして、下記のバッチファイルを実行してください。
内部で、デバッガに接続するまでに、
@cscript //x Test.vbs /g_debug:0
@pause
Test.vbs ファイルをデバッガにアタッチします
debugger.bat
wscript ではないことに注意
=0 なら wscript にしてください
ただし、
wscript であることに注意
ただし、行番号が出るのは、文法エラーのみです。
コールスタック(デバッグ | ウィンドウ | 呼び出し履歴)を見れば、全体から見てどの部分で
止まっているかが分かります。 開いているソースの絶対パスは、1行目に自動的に挿入
されています。 一部のオブジェクト(静的オブジェクト)は、DefineInfo.FullPath プロパティに、
クラスを定義しているソースの絶対パスが入っています。DefineInfo プロパティが無くても、
メソッドにステップインしたときのソースの1行目から分かります。
'// C:\Folder\vbslib\Sample.vbs   ... デバッグ時に自動的に付きます
Dim  g_SrcPath

Class  Sample_vbs : Public FullPath : End Class
Dim  g_Sample_vbs
Set  g_Sample_vbs =_
   new Sample_vbs
With g_Sample_vbs
  .FullPath = g_SrcPath
End With

Class  ClassA
  Public Property Get  DefineInfo() : Set DefineInfo = g_Sample_vbs
     End Property
End Class
メイン・スクリプトのパスは、WScript.ScriptFullName プロパティの値を見れば
分かりますが、インクルードしたスクリプトのパスは、通常分かりません。
しかし、g_debug=1 でデバッガに接続したときに表示される vbslib のソースは、
1行目に絶対パスが記述されたコメントが付きます。

また、ソースの先頭に下記のような記述があり、
g_SrcPath の値を代入した g_〜_vbs.DefinePath 変数の値に、インクルードしたスクリプト
のパスが入っています。 Visual Studio では、この変数を選択してウォッチ・ウィンドウへ
ドロップし、値(パス、" "付きでも可)をコピーして、 ファイル・オープンで開けます。
もし、g_〜_vbs.DefinePath 変数が無くても、最後の call_vbs, call_vbs_d が呼び出している
関数を定義しているスクリプトのパスなら、g_SrcPath の値から知ることができます。
最後以外は、コールスタックを目的の call_vbs, call_vbs_d に切り替えて、 path 引数
の値を調べることで分かります。
また、下記の式の値が True なら、最後の call_vbs, call_vbs_d が、メイン・スクリプト
の関数を呼び出していると判断できます。
g_SrcPath = WScript.ScriptFullName
.vbs ファイルの先頭
vbs ファイルが、main 関数を持ち、include もされる場合、上記の実装では、二重定義
エラーになります。 下記のように実装してください。
Dim  g_Sample_vbs
If  IsEmpty( g_Sample_vbs ) Then  Declare_g_Sample_vbs
Sub  Declare_g_Sample_vbs
  ExecuteGlobal  "Class  Sample_vbs : Public FullPath : End Class"
  Set  g_Sample_vbs =_
     new Sample_vbs
  With g_Sample_vbs
    .FullPath = g_SrcPath
  End With
End Sub

Sub main2( Opt, AppKey )
  g_SrcPath = WScript.ScriptFullName : Declare_g_Sample_vbs
     :
g_debug=0
main.vbs
インクルードしたファイルがコンパイルエラーしたときは、g_is_compile_debug = 1 として
起動すると、コンパイルエラーがあった vbs ファイルがある行を開きます。 ただし、
  '--- start of parameters for vbslib include -------------------------------
  g_debug = 0          '// release:0, debug:99, -1:call SetupDebugTools
Dim g_is_compile_debug : g_is_compile_debug = 1
に、行番号を指定して開くことができるテキストエディタが
すでに登録してある必要があります。
→ T_CompileDebug フォルダ
テスト
簡易版
エラーが発生したら、エラーが発生した瞬間でブレーク(一時停止)するために必要な、
デバッガにアタッチして、1つ目のエラーでブレークする
g_debug = 1
テスト
ブレークしたい場所に Stop 命令を記述してデバッガーに接続しても、RunProg 関数など
で起動した子プロセスが Stop 命令を実行したときは、ブレークしません。
デバッガー(不具合を修正するツール) を使うと、スクリプトの中を1つずつ実行したり、
変数の値を確認したりできます。
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、
デバッガに接続して問題がある場所で停止します。
"Sample.vbs"
----------------------------------------------------------------------
g_debug = 1
----------------------------------------------------------------------
[ERROR](500) この変数は宣言されていません。
表示されるエラーメッセージの例
Sample.vbs
関連
多くの場合、内部関数の中でブレークしてしまうので、自分が扱っているスクリプトが見つ
かるまで、コールスタック(デバッグ | ウィンドウ | 呼び出し履歴)を開いて、探してください。
深い
浅い
エラーが発生した瞬間でブレークさせるには、2つの方法があります。 1つは、メイン・
スクリプトの
の中にある g_debug = 0 を編集してください。
もう1つは、*.vbs ファイルのショートカットを作成して、右クリック [ プロパティ ] の [ リンク先 ]
に、/g_debug:1 オプションを設定してください。
...\sample.vbs /g_debug:1
リンク先:
1つ目のエラーでブレークする
などに設定すべき値が自動的に表示されます。
デバッガーは、Visual Studio Standard 以上、または MS-Office 付属の
ブレークしたいソースの場所に、Stop:OrError を記述して実行してください。
2回目以降でブレークする方法
関連
編集したら、スクリプトを再度実行してください。
→ T_Err2_Debug2_WithDebugger_WithBreak2_shortcut.vbs # [main]
 に含まれています。 無料の
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、デバッガ
に接続して問題がある場所で停止します。
"sample.vbs"
----------------------------------------------------------------------
g_debug = 1
----------------------------------------------------------------------
<ERROR err_number='1' err_description='Stop:OrError'/>
その状態で実行すると、Stop:OrError を記述した場所でブレークします。
g_debug などの変数に設定すべき値が書かれたコードが表示されます。 このコードを、
メイン.vbs の最後にある SetupVbslibParameters 関数の最後に記述してください。
Stop:OrError
とすると、デバッガーに接続します。 /g_debug:1 にすると、1つ目のエラーでブレーク
します。
cscript //x  sample.vbs /g_debug:99
コマンドライン:
ショートカットのリンク先:
"C:\Folder\sample.vbs" /g_debug:99
をインストールしてから、
関連
も使えます。
デバッガーの起動の仕方:
MS製のデバッガーは、すべて同じ方法でデバッガーを起動できます。
インストール
vbslib を使う場合:
vbslib を使わない場合:
If g_count_up(0)=0 Then  Stop '// watch-> g_count [DEBUGGING]
echo_v "g_count(0)=" & g_count(0)
If g_count_up(0)=2 Then  Stop
Function  g_count_up( i as integer ) as integer
グローバル配列変数 g_count の1つの配列要素の値を+1します。
→ スルーカウンタ
【引数】
i
カウンタの種類の番号、配列要素番号(0以上)
新しい配列要素の値
返り値
デバッグ用です。 参考
問題が発生した場所の少し前でブレークさせたい場所で、まず下記のように記述します。
複数のカウンタを使うときは引数 0 を変えてください
実行させてエラーが発生した場所でブレークしたら、g_count(0) の値をウォッチします。
0 は、g_count_up の ( ) の中と同じです。 ウォッチするのは、g_count_up ではないことに
注意してください。
g_count(0) の値がウォッチした値と一致したらブレークするように、記述を変更します。
0
  0
2
再び最初から実行させると、上記の Stop で止まります。
g_count(0)
← ウォッチ
← g_count(0) をウォッチしたら 2 だった場合
(src)
関連
→ スルーカウンタ (C言語 - errors)
0
特定の条件を満たしたときだけブレークしたいときは、次のように記述します。
If ... Then  SetVar "Stop1", 1    '// 条件の判定 [DEBUGGING]
   :
If GetVar( "Stop1" ) Then  Stop   '// ブレークする場所 [DEBUGGING]
出力ファイルの内容に問題があるときは、ファイル名を指定するだけで、
ファイルの出力を開始するところでブレークさせることができます。
参考
Dim  g_verbose as boolean
Verbose モードが有効かどうか。
ファイル:
vbs_inc_400.vbs
Verbose モードが有効であるときは、内部処理の内容を詳しく表示しながら実行します。
サンプル (デバッグ時)
サンプル (開発時)
g_verbose = 1
  FuncA
pause
If g_verbose Then  echo_v  "処理は1つも行われませんでした。"
Verbose モードで内部処理を表示する主な目的は、行われるはずの処理が行われて
いない不具合を解決することです。 処理が行われなかった
ことを中心に表示してください。 そうしないと、必要な情報が多くのノイズ(情報)に
隠れてしまいます。  とりあえず Verbose モードで動かし、そこからどの情報を詳しく
表示するようにすればいいか、どのオブジェクトを GetEchoStr で表示させるとよいか
をガイドできればよいでしょう。
関連
FuncA の処理内容を詳しく表示します。
テスト
→ T_Verbose.vbs # [T_Verbose]
プログラムが処理内容に対してメタな処理になっているときに処理のステップを表示
したいときは、そのモジュールのメンバーに Verbose モードを追加してください。
Sub  SetupDebugTools()
  '--- start of parameters for vbslib include ---------
  g_debug = 0          '// release:0, debug:99, -1:call SetupDebugTools
  Sub SetupDebugTools() : set_input "" : SetBreakByFName Empty : End Sub
g_debug = 99  '// 上書きすることで、上記のデフォルトのコードを保護します。
Sub SetupDebugTools()  '// 関数も前の定義を上書きできます。
 del "C:\Users\user1\Desktop\TestData"
 set_input "1."
 SetBreakByFName "Out.xml"
End Sub
サンプル:
デバッグ時に main 関数を呼び出す直前で呼び出される関数。
また、この関数の中では、利便性のために
を発しません。
ただし、ファイルパスを指定するときは変数を使わないようにするなどして、予想外のファイル
を壊さないように注意してください。
(src)
通常、vbslib include に、SetupDebugTools 関数の定義を記述します。
デバッグ用に何らかの設定をしたり、ファイルを初期状態に戻すなどの処理を、この関数の
中に定義してください。 main 関数の最初に記述しても同じことができますが、vbslib を
インクルードする前に、vbslib など vbs_inc でインクルードする関数が使え、g_debug の設定
の直後に処理を記述できるため、デバッグ用のコードを一般のコードと区別できます。
→ [T_SetupDebugTools] デバッガ時の初期設定
テスト
Sub  WS2( Label as string, Value as variant )
Sub  WD2( Label as string, Value as variant )
Sub  WX2( Label as string, Value as variant )
Sub  MARK( Label as string, out_Count as variant )
ブレークしないで、変数の値を標準出力へ表示します。
スレッドの通過を表示します
文字列値を表示します
数値を表示します
数値を16進数で表示します
<WATCH label="var1" value="123"/>
出力例:
サンプル:
Dim  var1 : var1 = 123
WD2  "var1", var1
Dim  var1 : var1 = 123
Execute WD("var1")
Function  WD( Expression as string ) as string
Function  WS( Expression as string ) as string
Function  WX( Expression as string ) as string
数値を16進数で表示するコードを返します
数値を表示するコードを返します
文字列値を表示するコードを返します
(src)
MARK  "a", 0
関連
エラーが発生した後の処理を、デバッグする方法を示します。
まず、エラーが発生した瞬間を捕らえて、その場所に Stop 命令を記述します。
参考
… Stop 命令
を 99 など大きな数に設定して起動します。
Stop したら、ステップ実行します。
1.
2.
3.