(for Internet Explorer)
Sub  main2( Opt as dictionary, AppKey as AppKeyClass )
vbslib を使うスクリプトは、main2 から内容を記述します。
サンプル:
Sub  main2( Opt, AppKey )
  Dim w_:Set w_=AppKey.NewWritable( "." ).Enable()

  echo "Hello, world!"
End Sub
ユーザ定義関数です。

ファイルを出力するスクリプトは、出力するフォルダを、下記サンプルの NewWritable の引数に
指定することで、出力して良いかユーザに確認しなくなります。 ただし、Windows フォルダや
Program Files フォルダなどは必ず確認します。
にファイルを出力できるようにする
main 関数が呼ばれるときのカレント・フォルダーは、スクリプトがあるフォルダーになります。
WSH を起動したときのカレント・フォルダー(作業フォルダー)は、
に入っています。
廃止予定です。 main を使ってください。
Sub  SetupVbslibParameters()
vbslib include の設定をします。
ユーザー定義関数です。 通常、メイン・スクリプト・ファイルの最後にあります。
次の変数を設定できます。
サンプル
Sub  SetupVbslibParameters()
    '--- start of parameters for vbslib include -------------------------------
    '// g_Vers("OldMain") = 1
    g_vbslib_path = "scriptlib\vbs_inc.vbs"
    g_CommandPrompt = 2
    g_debug = 0
    '--- end of parameters for vbslib include ---------------------------------
End Sub
Dim  g_fs  as  Scripting.FileSystemObject
Dim g_fs : Set  g_fs = CreateObject( "Scripting.FileSystemObject" )
(src)
実装コード:
を参照するグローバル変数です。
Dim  g_sh  as  WScript.Shell
vbs_inc.vbs をインクルードした後に使えます。
Dim g_sh : Set  g_sh = WScript.CreateObject( "WScript.Shell" )
(src)
Dim  g_debug  as integer
デバッガに接続しているかどうか(するかどうか)。 何番目のエラーでブレークするか。
(src)
にユーザが記述します。
g_debug は、
0 = デバッガに接続しない
1 = デバッガに接続する、BreakErrID = 1
1.5 = デバッガに接続する、BreakErrID = 1.5
2 = デバッガに接続する、BreakErrID = 2

-1 = デバッガに接続しないが、
参考
テスト
99 など大きい数 = デバッガに接続する(エラーが発生しないとき)
を呼び出す。
もしくは、
Dim  g_debug_tree  as Array of integer
エラーが発生した場所の詳細情報。 ブレークするために使われる情報です。
プログラムを On Error Resume Next 〜 On Error Goto 0 のブロックのツリー構造として
見たときの情報になっています。 ユーザーは、エラーが発生したときに表示される
g_debug_tree に設定する値をそのままお使いください。 表示されなかったときは、設定
する必要はありません。
テスト
→ T_Err2_Tree フォルダ
(src)
サンプル:
Dim  g_debug_tree = Array( 1, 2 )
参考
にユーザが記述します。
g_debug_tree は、
もしくは、
Dim  g_debug_process  as integer
何回目の子プロセスを起動したときにデバッガに接続するかどうか。
0 = メイン・プロセスをデバッガに接続する(g_debug>0 のとき)
1 = 1回目にメイン・プロセスが起動した子プロセスをデバッガに接続する
2 = 2回目にメイン・プロセスが起動した子プロセスをデバッガに接続する
テスト
→ T_ChildProcessIDNest_Manually.vbs # Array
g_debug_process = Array(3,1)
孫プロセスを起動したときにデバッガに接続することもできます。
3回目に起動した子プロセスから1回目に呼び出す孫プロセス
g_debug_process = 1
サンプル
参考
にユーザが記述します。
g_debug_process は、
もしくは、
コールツリー
'// g_debug_process
// "/g_debug" オプションを g_debug_process 変数へ
(src)
CallFinalizeInModules
(src)
ChangeScriptMode
If g_debug_process > 0 Then
WScript.Echo  "<WARNING msg=""g_debug_process > 0 です。
(src)
InitializeModule
If IsNumeric( g_debug_process ) Then
    g_Err2.Break_ChildProcess_CallID.Add  g_debug_process
ElseIf IsArray( g_debug_process ) Then
    g_Err2.Break_ChildProcess_CallID.Copy  g_debug_process
// g_Err2.Break_ChildProcess_CallID へ
// デバッグ モードから戻すように警告する
RunProg
(src)
cmdline = "cscript //x "+
If g_InterProcess.ProcessCallID(i) + 1 = g_Err2.Break_ChildProcess_CallID(i) Then
'// Break in ChildProcess by "g_debug_process"
// デバッガーと接続して起動する
→ T_ChildProcessIDNest_Manually2.vbs
g_InterProcess.ProcessCallID(0) + 1
現在は何回目のプロセス番号か
False = 接続していない
True = 接続している
If g_is_debug Then
Dim  g_debug_params  as integer
デバッガに接続するときのコマンドライン・パラメータ
通常、.vbs ファイルをダブルクリックすると、コマンドライン・パラメータは何も設定
されませんが、g_debug_param に代入すると設定されます。
g_debug = -1 または 1以上に設定しないと、g_debug_params は無効になります。
サンプル:
  '--- start of parameters for vbslib include ---------
Dim g_debug_params : g_debug_params = "test.txt"
(src)
→ T_DebugParam フォルダ
テスト
Dim  g_debug_or_test  as integer
デバッグ時、またはデバッグ時のテストかどうか。
自動テストを行うことができるデバッグ機能は、g_debug ではなく g_debug_or_test
値が True のときに行います。
(src)
Dim  g_CommandPrompt  as integer
コマンドプロンプトを表示するかどうか
0= コマンドプロンプトなし。メッセージは標準ダイアログで表示。
1= コマンドプロンプトあり。終了するとすぐに閉じる。 エラーが発生したときは閉じない。
2= コマンドプロンプトあり。終了しても閉じない。
+4=コマンドプロンプトを最小化ウィンドウで表示。
にユーザが記述します。
g_CommandPrompt は、
+4 は、他のオプションと複合するオプションです。
テスト
コマンドプロンプトなし(=0)のときは、wscript.exe で実行します。
関連
コマンドプロンプトから cscript.exe 経由でスクリプトを起動したときは、同じウィンドウで実行します。
ただし、64ビットのコマンドプロンプトから起動したとき、
が False(デフォルト)なら、
32ビットのコマンド・プロンプト(cmd.exe)である、新しいウィンドウで実行します。
コマンドプロンプトありのときは、cscript.exe で実行します。
ただし、vbs ファイルをダブルクリックした瞬間はwscript.exe で実行しますが、wscript.exe が新しく
コマンド・プロンプト(cmd.exe)のプロセスを作成し、そこで cscript.exe を実行します。
64ビット cmd.exe
64ビットWindows
32ビットWindows
32ビット cmd.exe
%windir%\System32\cmd.exe
%windir%\SysWOW64\cmd.exe
%windir%\System32\cmd.exe
-
(src)
動作のしくみ
g_CommandPrompt = 0 を設定していても、ウィンドウが開いてしまう原因は、他にもあります。
・コマンドライン用の exe を実行したとき (g_CommandPrompt = 5 で最小化はできます)
するときのリンク先(コマンドライン)に cmd.exe /K を指定したとき
・バッチファイルから実行したとき
Sample.vbs /close:0
コマンドプロンプトを表示するかどうかの設定。
このオプションがあるときは、g_CommandPrompt の設定が無視されます。
(src)
関連
Sub  ChangeScriptMode();
必要に応じて、子プロセスでスクリプトを実行します。
ソース
→ vbslib_mini.vbs
→ vbs_inc_sub.vbs
vbslib_mini.vbs ファイルを使うときは、明示的に呼び出してください。
→ sample without vbslib.vbs
関連
子プロセスを起動する理由は、次のものがあります。
・コマンドプロンプトのウィンドウを開くために、wscript.exe から cscript.exe を起動する
・デバッガーに接続するために、//x オプションをつけて cscript.exe または cscript.exe
 を起動する
・管理者として実行するために、runas コマンド経由で wscript.exe または cscript.exe
 を起動する
・64ビットのコマンドプロンプトから起動したときに、32ビットの wscript.exe または
 cscript.exe を起動する。 この場合は、新しいウィンドウが開きます。
ChangeScriptMode 関数は、vbslib を使うときに、自動的に呼ばれます。
Dim  g_is_cscript_exe  as boolean
(src)
コマンドライン(cscript.exe)で実行しているかどうか
Dim  g_admin  as integer
起動時に管理者へログインするのかしないのか
g_admin の設定値は、メインの .vbs ファイルの中の
0 = 起動時に管理者へログインしない
1 = 起動時に管理者へログインする
Windows XP では、制限ユーザーから管理者へログインする設定にすると、起動時に管理者の
パスワードを入力するようになります。 自分が管理者であるときは、入力を求められません。
Windows Vista/7 では、vbs ファイルをダブルクリックした直後に、昇格の確認が求められます。
に設定してください
Windows XP では、管理者のユーザ名を
(src)
テスト
参考
の runas
関連
→ アカウント
に記述します。
通常、
を使ってください。
Dim  g_is_admin  as boolean
管理者のグループに入っているかどうか。
(src)
Windows Vista 以降では、UAC を確認した後で true になります。
Dim  g_is64bitWindows  as boolean
スクリプトが動いている OS が、64ビットWindows かどうか。
(src)
関連
→ 64ビットWindows (WOW64)
Dim  g_is64bitWSH  as boolean
スクリプトを動かすホスト、または、動いているホストが、64ビット WSH かどうか。
64ビット Windows では、vbslib を使うスクリプトは 64ビット版 WSH で起動され、起動直後に
32ビット WSH に切り替わりますが、SetupVbslibParameters 関数の中で、
g_is64bitWSH = True と設定すると、64ビット Windows では、64ビット WSH にのままなります。
ただし、メイン.vbs の最後にある vbslib include の中に Dim  g_is64bitWSH が記述されている
必要があります。 参考: vbslib Prompt.vbs の内容

Main 関数を呼び出した後は、g_is64bitWSH の値は、実際に動いている WSH のバージョンに
従った値になります。
(src)
関連
g_is64bitWindows = True
g_is64bitWSH = True
g_is64bitWindows = False
g_is64bitWSH = False
%windir%\System32\cscript.exe
%windir%\SysWOW64\cscript.exe
%windir%\System32\cscript.exe
-
    If g_is64bitWindows = g_is64bitWSH Then
        cscript_exe = env("%windir%\System32\cscript.exe")
    Else
        cscript_exe = env("%windir%\SysWOW64\cscript.exe")
    End If
サンプル
32ビット Windows では、g_is64bitWSH の値は無視されます。
ファイルまたはフォルダのパス
Dim  g_start_in_path  as string
プロセス起動時のカレント・フォルダーのフル・パス。
(src)
vbslib ver4 以降では、main 関数を呼ばれたときのカレント・フォルダーは、メイン.vbs ファイルが
あるフォルダーになります。 そのため、プロセス起動時のカレント・フォルダーは、g_start_in_path
から取得する必要があります。

このように変更した理由は、書かれたスクリプトが、汎用コマンドとして使われることより、
スクリプトがあるフォルダーに対して固有の処理を行うことが多いためです。

g_start_in_path を変更すると、InputPath の基準フォルダーを変更することができます。
サンプル:
cd  g_start_in_path
Sub  main2( Opt, AppKey )
  Dim  ds_:Set ds_= new CurDirStack
  pushd  g_start_in_path
    :
  popd
End Sub
サンプル:
関連
コマンド・プロンプトから、プログラムを実行するときのパラメーターに、ファイルのパスを指定
するときは、カレント・ディレクトリからの相対パスを指定します。 たとえば、cl a.c のように
cl コマンドに指定した a.c は、カレント・ディレクトリにある a.c ファイルを指しています。

このとき、cl.exe の実行ファイルは、環境変数 PATH で指定されたディレクトリのどこかにあり、
a.c は、cl.exe があるディレクトリにある a.c ファイルではありません。

しかし、この法則は、スクリプトを記述するときに問題になります。cl.exe のように使えるスク
リプト script.vbs を開発したとしましょう。スクリプトから、cl a.c を実行するように記述するときは、
素直にcl a.c とスクリプトに記述するでしょう。 このとき、a.c は、スクリプトがあるフォルダー
からの相対パスを指定するはずです。 カレント・ディレクトリからの相対パスではありません。

どういうことかというと、通常、カレント・ディレクトリは、スクリプトがあるディレクトリではなく、
スクリプトを起動したときのディレクトリのままになるのですが、これでは、他のフォルダーから
スクリプトを起動したとき、a.c というファイルは、起動したときのカレント・ディレクトリにある
a.c というファイルになってしまうのです。 起動したときのカレント・ディレクトリにある a.c を
意図してスクリプトを記述することなど、ほとんど無いので、カレント・ディレクトリが、起動した
ときのカレント・ディレクトリであるという仕様は、扱いにくいのです。

vbslib4 では、main 関数を実行するときのカレント・ディレクトリは、スクリプトがあるディレク
トリになっています。これにより、多くのケースで、スクリプトに記述したファイル、たとえば a.c
が、意図したとおりのファイルを指定することになります。

一方で、起動したときのディレクトリは、g_start_in_path グローバル変数を参照するようになっ
ています。 起動時のパラメーターに指定した相対パスは、g_start_in_path を基準とした絶対
パスに変換する必要があります。 しかし、多くの場合、それに気をつける必要はありません。
ショートハンド・プロンプトに対応したスクリプト(InputCommand 関数を使ったスクリプト)は、
自動的にコマンド・プロンプトから起動することもできるようになるのですが、そのときに、
パラメーターに指定した相対パスは、InputPath 関数で取得でき、それは、g_start_in_path から
の相対パスであるとして、フル・パスを返すからです。

カレント・ディレクトリは、スクリプトがあるディレクトリがいいか、起動時のカレント・ディレクトリ
がいいか、という話ではなく、どちらの相対パスも自動的に適切に扱えるように工夫されて
いるのです。
カレント・ディレクトリとスクリプトがあるディレクトリ
テスト
vbs_inc.vbs のフル・パス
Dim  g_vbslib_path  as string
vbs_inc.vbs をインクルードする前
vbs_inc.vbs をインクルードした後
vbs_inc.vbs の相対パス。
相対パスの基準は、すべてのスクリプトのベースフォルダなど。
(src)
インクルードする前の g_vbslib_path は、
にユーザが記述します。
Dim  g_vbslib_folder  as string
(src)
→ g_vbslib_parent_folder
g_Ver の設定に関わらず、最初の scriptlib フォルダの親になります。
scriptlib フォルダのフル・パス。末尾に \ が付きます。
関連
copy  Left( g_vbslib_folder, Len( g_vbslib_folder ) - 1 ), "C:\NewScriptFolder"
サンプル
Dim  g_vbslib_ver_folder  as string
(src)
関連
g_Ver の設定によって、フォルダパスは変わります。
vbs_inc_XXX.vbs があるフォルダのフル・パス。末尾に \ が付きます。
Dim  g_SrcPath as string
g_IncludePathes
で、グローバル領域を実行しているとき、
インクルードしているスクリプトファイル(.vbs)のフル・パス。
(src)
だけ定義されます。
g_SrcPath のサンプルがあります
参考
g_SrcPath のサンプルがあります
Dim  g_MainPath as string
メイン.vbs のスクリプトファイル(.vbs)のフル・パス。
(src)
' Global Variable
Dim  g_Test

Function  InitializeModule( ThisPath )
  Set  g_Test = new TestScript : ErrCheck : Set g_TestScriptGlobals.Test = g_Test
End Function
Dim  g_InitializeModule
Set  g_InitializeModule = GetRef( "InitializeModule" )

Function  FinalizeModule( ThisPath, Reason )
  g_Test.Finish
End Function
Dim g_FinalizeModule: Set g_FinalizeModule = GetRef( "FinalizeModule" )
Dim g_FinalizeLevel:      g_FinalizeLevel  = 100  ' If smaller, called early
vbs_inc.vbs でインクルードするモジュールの中にあるグローバル変数は、下記のように
初期化関数を g_InitializeModule に設定してください。後始末が必要なら、g_FinalizeModule
と g_FinalizeLevel を設定してください。 g_FinalizeLevel が小さいモジュールほど先に呼ばれます。
これらによって、グローバル変数の初期化や後始末の順番を制御します。
サンプル (TestScript.vbs)
(src)
配列のグローバル変数
  '--- start of parameters for vbslib include -------------------------------
Dim  g_LineOfThreadSwitch()
main より後のグローバル領域に、配列を宣言すると、main 関数終了後にエラーになることが
あります。そのときは、下記のように SetupVbslibParameters の中で宣言してください。
初期化関数で依存するモジュールがなくても、(モジュール).vbs をダブルクリックして、
文法チェックができます。

Setting_getIncludePathes にモジュールを登録して、vbs_inc.vbs をダブルクリックすると、
初期化、後始末のテストができます。
参考
同じモジュールの中のオブジェクトの Class_Terminate が呼ばれる順番は、グローバル変数に
格納した順番と同じです。