(for Internet Explorer)
→ CheckWSHNetwork フォルダ
WSH (wscript.exe, cscript.exe) に、ファイアウォールがネットワークアクセスを許可しているか
どうかをチェックするスクリプトです。
cscript.exe または wscript.exe に、ネットワークアクセスを許可すると危険かもしれませんが、
Windows7 のファイアウォールは、WSH によるネットワークアクセスをブロックしないで
実行できます。 (ダウンロードサーバーのドメインで識別するのかもしれません?)
CheckWSHNetwork.vbs をダブルクリックすると起動します。
vbs_inc.vbs
scriptlib
main
sample_lib
sample
vbs_inc ライブラリ本体
設定フォルダ
インクルードするライブラリのサンプル
は、インクルードの方向
scriptlib フォルダの中の vbs_inc.vbs ファイルの中にあり、内部的に使われます。
g_sh = WScript.CreateObject("WScript.Shell")
g_fs = CreateObject( "Scripting.FileSystemObject" )
vbs_inc.vbs の絶対パス
デバッガに接続しているかどうか(するかどうか)
→ g_IncludePathes
インクルードする VBS ファイルのパスの配列
コマンドプロンプトで実行するかどうか
scriptlib フォルダの絶対パス。末尾に \ が付く
vbs_inc の設定
に書かれた .vbs ファ
vbs_inc は、次のグローバル変数を定義しています。
[ テスト ]
起動時に管理者へログインするのかしないのか
複数の VBScript ファイルをインクルードするライブラリです。
コマンドライン(cscript.exe)で実行しているかどうか
古い関数でブレークするようにします。
バージョン番号の集合です。
vbs_inc.vbs があるフォルダの絶対パス。末尾に \ が付く
デバッガに接続するときのコマンドライン・パラメータ
参考
があるスクリプト・ファイルに、vbs_inc をインクルードするコード(vbslib include
を使って新規作成できるスクリプトなど
vbslib400
)が必要です。 そのコードは、
に入っているので参考にしてください。
vbslib include は、scriptlib\setting フォルダーの中にある .vbs ファイル(通常、
vbs_inc_setting.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 -------------------------------
  AppKey.SetWritableMode  F_IgnoreIfWarn
[WARNING] Out of Writable の警告が大量に出るときは、main2 の最初に次を記述してください。
main 関数を
に置き換える。 元の main 関数は、コメントアウトする。
にあるファイルをベースに vbslib400 フォルダを vbslib ヘッダに作成する。
g_IncludeType を、コメントアウトする。
vbslib_updater
下記の作業を自動的に行います。 ただし、手動で修正が必要な場合もあります。
一部の関数は、廃止されても移植性のために残してあるものがあります。
True に設定して、廃止される関数を呼び出すとブレークするので、見つけやすくなります。
バージョンアップを補助する
というツールを提供しています。
を追加し vbslib のバージョンを 3.0 に設定する。
vbslib ヘッダがある *.vbs ファイルに
vbslib_updater ツール
アプリケーション・スクリプトの修正
scriptlib フォルダの ver2 と ver3 の共存
ver2 の scriptlib フォルダの vbs_inc.vbs を vbs_inc_200.vbs に改名し、
ver3 の scriptlib フォルダを ver2 の scriptlib フォルダにコピーすると、
上書きすることなく、ver2 と ver3 を共存できます。
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 を起動したときのカレント・フォルダー(作業フォルダー)は、
に入っています。
Sub  Main()
テスト
→ T_NewMain1 フォルダ
→ T_NewMain2 フォルダ
vbslib_inc のみの環境
vbslib がある環境
を呼ぶ必要があります。
AppKey 引数を使った
Sub  Main( Opt, AppKey )
  Dim w_:Set w_=AppKey.NewWritable( "." ).Enable()

  echo "Hello, world!"
End Sub

'--- start of vbslib include ------------------------------
  :   (vbslib をインクルードして main を呼び出すコード)
にファイルを出力できるようにする
サンプル
サンプル
main2 関数が定義されているときは呼ばれません。
Main 関数を定義しているスクリプト・ファイルの中に、
(vbslib をインクルードして Main を呼び出すコード)が必要です。
のコード
関連
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 の設定をします。
ユーザー定義関数です。
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 = デバッガに接続しないが、
参考
→ [T_ErrInfo] ユーザへのエラー通知とデバッガ接続
テスト
→ [T_Err2] Err2 オブジェクトとデバッガーのテスト
99 など大きい数 = デバッガに接続する(エラーが発生しないとき)
を呼び出す。
→ [T_StartFromOther] スクリプトが無いフォルダーから起動したとき
Dim  g_debug_process  as integer
何回目の子プロセスを起動したときにデバッガに接続するかどうか
g_debug_process は、
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
サンプル
にユーザが記述します。
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 )
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=コマンドプロンプトを最小化ウィンドウで表示。
(src)
にユーザが記述します。
g_CommandPrompt は、
+4 は、他のオプションと複合するオプションです。
テスト
→ [T_ErrInfo] ユーザへのエラー通知とデバッガ接続
→ [T_CommandPrompt] プロンプトを開く、閉じるテスト
コマンドプロンプトなしのときは、wscript.exe で実行します。
コマンドプロンプトなしのときは、vbs ファイルをダブルクリックした瞬間は
wscript.exe で実行しますが、メインは、コマンド・プロンプト(cmd.exe)と、
cscript.exe で実行します。
Dim  g_is_cscript_exe  as boolean
(src)
コマンドライン(cscript.exe)で実行しているかどうか
Dim  g_admin  as integer
起動時に管理者へログインするのかしないのか
g_admin は、
0 = 起動時に管理者へログインしない
1 = 起動時に管理者へログインする
Windows XP では、制限ユーザーから管理者へログインする設定にすると、起動時に管理者の
パスワードを入力するようになります。 自分が管理者であるときは、入力を求められません。
Windows Vista/7 では、vbs ファイルをダブルクリックした直後に、昇格の確認が求められます。
に設定してください
Windows XP では、管理者のユーザ名を
→ [T_Admin]
(src)
テスト
参考
の runas
関連
→ アカウント
にユーザが記述します。
Dim  g_is_admin  as boolean
管理者のグループに入っているかどうか。
(src)
Windows Vista 以降では、UAC を確認した後で true になります。
ファイルまたはフォルダのパス
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 から
の相対パスであるとして、絶対パスを返すからです。

カレント・ディレクトリは、スクリプトがあるディレクトリがいいか、起動時のカレント・ディレクトリ
がいいか、という話ではなく、どちらの相対パスも自動的に適切に扱えるように工夫されて
いるのです。
カレント・ディレクトリとスクリプトがあるディレクトリ
→ [T_StartFromOther] スクリプトが無いフォルダーから起動したとき
テスト
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 フォルダの絶対パス。末尾に \ が付く
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 のサンプルがあります
' 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 が呼ばれる順番は、グローバル変数に
格納した順番と同じです。