(for Internet Explorer)
← ▼ ▲
↑
main2
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 フォルダなどは必ず確認します。
NewWritable
にファイルを出力できるようにする
カレント・フォルダー
main 関数が呼ばれるときのカレント・フォルダーは、スクリプトがあるフォルダーになります。
WSH を起動したときのカレント・フォルダー（作業フォルダー）は、
に入っています。
g_start_in_path
↓
廃止予定です。 main を使ってください。
<< vbs_inc
← ▼ ▲
SetupVbslibParameters
Sub SetupVbslibParameters()
vbslib include の設定をします。
ユーザー定義関数です。 通常、メイン・スクリプト・ファイルの最後にあります。
→ g_debug
→ g_debug_process
→ g_debug_tree
次の変数を設定できます。
サンプル
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
→ g_CommandPrompt
→ g_vbslib_path
g_CommandPrompt
g_vbslib_path
g_debug
<< vbs_inc
← ▼ ▲
g_fs
Dim g_fs as Scripting.FileSystemObject
Dim g_fs : Set g_fs = CreateObject( "Scripting.FileSystemObject" )
FileSystemObject
(src)
実装コード：
を参照するグローバル変数です。
<< vbs_inc
← ▼ ▲
g_sh
Dim g_sh as WScript.Shell
vbs_inc.vbs をインクルードした後に使えます。
Dim g_sh : Set g_sh = WScript.CreateObject( "WScript.Shell" )
→ WScript.Shell オブジェクト (WshShell オブジェクト)
(src)
<< vbs_inc
← ▼ ▲
動作モード、デバッグ
← ▼ ▲
g_debug
Dim g_debug as integer
デバッガに接続しているかどうか（するかどうか）。 何番目のエラーでブレークするか。
→ g_debug - デバッグを開始する
(src)
にユーザが記述します。
g_debug は、
0 = デバッガに接続しない
1 = デバッガに接続する、BreakErrID = 1
1.5 = デバッガに接続する、BreakErrID = 1.5
2 = デバッガに接続する、BreakErrID = 2
：
-1 = デバッガに接続しないが、
→ Err2::BreakErrID
参考
→ [T_ErrInfo] ユーザへのエラー通知とデバッガ接続
テスト
→ [T_Err2] Err2 オブジェクトとデバッガーのテスト
99 など大きい数 = デバッガに接続する（エラーが発生しないとき）
SetupDebugTools
を呼び出す。
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
→ [T_StartFromOther] スクリプトが無いフォルダーから起動したとき
SetupVbslibParameters
もしくは、
/g_debug オプション
→ g_is_debug
← ▼ ▲
g_debug_tree
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 - デバッグを開始する
参考
にユーザが記述します。
g_debug_tree は、
SetupVbslibParameters
もしくは、
/g_debug オプション
← ▼ ▲
g_debug_process
Dim g_debug_process as integer
何回目の子プロセスを起動したときにデバッガに接続するかどうか。
0 = メイン・プロセスをデバッガに接続する（g_debug>0 のとき）
1 = １回目にメイン・プロセスが起動した子プロセスをデバッガに接続する
2 = ２回目にメイン・プロセスが起動した子プロセスをデバッガに接続する
：
テスト
→ T_ChildProcessIDNest_Manually.vbs # Array
g_debug_process = Array(3,1)
孫プロセスを起動したときにデバッガに接続することもできます。
3回目に起動した子プロセスから１回目に呼び出す孫プロセス
g_debug_process = 1
サンプル
→ g_debug - デバッグを開始する
参考
にユーザが記述します。
g_debug_process は、
SetupVbslibParameters
もしくは、
/g_debug オプション
コールツリー
'// 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
現在は何回目のプロセス番号か
← ▼ ▲
g_is_debug
False = 接続していない
True = 接続している
If g_is_debug Then
← ▼ ▲
g_debug_params
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 フォルダ
テスト
← ▼ ▲
g_debug_or_test
Dim g_debug_or_test as integer
デバッグ時、またはデバッグ時のテストかどうか。
自動テストを行うことができるデバッグ機能は、g_debug ではなく g_debug_or_test
値が True のときに行います。
(src)
← ▼ ▲
g_CommandPrompt
Dim g_CommandPrompt as integer
コマンドプロンプトを表示するかどうか
0= コマンドプロンプトなし。メッセージは標準ダイアログで表示。
1= コマンドプロンプトあり。終了するとすぐに閉じる。 エラーが発生したときは閉じない。
2= コマンドプロンプトあり。終了しても閉じない。
+4=コマンドプロンプトを最小化ウィンドウで表示。
にユーザが記述します。
g_CommandPrompt は、
+4 は、他のオプションと複合するオプションです。
テスト
→ [T_ErrInfo] ユーザへのエラー通知とデバッガ接続
→ [T_CommandPrompt] プロンプトを開く、閉じるテスト
コマンドプロンプトなし(=0)のときは、wscript.exe で実行します。
SetupVbslibParameters
→ ChangeScriptMode
→ g_is_cscript_exe
関連
コマンドプロンプトから cscript.exe 経由でスクリプトを起動したときは、同じウィンドウで実行します。
ただし、64ビットのコマンドプロンプトから起動したとき、
g_is64bitWSH
が 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
-
→ コマンドプロンプト、コンソール (cmd.exe)
(src)
→ /close オプション
→ 正常終了時の動作
→ 処理フロー （vbs_inc/setting）
動作のしくみ
ウィンドウが開いてしまうとき
g_CommandPrompt = 0 を設定していても、ウィンドウが開いてしまう原因は、他にもあります。
・コマンドライン用の exe を実行したとき （g_CommandPrompt = 5 で最小化はできます）
・ショートカットから実行
するときのリンク先（コマンドライン）に cmd.exe /K を指定したとき
・バッチファイルから実行したとき
← ▼ ▲
/close オプション
Sample.vbs /close:0
コマンドプロンプトを表示するかどうかの設定。
このオプションがあるときは、g_CommandPrompt の設定が無視されます。
(src)
関連
→ g_CommandPrompt
← ▼ ▲
ChangeScriptMode
Sub ChangeScriptMode();
必要に応じて、子プロセスでスクリプトを実行します。
ソース
→ vbslib_mini.vbs
→ vbs_inc_sub.vbs
vbslib_mini.vbs ファイルを使うときは、明示的に呼び出してください。
→ sample without vbslib.vbs
関連
→ VBScript - 常に cscript.exe で実行する （コマンドプロンプトを出す）
子プロセスを起動する理由は、次のものがあります。
・コマンドプロンプトのウィンドウを開くために、wscript.exe から cscript.exe を起動する
・デバッガーに接続するために、//x オプションをつけて cscript.exe または cscript.exe
を起動する
→ g_CommandPrompt
・管理者として実行するために、runas コマンド経由で wscript.exe または cscript.exe
を起動する
・64ビットのコマンドプロンプトから起動したときに、32ビットの wscript.exe または
cscript.exe を起動する。 この場合は、新しいウィンドウが開きます。
ChangeScriptMode 関数は、vbslib を使うときに、自動的に呼ばれます。
← ▼ ▲
g_is_cscript_exe
Dim g_is_cscript_exe as boolean
(src)
コマンドライン(cscript.exe)で実行しているかどうか
← ▼ ▲
g_admin
Dim g_admin as integer
起動時に管理者へログインするのかしないのか
g_admin の設定値は、メインの .vbs ファイルの中の
0 = 起動時に管理者へログインしない
1 = 起動時に管理者へログインする
Windows XP では、制限ユーザーから管理者へログインする設定にすると、起動時に管理者の
パスワードを入力するようになります。 自分が管理者であるときは、入力を求められません。
Windows Vista/7 では、vbs ファイルをダブルクリックした直後に、昇格の確認が求められます。
に設定してください
Setting_getAdminUserName
Windows XP では、管理者のユーザ名を
→ [T_Admin]
(src)
テスト
参考
→ IShellDispatch2::ShellExecute
の runas
→ sudo
関連
→ アカウント
に記述します。
SetupVbslibParameters
通常、
sudo
を使ってください。
← ▼ ▲
g_is_admin
Dim g_is_admin as boolean
管理者のグループに入っているかどうか。
(src)
Windows Vista 以降では、UAC を確認した後で true になります。
← ▼ ▲
g_is64bitWindows
Dim g_is64bitWindows as boolean
スクリプトが動いている OS が、64ビットWindows かどうか。
(src)
関連
→ 64ビットWindows (WOW64)
→ g_is64bitWSH
← ▼ ▲
g_is64bitWSH
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
→ 32ビットWindows と 64ビットWindows の WSH
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 の値は無視されます。
← ▼ ▲
ファイルまたはフォルダのパス
← ▼ ▲
g_start_in_path
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
サンプル：
関連
→ InputPath
コマンド・プロンプトから、プログラムを実行するときのパラメーターに、ファイルのパスを指定
するときは、カレント・ディレクトリからの相対パスを指定します。 たとえば、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 から
の相対パスであるとして、フル・パスを返すからです。
カレント・ディレクトリは、スクリプトがあるディレクトリがいいか、起動時のカレント・ディレクトリ
がいいか、という話ではなく、どちらの相対パスも自動的に適切に扱えるように工夫されて
いるのです。
カレント・ディレクトリとスクリプトがあるディレクトリ
→ [T_StartFromOther] スクリプトが無いフォルダーから起動したとき
テスト
← ▼ ▲
g_vbslib_path
vbs_inc.vbs のフル・パス
Dim g_vbslib_path as string
vbs_inc.vbs をインクルードする前
vbs_inc.vbs をインクルードした後
vbs_inc.vbs の相対パス。
相対パスの基準は、すべてのスクリプトのベースフォルダなど。
(src)
インクルードする前の g_vbslib_path は、
にユーザが記述します。
SetupVbslibParameters
← ▼ ▲
g_vbslib_folder
Dim g_vbslib_folder as string
(src)
→ scriptlib フォルダー
→ g_vbslib_parent_folder
g_Ver の設定に関わらず、最初の scriptlib フォルダの親になります。
scriptlib フォルダのフル・パス。末尾に \ が付きます。
→ g_vbslib_ver_folder
関連
→ WriteVBSLibFooter
copy Left( g_vbslib_folder, Len( g_vbslib_folder ) - 1 ), "C:\NewScriptFolder"
サンプル
← ▼ ▲
g_vbslib_ver_folder
Dim g_vbslib_ver_folder as string
(src)
→ scriptlib フォルダー
関連
→ g_vbslib_folder
g_Ver の設定によって、フォルダパスは変わります。
vbs_inc_XXX.vbs があるフォルダのフル・パス。末尾に \ が付きます。
← ▼ ▲
g_SrcPath
→ デバッガで開いているソースのパスを知る
Dim g_SrcPath as string
g_IncludePathes
や
include
call_vbs
や
で、グローバル領域を実行しているとき、
インクルードしているスクリプトファイル(.vbs)のフル・パス。
(src)
だけ定義されます。
→ get_DefineInfoObject
g_SrcPath のサンプルがあります
参考
g_SrcPath のサンプルがあります
← ▼ ▲
g_MainPath
Dim g_MainPath as string
メイン.vbs のスクリプトファイル(.vbs)のフル・パス。
(src)
← ▼ ▲
グローバル変数の初期化、後始末、g_InitializeModule、g_FinalizeModule
' 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 が呼ばれる順番は、グローバル変数に
格納した順番と同じです。
→ Class_Terminate が呼ばれる順序
←
↓