(for Internet Explorer)
← ▼ ▲
↑
Bench
Sub Bench( SectionNum as integer )
セクション（全体の中の一部の区間）の処理時間の計測を開始します。
参考
【引数】
SectionNum
セクションの識別番号
計測するセクションの開始位置に、SectionNum に１以上の値を指定して、Bench を呼び出してください。
計測するセクションの終了位置に、SectionNum に０を指定して、Bench を呼び出してください。
計測するセクションの終了位置が、次のセクションの開始位置であるときは、SectionNum に０を指定
しなくても、次のセクションの識別番号を指定できます。
ファイル：
vbslib.vbs
(src)
→ BenchStart
← ▼ ▲
BenchEnd
参考
Sub BenchEnd()
全体の処理時間の計測を終了し、計測結果を表示します。
ファイル：
vbslib.vbs
(src)
→ BenchStart
← ▼ ▲
ProgressTimer (g_VBS_Lib)
テスト
→ T_Date.vbs
→ vbslib.vbs
ソース
Dim g_VBS_Lib.ProgressTimer as g_VBS_Lib_ProgressTimerClass
進捗状況を表示するオブジェクト。
サンプル
Set pr_timer = g_VBS_Lib.ProgressTimer
pr_timer.Interval_msec = 100
Do
If pr_timer.GetShouldShow() Then _
echo_v "7/20"
Loop
T_ProgressTimer
データ構造
Interval_msec
Count
MaxCount
ShowFormat
表示の更新間隔（ミリ秒）。 小さすぎると遅くなります。
デフォルトは、1000 ミリ秒。
カウント値。 0以上 .MaxCount 以下。
カウント値の最大値。、
表示のフォーマット。 以下の変数を指定できます。
${Percent}
.Count × 100 ÷ .MaxCount
${Count}
${MaxCount}
${Text}
.Count の値
.MaxCount の値
Start、End_、Plus、Show メソッドの in_Text 引数
デフォルト： " ${Percent}% ${Count}/${MaxCount} ${Text}"
表示のタイミングだけ見る場合
Set pr_timer = g_VBS_Lib.ProgressTimer
pr_timer.Start Empty, 12, 100, ""
Do Until pr_timer.Count >= pr_timer.MaxCount
Sleep 50 '// Do Anything
pr_timer.Plus +1, Empty
Loop
pr_timer.End_ ""
12回のループの進捗を 100ミリ秒ごとに表示する場合
サンプル
グローバルに１つだけ存在します。
Start
← ▼ ▲
Start (g_VBS_Lib.ProgressTimer)
Sub g_VBS_Lib_ProgressTimerClass::Start( in_ShowFormat as string, _
in_MaxCount as integer, in_Interval_msec as integer, in_Text as string )
進捗状況を表示を開始します。
【引数】
in_ShowFormat
in_MaxCount
に設定する値
に設定する値
in_Interval_msec
に設定する値
ShowFormat プロパティ
in_Text
MaxCount プロパティ
Interval_msec プロパティ
の ${Text} から置き換える文字列
ShowFormat プロパティ
in_Text に Empty を指定したときは、開始したすぐには表示をしません。
← ▼ ▲
End_ (g_VBS_Lib.ProgressTimer)
Sub g_VBS_Lib_ProgressTimerClass::End_( in_Text as string )
表示するタイミングではないときにカウント値が最大値になったときのために、表示します。
【引数】
in_Text
の ${Text} から置き換える文字列
ShowFormat プロパティ
Start
〜 End_ は、ネストすることができます。
最も外側の
〜 End_ 以外は、何もしません。
Start
in_Text に Empty を指定したときは、表示を更新しません。
← ▼ ▲
Plus (g_VBS_Lib.ProgressTimer)
Sub g_VBS_Lib_ProgressTimerClass::Plus( in_PlusCount as integer, in_Text as string )
進捗状況のカウント値をプラスして、表示するタイミングだったら、表示内容を変更します。
【引数】
in_PlusCount
in_Text
カウント値をプラスする値
の ${Text} から置き換える文字列
ShowFormat プロパティ
← ▼ ▲
GetShouldShow (g_VBS_Lib.ProgressTimer)
Function g_VBS_Lib_ProgressTimerClass::GetShouldShow() as boolean
表示するタイミングかどうかを返します。
← ▼ ▲
メモ
Reset メソッドは廃止。 ネストできないため。
← ▼ ▲
IsSame
Function IsSame( Left, Right ) as boolean
= とほぼ同じですが、Empty, Null と "" を比較しても False を返します。
テスト
ソース
→ T_Arr.vbs
T_IsSame
→ vbslib.vbs
← ▼ ▲
Add
テスト
→ vbslib.vbs
ソース
→ T_Arr.vbs
T_AddArray
Function Add( Operand1 as type1, Operand2 as type1 ) as type1
加算します。
type1 は、以下の型を指定できます。
・ + 演算子が使える型（数値型、文字列型）
・配列型
← ▼ ▲
CalculateVariables
Set vars = CreateObject( "Scripting.Dictionary" )
vars.Item( "a" ) = 2
Assert CalculateVariables( "a + 3", vars ) = 5
Function CalculateVariables( Formula as string, Variables as dictionary ) as variant
文字列で表現された計算式を計算します。
【引数】
Formula
Variables
計算式。 VBScript の文法で表現したもの
計算式で使える変数の集合
返り値
計算結果
ファイル：
vbslib.vbs
関連
テスト
"a + 3"
サンプル
(src)
計算式に、Variables 引数に指定した変数を使うことができます。
変数の値は、数値だけでなく、文字列やオブジェクトも指定できます。
→ Execute
→ T_Calc.vbs # [T_Calc]
変数の値が文字列型であっても、数値として計算します。
変数の値が他の変数の参照にすることもできます。
Set vars = CreateObject( "Scripting.Dictionary" )
vars.Item( "a" ) = 2
vars.Item( "b" ) = "3"
vars.Item( "c" ) = "b"
Assert CalculateVariables( "a + b + c", vars ) = 8
→ Eval
← ▼ ▲
NestPos クラス
Set pos = new NestPos
'// pos.PosArr = Array( 0 )
pos.Start '// pos.PosArr = Array( 1, 0 )
pos.End_ '// pos.PosArr = Array( 1 )
pos.Start '// pos.PosArr = Array( 2, 0 )
pos.Start '// pos.PosArr = Array( 2, 1, 0 )
pos.End_ '// pos.PosArr = Array( 2, 1 )
pos.End_ '// pos.PosArr = Array( 2 )
処理順序におけるネスト（入れ子）の位置をカウント・アップします。
Dim NestPos::PosArr as Array of integer
.PosArr
.Start
Sub NestPos::Start()
.End_
Sub NestPos::End_()
現在のネストの位置。
配列番号は、ネストの深さに対応します。
ブロックの開始。
カウント・アップして、配列の要素を1つ増やします。
ブロックの終了。
配列の要素を1つ減らします。
(src)
← ▼ ▲
オブジェクト
→ get_Object
→ get_ObjectFromFile
→ get_ObjectsFromFile
→ include_objs
→ LetSet
→ get_DefineInfoObject
→ get_NameDelegator
→ new_ObjectFromStream
→ new_ObjectsFromStream
→ new_X
→ NameOnlyClass
→ DefaultFunction
→ LifeGroupClass
→ EventRespondersClass
オブジェクトかどうかによって、Out = In_ または Set Out = In_ をします。
静的オブジェクト （または演算器的なオブジェクト） を取得します。
スクリプトファイルをインクルードして、静的オブジェクトを取得します。
静的オブジェクト・スクリプトファイルをすべて取得して一覧できるようにします。
静的オブジェクト・スクリプトファイルをインクルードします。
単純な DefineInfo オブジェクトを生成します。
指定のインターフェースを持った、静的な一般名オブジェクトを取得します。
ストリームから、オブジェクトを１つ生成します。
ストリームから、オブジェクトをいくつか生成して、配列に格納します。
文字列で指定した名前のクラスのオブジェクトを生成します。
Name 変数と、Delegate 変数の対応関係を表すクラスです。
何もしないコールバック関数の本体。
相互参照しているオブジェクトのライフサイクルを管理します。
イベントが発生したらコールバックされる関数の集合。
← ▼ ▲
LetSet
Sub LetSet( Out as variant, In_ as variant )
In_ がオブジェクトかどうかによって、Out = In_ または Set Out = In_ をします。
If IsObject( In_ ) Then Set Out = In_ Else Out = In_
一般に、LetSet を呼び出すより、IsObject で判定（上記のコード）を記述した方が高速ですが、
In_ に関数や Dictionary::Item などの重い処理を記述するときは、その重い処理を
2度実行させないLetSet の方が高速です。
実装：
サンプル：
LetSet v, dic("name") '// Set "v"
→ T_Var.vbs
テスト
T_LetSet
ソース
→ vbs_inc_sub.vbs
→ LetSetWithBracket
関連
→ GetDicItem
代入先が配列、または、辞書のとき
代入元が辞書のとき
Out 引数にオブジェクトのプロパティを指定しないでください。 設定されません。
なぜなら、プロパティを引数に指定すると、値渡しになるからです。
← ▼ ▲
LetSetWithBracket
Sub LetSetWithBracket( out_Collection as variant, in_Index as variant, in_Item as variant )
配列、または、辞書の要素に登録します。
LetSetWithBracket dic, "key", 1
→ T_Var.vbs
テスト
T_LetSet
ソース
→ vbs_inc_sub.vbs
配列、または、辞書に代入するときの
LetSet
です。
関連
→ GetDicItem
下記のどちらかのコードに相当します。
out_Collection( in_Index ) = in_Item
Set out_Collection( in_Index ) = in_Item
サンプル
→ GetDicItem
【引数】
out_Collection
in_Index
（入出力） 配列 または 辞書、( ) で要素にアクセスできるコレクション
配列番号 または 辞書のキー
in_Item
配列 または 辞書に追加する値 （オブジェクト または 非オブジェクト）
→ Dic_addElem
← ▼ ▲
get_Object
Function get_Object( Name as string ) as Object
静的オブジェクト （または演算器的なオブジェクト） を取得します。
【引数】
Name
取得するオブジェクトのクラス名
返り値
オブジェクト
サンプル：
→ get_ClassA, get_Object : 静的オブジェクト、演算器要求
関連
Dim name : name = "ClassA"
Dim obj : Set obj = get_Object( name )
Dim g_ClassA
Function get_ClassA() '// has_interface_of ClassI
If IsEmpty( g_ClassA ) Then _
Set g_ClassA = new ClassA : ErrCheck
Set get_ClassA = g_ClassA
End Function
get_Object は、機能的には、"get_" + Name の関数を呼び出すだけなので、
別途関数を用意する必要があります。
たとえば、Name = "ClassA" なら、get_ClassA の関数が呼ばれます。
ClassI
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
(src)
Name が変数ではないときは、直接 get_ClassA を呼び出すことができます。
Dim obj : Set obj = get_ClassA()
new でオブジェクトを生成すると、get_ClassA で取得できるオブジェクトと別の
インスタンスになります。
Name が動的に変わることがないときは、get_ClassA 関数を直接呼び出して
ください。
→ T_GetObject.vbs [T_IncludeObjs1]
テスト
静的オブジェクトが無ければ、エラーになります。
← ▼ ▲
get_ObjectFromFile
Function get_ObjectFromFile( ModulePath as string, Name as string ) as Object
スクリプトファイルをインクルードして、静的オブジェクトを取得します。
【引数】
ModulePath
Name
スクリプトファイルのパス
取得するオブジェクトのクラス名
返り値
取得したオブジェクト
Dim m : Set m = get_ObjectFromFile( "Lib\SampleLib.vbs", "Sample" )
サンプル： SampleLib.vbs ファイルで定義されている Sample オブジェクトを取得する。
上記サンプルは、下記と同じです。
include "Lib\SampleLib.vbs"
Dim m : Set m = get_Sample()
オブジェクトを取得する部分は、機能的には、"get_" + Name の関数を呼び出すだけなので、
スクリプトファイルの中で、別途関数を定義する必要があります。 参考
→ get_Object
(src)
→ T_GetObject.vbs get_ObjectFromFile [T_NewModule]
テスト
← ▼ ▲
get_ObjectsFromFile
(src)
Sub get_ObjectsFromFile( GetFuncs as string or Array of Function,
InterfaceName as string, out_Objs as Array of Object )
静的オブジェクト・スクリプトファイルをすべて取得して一覧できるようにします。
【引数】
GetFuncs
InterfaceName
スクリプトのパス、または include_objs の out_GetFuncs
Empty または、取得するオブジェクトが持つインターフェース
out_Objs
取得したオブジェクトの配列
get_ObjectsFromFile "Lib\*_obj.vbs", "ClassI", m_Objs '// [out] m_Objs
サンプル： インクルードと同時に、静的オブジェクトを取得する
include_objs "Lib\*_obj.vbs", Empty, m_CreateFuncs '// [out] m_CreateFuncs
get_ObjectsFromFile m_CreateFuncs, "ClassI", m_Objs '// [out] m_Objs
サンプル： インクルードした後で、静的オブジェクトを取得する（ファイルを走査しない）
Sub get_StaticObjects( InterfaceName, out_Obj )
If IsEmpty( InterfaceName ) or InterfaceName = "ClassI" Then
Set out_Obj = get_ClassA()
ElseIf InterfaceName = "ClassI2" Then
out_Obj = Array( get_ClassA(), get_ClassB() )
End If
End Sub
静的オブジェクトを一覧できるようにするには、それぞれのスクリプトで、get_StaticObjects
関数を定義する必要があります。 get_ObjectsFromFile や include_objs は、別のスクリプト
ファイルであれば、同じ関数名でも異なる関数インスタンスになります。
→ get_StaticObjects : 静的オブジェクト
参考
→ T_GetObject.vbs [T_IncludeObjs2] [T_IncludeObjs3]
テスト
← ▼ ▲
new_X
→ 名前参照 (vbsool)
参考
Function new_X( Name as string ) as object
文字列で指定した名前のクラスのオブジェクトを生成します。
Function new_ClassA()
Set new_ClassA = new ClassA
End Function
機能的には、"new_" + Name の関数を呼び出すだけなので、別途関数を用意する必要があります。
たとえば、Name = "ClassA" なら、new_ClassA の関数が呼ばれます。
(src)
ただし、多くの場合、get_Object の方が適していることが多いので、get_Object を使うことを検討
してください。
→ get_Object
サンプル：
Dim obj : Set obj = new_X( "ClassA" )
引数は、なしにしてください。
← ▼ ▲
include_objs
Sub include_objs( Wildcard as string, Flags as Empty, out_GetFuncs as Array of Funcion )
静的オブジェクト・スクリプトファイルをインクルードします。
【引数】
Wildcard
Flags
スクリプトファイルのパス、またはフォルダパス
Empty を指定してください
out_GetFuncs
Empty、または、静的オブジェクトを取得する関数の集合
out_CreateFuncs が Empty ではないときのサンプル
include_objs は、インクルードのみ行います。 オブジェクトの生成は、new で生成するか、
get_ObjectsFromFile で行います。
(src)
サンプル： Lib フォルダをインクルードして、その中で定義された ClassA オブジェクトを生成する。
include_objs "Lib\*_obj.vbs", Empty, Empty
Set obj : Set obj = new ClassA : ErrCheck
→ new_X_array
Flags = Empty かつ out_GetFuncs = Empty なら、include で代用できます。
関連
→ include
out_GetFuncs は、静的オブジェクトを取得する関数の集合です。 get_ObjectsFromFile の第1引数
に渡すと、文字列を渡したときより高速に処理します。
→ T_GetObject.vbs [T_IncludeObjs1c]
テスト
→ T_GetObject.vbs [T_IncludeObjs3]
→ T_GetObject.vbs [T_IncludeObjsMulti]
→ T_GetObject.vbs [T_IncludeObjsMulti_NoWild]
→ T_GetObject.vbs [T_IncludeObjsEmptyArray]
← ▼ ▲
get_DefineInfoObject
Sub get_DefineInfoObject( in_out_Object as DefineInfoClass, FullPath as string )
単純な DefineInfo オブジェクトを生成します。
→ DefineInfo プロパティ (vbsool)
参考
DefineInfo オブジェクトに FullPath プロパティしか必要ないときのみ使えます。
他のプロパティがあるときは、
(src)
Dim g_SrcPath
If IsEmpty( g_SrcPath ) Then MsgBox "This is vbslib object file." : WScript.Quit
Dim g_Sample_vbs : get_DefineInfoObject g_Sample_vbs, g_SrcPath
'// g_Sample_vbs.FullPath
サンプル：
g_SrcPath
→ DefineInfo プロパティ (vbsool)
← ▼ ▲
get_NameDelegator
Function get_NameDelegator( Name as string, TrueName as string,
InterfaceName as string ) as InterfaceName_Delegator
指定のインターフェースを持った、正式名オブジェクトに委譲する、静的な一般名オブジェクトを取得します。
【引数】
Name
TrueName
一般名。 取得するオブジェクトの Name プロパティ
正式名。 取得するオブジェクトの委譲先 (*1)
InterfaceName
一般名オブジェクトと正式名〜が共通に持つ、インターフェースの名前 (*2)
(src)
一般名オブジェクト (*3)
返り値
(*2)
(*3)
NameDelegator インターフェース
Name と TrueName の組み合わせが初めてのときは、get_NameDelegator の内部で、
new_(InterfaceName)_Delegator 関数を呼び出して、オブジェクトを生成します。
返り値となるオブジェクトにアクセスすると、Name プロパティとオブジェクトの実体の違いを除けば、
正式名オブジェクトにアクセスします。
（ここでは一般名オブジェクト）を生成することができる、new_(InterfaceName)_Delegator
関数が定義されていること。 参考：new_X
と、(InterfaceName) インターフェースを持ったインスタンス
NameDelegator インターフェース
Class NameDelegator '// defined_as_interface
Public Name
Public Property Get TrueName() : TrueName = NameDelegator_getTrueName( Me ) : End Property
Public m_Delegate ' as ClassA or ClassB or string(before validated)
Public Property Get DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
End Class
Const F_ValidateOnlyDelegate = &h40000000
Dim g_bNeedValidateDelegate
Function NameDelegator_getTrueName( m )
Sub NameDelegator_validate( m, Flags )
Function NameDelegator_getXML( m )
DefineInfo プロパティは、オプションです。
Public Property Get DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
→ DefineInfo プロパティ
テスト
→ T_NameDelegator_vbslib フォルダ
参照
→ 名前参照、Name と TrueName が多対１の場合
場面Aの関数
Name 以外は
参照
場面Aでの Name
場面Bでの Name
ある１つのインスタンス
TrueName
（正式名）
ClassI_Delegator クラス
（一般名）
場面Bの関数
委譲
ClassI
ClassI
ClassB
ClassI
ClassA
Name = "ClassN", TrueName = "ClassA"
Name = "ClassN", TrueName = "ClassB"
一般名で選択
→ オブジェクトの Name と TrueName
参照
一般名と正式名の関係は、１対多、または、多対１があります。
(*1)
(InterfaceName) インターフェースを持った、静的な正式名オブジェクトを取得することができる
get_(TrueName) 関数が定義されていること。 参考：get_Object
get_NameDelegator 関数は、
ものです。 get_NameDelegator 関数は、get_(一般名) 関数の内部からのみ呼ばれるようにしてください。
get_Object 関数
の内部で呼ばれる get_(一般名) 関数の実装を支援する
サンプル：
Function get_GeneralObject()
Set get_GeneralObject = get_NameDelegator( "GeneralObject", "TrueName", "InterfaceName" )
End Function
Function get_TrueName() : ... : End Function
Function new_InterfaceName_Delegator() : ... : End Function
返り値となる一般名オブジェクトは、Name プロパティと委譲元となるオブジェクトの実体の違いを除けば、
同じ１つの正式名オブジェクトとして扱うことができます。 参考： 下記の図の「ある１つのインスタンス」
← ▼ ▲
new_ObjectFromStream
(src)
Sub new_ObjectFromStream( out_Obj as object, ClassName as string, Stream as variant )
ストリームから、オブジェクトを１つ生成します。
【引数】
out_Obj
ClassName
（出力） ストリームから生成した１つのオブジェクト、または Empty
生成するオブジェクトのクラス名 (下記)
Stream
XML ストリーム (下記)
ClassName 引数
XML のタグ名がクラス名に対応します。
XML のタグの中の属性まで一致するデータを元にオブジェクトを生成するときは、
XPath と同様に下記のようにします。
Set xml = LoadXML( "Sample.xml", Empty )
new_ObjectFromStream obj, "ClassA[@attr='value']", xml
参考
→ XPath の [@name='value'] （属性の値）
<Root><ClassA attr="value" ... /></Root>
VBScript コード
XMLデータ
Stream 引数
ChangeToXml
の引数に指定できるものを指定できます。
new_X に対応した関数の準備
内部で、new_X を呼び出しています。 new_X を使うのに必要な関数を用意する必要が
あります。 たとえば、ABC クラスなら、new_ABC 関数が必要です。
→ new_X
参考
テスト
→ T_ObjectFromStream フォルダ
←
↓