(for Internet Explorer)
← ▼ ▲
↑
CheckWSHNetwork
→ CheckWSHNetwork フォルダ
WSH (wscript.exe, cscript.exe) に、ファイアウォールがネットワークアクセスを許可しているか
どうかをチェックするスクリプトです。
cscript.exe または wscript.exe に、ネットワークアクセスを許可すると危険かもしれませんが、
Windows7 のファイアウォールは、WSH によるネットワークアクセスをブロックしないで
実行できます。 （ダウンロードサーバーのドメインで識別するのかもしれません？）
CheckWSHNetwork.vbs をダブルクリックすると起動します。
← ▼ ▲
vbs_inc, vbslib include （vbslib のコア・システム）
vbs_inc.vbs
vbs_inc_setting.vbs
scriptlib
main
sample_lib
sample
vbs_inc ライブラリ本体
設定フォルダ
インクルードするライブラリのサンプル
メイン・スクリプト （vbslib includeを含む）
は、インクルードの方向
scriptlib フォルダの中の vbs_inc.vbs ファイルの中にあり、内部的に使われます。
→ g_vbslib_path
→ g_fs
→ g_sh
g_sh = WScript.CreateObject("WScript.Shell")
g_fs = CreateObject( "Scripting.FileSystemObject" )
vbs_inc.vbs の絶対パス
→ グローバル変数の初期化、g_InitializeModule
→ g_debug
デバッガに接続しているかどうか（するかどうか）
→ g_IncludePathes
インクルードする VBS ファイルのパスの配列
→ g_CommandPrompt
コマンドプロンプトで実行するかどうか
→ g_vbslib_folder
scriptlib フォルダの絶対パス。末尾に \ が付く
setting
vbs_inc の設定
→ Setting_getIncludePathes
Setting_getIncludePathes 関数
に書かれた .vbs ファ
vbs_inc は、次のグローバル変数を定義しています。
→ ライブラリ.vbs のルール
[ テスト ]
→ g_admin
起動時に管理者へログインするのかしないのか
複数の VBScript ファイルをインクルードするライブラリです。
→ g_is_cscript_exe
コマンドライン(cscript.exe)で実行しているかどうか
→ g_cut_old
古い関数でブレークするようにします。
→ g_Vers
バージョン番号の集合です。
→ g_vbslib_ver_folder
vbs_inc.vbs があるフォルダの絶対パス。末尾に \ が付く
→ g_debug_params
デバッガに接続するときのコマンドライン・パラメータ
→ vbs_inc/setting の処理フロー
参考
→ 正常終了時の動作
Main 関数
があるスクリプト・ファイルに、vbs_inc をインクルードするコード（vbslib include
Short Hand Prompt
を使って新規作成できるスクリプトなど
vbslib400
→ Main 関数
）が必要です。 そのコードは、
に入っているので参考にしてください。
vbslib include は、scriptlib\setting フォルダーの中にある .vbs ファイル（通常、
vbs_inc_setting.vbs） に書かれた
イルをロードします。
← ▼ ▲
メイン.vbs のグローバル変数
メイン・スクリプトのグローバル変数は、start of lib include 〜 end of lib include
の間にある、設定値を格納する場所で Dim/New してください。
Dim g_Test
Function InitializeModule
Set g_Test = New TestScript
End Function
Dim g_InitializeModule
Set g_InitializeModule = GetRef( "InitializeModule" )
'--- start of vbslib include -----------------------------
：
'--- start of parameters for vbslib include -------
：
g_CommandPrompt = 1
Dim g_ObjectA : Set g_ObjectA = New ObjectA
'--- end of parameters for vbslib include --------------
：
'--- end of vbslib include -------------------------------
ライブラリ・スクリプトのグローバル変数は、グローバル領域で Dim して、
InitializeModule 関数の中で初期化します。
g_InitializeModule に InitializeModule 関数のリファレンスを設定します。
'--- start of vbslib include -----------------------------
：
'--- start of parameters for vbslib include -------
'--- end of parameters for vbslib include --------------
：
'--- end of vbslib include -------------------------------
→ グローバル変数の初期化、後始末、g_InitializeModule、g_FinalizeModule
← ▼ ▲
AppKey.SetWritableMode F_IgnoreIfWarn
SetWritableMode
[WARNING] Out of Writable の警告が大量に出るときは、main2 の最初に次を記述してください。
main 関数を
main2
に置き換える。 元の main 関数は、コメントアウトする。
vbslib_updater - vbslib2 から vbslib3 へバージョンアップする
vbslib ヘッダ
にあるファイルをベースに vbslib400 フォルダを vbslib ヘッダに作成する。
g_IncludeType を、コメントアウトする。
vbslib_updater
下記の作業を自動的に行います。 ただし、手動で修正が必要な場合もあります。
一部の関数は、廃止されても移植性のために残してあるものがあります。
True に設定して、廃止される関数を呼び出すとブレークするので、見つけやすくなります。
バージョンアップを補助する
というツールを提供しています。
g_Vers
を追加し vbslib のバージョンを 3.0 に設定する。
vbslib ヘッダがある *.vbs ファイルに
g_cut_old
を
vbslib_updater ツール
アプリケーション・スクリプトの修正
scriptlib フォルダの ver2 と ver3 の共存
ver2 の scriptlib フォルダの vbs_inc.vbs を vbs_inc_200.vbs に改名し、
ver3 の scriptlib フォルダを ver2 の scriptlib フォルダにコピーすると、
上書きすることなく、ver2 と ver3 を共存できます。
← ▼ ▲
Main （メイン.vbs）
Sub Main( Opt as dictionary, AppKey as AppKeyClass )
vbslib を使うスクリプトは、Main から内容を記述します。
Sub Main()
echo "Hello, world!"
End Sub
'--- start of vbslib include ------------------------------
： （vbslib をインクルードして main を呼び出すコード）
ユーザ定義関数です。
引数はあってもなくてもかまいませんが、ファイルに出力するスクリプトは、
Main 関数が呼ばれるときのカレント・フォルダーは、スクリプトがあるフォルダー
になります。 WSH を起動したときのカレント・フォルダー（作業フォルダー）は、
に入っています。
g_start_in_path
Sub Main()
テスト
→ T_NewMain1 フォルダ
→ T_NewMain2 フォルダ
vbslib_inc のみの環境
vbslib がある環境
NewWritable メソッド
を呼ぶ必要があります。
AppKey 引数を使った
Sub Main( Opt, AppKey )
Dim w_:Set w_=AppKey.NewWritable( "." ).Enable()
echo "Hello, world!"
End Sub
'--- start of vbslib include ------------------------------
： （vbslib をインクルードして main を呼び出すコード）
NewWritable
にファイルを出力できるようにする
カレント・フォルダー
↓
サンプル
サンプル
main2 関数が定義されているときは呼ばれません。
vbslib include
vbslib include
Main 関数を定義しているスクリプト・ファイルの中に、
（vbslib をインクルードして Main を呼び出すコード）が必要です。
vbslib include
のコード
関連
→ GetMainSetting 関数 (vbsool)
← ▼ ▲
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 を使ってください。
← ▼ ▲
SetupVbslibParameters
Sub SetupVbslibParameters()
vbslib include の設定をします。
ユーザー定義関数です。
← ▼ ▲
g_fs
Dim g_fs as Scripting.FileSystemObject
Dim g_fs : Set g_fs = CreateObject( "Scripting.FileSystemObject" )
FileSystemObject
(src)
実装コード：
を参照するグローバル変数です。
← ▼ ▲
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)
← ▼ ▲
動作モード、デバッグ
← ▼ ▲
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_process
Dim g_debug_process as integer
何回目の子プロセスを起動したときにデバッガに接続するかどうか
g_debug_process は、
0 = メイン・プロセスをデバッガに接続する（g_debug>0 のとき）
1 = １回目にメイン・プロセスが起動した子プロセスをデバッガに接続する
2 = ２回目にメイン・プロセスが起動した子プロセスをデバッガに接続する
：
テスト
→ T_ChildProcessIDNest_Manually.vbs # Array
g_debug_process = Array(3,1)
孫プロセスを起動したときにデバッガに接続することもできます。
3回目に起動した子プロセスから１回目に呼び出す孫プロセス
g_debug_process = 1
サンプル
にユーザが記述します。
SetupVbslibParameters
← ▼ ▲
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_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=コマンドプロンプトを最小化ウィンドウで表示。
(src)
にユーザが記述します。
g_CommandPrompt は、
+4 は、他のオプションと複合するオプションです。
テスト
→ [T_ErrInfo] ユーザへのエラー通知とデバッガ接続
→ [T_CommandPrompt] プロンプトを開く、閉じるテスト
コマンドプロンプトなしのときは、wscript.exe で実行します。
コマンドプロンプトなしのときは、vbs ファイルをダブルクリックした瞬間は
wscript.exe で実行しますが、メインは、コマンド・プロンプト（cmd.exe）と、
cscript.exe で実行します。
SetupVbslibParameters
← ▼ ▲
g_is_cscript_exe
Dim g_is_cscript_exe as boolean
(src)
コマンドライン(cscript.exe)で実行しているかどうか
← ▼ ▲
g_admin
Dim g_admin as integer
起動時に管理者へログインするのかしないのか
g_admin は、
0 = 起動時に管理者へログインしない
1 = 起動時に管理者へログインする
Windows XP では、制限ユーザーから管理者へログインする設定にすると、起動時に管理者の
パスワードを入力するようになります。 自分が管理者であるときは、入力を求められません。
Windows Vista/7 では、vbs ファイルをダブルクリックした直後に、昇格の確認が求められます。
に設定してください
Setting_getAdminUserName
Windows XP では、管理者のユーザ名を
→ [T_Admin]
(src)
テスト
参考
→ IShellDispatch2::ShellExecute
の runas
→ sudo
関連
→ アカウント
にユーザが記述します。
SetupVbslibParameters
← ▼ ▲
g_is_admin
Dim g_is_admin as boolean
管理者のグループに入っているかどうか。
(src)
Windows Vista 以降では、UAC を確認した後で true になります。
← ▼ ▲
ファイルまたはフォルダのパス
← ▼ ▲
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
← ▼ ▲
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_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 が呼ばれる順序
←
↓