.Files( Key:StepPath )
string
.StepPath
boolean
.IsSameBinary[ n ]
ソース
→ SyncFilesMenuLib.vbs
テスト
→ T_SyncFiles.vbs # main
関連
→ SyncFilesX
***********************************************************************
<<< SetParentFolderProxyName (SyncFilesMenu) >>>
***********************************************************************
SetParentFolderProxyName (SyncFilesMenu)
(src)
Sub SyncFilesMenu::SetParentFolderProxyName( IndexNum as integer, Name as string )
親フォルダーの指定を、サブ・フォルダーに置き換えるように設定します。
【引数】
IndexNum
フォルダー番号
Name
サブ・フォルダー名
サンプル
Set menu = new SyncFilesMenu
menu.IsCompareTimeStamp = False
menu.AddRootFolder 0, "Folder0"
menu.AddRootFolder 1, "Folder1"
menu.SetParentFolderProxyName 1, "_parent"
menu.AddFile "..\Sample.txt"
_parent
上記の場合、Folder0\..\Sample.txt と、Folder1\_parent\Sample.txt を比較します。
テスト
→ T_SyncFiles.vbs # T_SyncFilesParent
***********************************************************************
<<< SynchronizeFolder >>>
***********************************************************************
SynchronizeFolder
Sub SynchronizeFolder( FolderA_Path as string, FolderB_Path as string,
SynchronizedPath as string, Mask as string, in_out_Options as Empty )
2つのフォルダーを同期します。
【引数】
FolderA_Path
同期をとるフォルダーのパス
FolderB_Path
同期をとるもう1つのフォルダーのパス
SynchronizedPath
同期した内容をとっておくフォルダーのパス
Mask
ファイル名のフィルター(ワイルドカード)
in_out_Options
Empty を指定してください
ソース
→ ToolsLib.vbs
サンプル
SynchronizeFolder "C:\FolderA", "C:\FolderB", "C:\Synchronized", "*", Empty
両方のフォルダーにある同じ名前のファイルが更新されていたら、手動で更新するように
エラーが表示されます。 hint_path にできたファイルに、手動で同期する必要がある
ファイルのパスが書かれています。 削除されたファイルや、タイムスタンプが過去に
戻ったファイルも手動で同期する必要があります。
例: C:\hint.txt
>SynchronizeFolder
A: "C:\FolderA"
B: "C:\FolderB"
以下のファイルが、両方のフォルダーで変更されました。
"1.txt"
Updated: "C:\FolderA\1.txt"
Updated: "C:\FolderB\1.txt"
サンプル
エラーがあったら、その内容をエディターで開く
If TryStart(e) Then On Error Resume Next
SynchronizeFolder folder_A, folder_B, folder_S, "*.h", Empty
If TryEnd Then On Error GoTo 0
If e.num <> 0 Then
Set root = LoadXML( e.desc, F_Str )
hint_path = root.getAttribute( "hint_path" )
echo ""
echo "自動で同期できないファイルのパスを、テキスト・エディターで表示します。"
start GetEditorCmdLine( hint_path )
e.Raise
End If
テスト
→ T_SynchronizeFolder.vbs
関連
→ SyncFilesX
***********************************************************************
<<< IsSynchronizedFilesX >>>
***********************************************************************
IsSynchronizedFilesX
Function IsSynchronizedFilesX( Path as string or FilePathClass ) as boolean
同期が必要なファイルがすべて同期済みであるかどうかを返します。
【引数】
Path
SyncFilesX
の設定ファイルへのパス、または、
FilePathClass
返り値
すべて同期済みであるかどうか
サンプル
If IsSynchronizedFilesX( new_FilePathForFileInScript( "SyncFilesX.vbs" ) ) Then
If IsSynchronizedFilesX( "SyncFilesX.xml" ) Then
ソース
→ SyncFilesMenuLib.vbs
テスト
→ T_SyncFilesX.vbs
T_SyncFilesX_CommandLine
関連
→ SyncFilesX
***********************************************************************
<<< SearchStringTemplate >>>
***********************************************************************
SearchStringTemplate
Function SearchStringTemplate( FolderPath as string, RegularExpressionPart as string,
TemplateStrings as array of string, Opt as Empty ) as array of array of GrepFound
テキストファイルの中をキーワードで検索し、どのテンプレートと一致するかを一覧します。
【引数】
FolderPath
検索対象フォルダーやワイルドカード
→ Execute (GrepClass)
RegularExpressionPart
テンプレートの中にあるキーワード。複数行不可
→ 正規表現
TemplateStrings
テンプレート(複数行可)、または、その配列
Opt
Empty を指定してください
返り値
GrepFound オブジェクト
の配列の配列
キーワードが見つかった位置が、指定したテンプレートの一部であるものと、そうでないものを
一覧します。 これを応用すれば、テンプレートの内容が違っていたり、古いテンプレートのまま
になっていたりするものを見つけることができます。
TemplateStrings 引数
テンプレートは、可変の部分を "${変数名}" のように記述してください。 可変の部分は、複数行
にまたぐことができます。 SearchStringTemplate 関数はテンプレートの中の変数名を無視しま
すが、テンプレートを ScanFromTemplate 関数などにそのまま渡すことができます。
${ 文字は "$\{" と記述してください。 $\ 文字は "$\\" と記述してください。
関数名: ${FunctionName}
引数: ${Arguments}
返り値: ${RerutnValue}
返り値
返り値が founds のとき、founds(t)(i) の t は TemplateStrings 引数の配列番号、i はテンプレート
にマッチした複数の場所に 0 から順番につけた番号です。
founds(t)(i).LineNum は、キーワードがある位置の行番号です。
サンプル
TargetFolder フォルダーの中にあるテキストファイルの中から "(((" を検索し、見つかった
位置に、テンプレート(下記の複数行の文字列) がマッチしているものと、マッチしていない
ものに分けます。
founds = SearchStringTemplate( "TargetFolder", "(((", _
"/***********" +vbCRLF+ _
"((( ${FunctionName} ))$\{)" +vbCRLF+ _
"************/" +vbCRLF, Empty )
Assert founds(0)(0).LineNum = 1 '// マッチした
Assert founds(0)(1).LineNum = 5 '// マッチした
Assert founds(1)(0).LineNum = 9 '// マッチしなかった
検索対象のテキストファイル
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
/***********
((( FuncA ))${)
************/
/***********
((( FuncB ))${)
************/
/***********
((( FuncC )))
************/
… RegularExpressionPart 引数に指定した ((( にヒットするが、
テンプレートに指定した ${ がないのでマッチしない
返り値( i ) は、TemplateStrings( i ) のテンプレートにマッチした場所を示す GrepFound オブジェクト
の配列です。 返り値( UBound( TemplateStrings ) + 1 ) は、どのテンプレートにもマッチしなかった
場所を示す GrepFound オブジェクトの配列です。
GrepFound オブジェクトのメンバー変数の内容は、次の通りです。
.Path
ファイル名
.LineNum
Empty
.LineText
Array( テンプレートの開始位置(1以上), テンプレートの次の位置 )
GetEchoStr に渡すと、次のように変わります。
.Path
ファイル名
.LineNum
行番号
.LineText
テンプレートにマッチしたファイルの中の内容。 複数行の場合あり
ExpandWildcard_Sort 変数
が使えます。
ソース
→ ToolsLib.vbs
テスト
→ T_fc.vbs
T_SearchStringTemplate
関連
→ EchoOld (ReplaceTemplateClass)
→ ScanFromTemplate
→ ReplaceStringTemplate
→ GetLineNumOfTemplateDifference
→ PartCmp
***********************************************************************
<<< GetLineNumOfTemplateDifference >>>
***********************************************************************
GetLineNumOfTemplateDifference
Function GetLineNumOfTemplateDifference( TargetString as string,
RegularExpressionPart as string, TemplateString as string ) as integer
指定した文字列の中で、テンプレートに一致しない場所の行番号を返します。
【引数】
TargetString
テンプレートが含まれる(はずの)文字列
RegularExpressionPart
テンプレートの中にあるキーワード。複数行不可
→ 正規表現
TemplateString
テンプレート(複数行可)
返り値
テンプレートに一致しない場所の行番号。 0=すべて一致
テンプレートの書き方について、
→ SearchStringTemplate
サンプル
line_num = GetLineNumOfTemplateDifference( _
"----" +vbCRLF+_
"----" +vbCRLF+_
"Parameter1: abc" +vbCRLF+_
"Param2: def" +vbCRLF+_
"Parameter3: ghi" +vbCRLF+_
"----" +vbCRLF, _
_
"Parameter1", _
_
"Parameter1: ${1}" +vbCRLF+_
"Parameter2: ${2}" +vbCRLF+_
"Parameter3: ${3}" +vbCRLF )
Assert line_num = 4 '// Param2: の場所の行番号
ソース
→ ToolsLib.vbs
テスト
→ T_fc.vbs
T_GetLineNumOfTemplateDifference
関連
→ RunGetDifference (ReplaceTemplateClass)
***********************************************************************
<<< ParseDollarVariableString >>>
***********************************************************************
ParseDollarVariableString
Sub ParseDollarVariableString( the_String as string, out_SubStringArray as array of string,
out_VariableArray as array of string )
文字列の中の ${ } を使った変数の部分とそれ以外の部分に分割します。
【引数】
the_String
分割する前の文字列
out_SubStringArray
変数以外の部分の配列
out_VariableArray
変数の部分の配列
サンプル
ParseDollarVariableString "abc ${VAR1}, ${VAR2} def", sub_strings, variables
Assert IsSameArray( sub_strings, Array( "abc ", ", ", " def" ) )
Assert IsSameArray( variables, Array( "${VAR1}", "${VAR2}" ) )
ソース
→ ToolsLib.vbs
テスト
→ T_Str.vbs
T_ParseDollarVariableString
関連
→ ScanFromTemplate
***********************************************************************
<<< ParsePercentVariableString >>>
***********************************************************************
ParsePercentVariableString
Sub ParsePercentVariableString( the_String as string, out_SubStringArray as array of string,
out_VariableArray as array of string )
文字列の中の % を使った変数の部分とそれ以外の部分に分割します。
【引数】
the_String
分割する前の文字列
out_SubStringArray
変数以外の部分の配列
out_VariableArray
変数の部分の配列
サンプル
ParsePercentVariableString "abc %VAR1%, %VAR2% def", sub_strings, variables
Assert IsSameArray( sub_strings, Array( "abc ", ", ", " def" ) )
Assert IsSameArray( variables, Array( "%VAR1%", "%VAR2%" ) )
ソース
→ ToolsLib.vbs
テスト
→ T_Str.vbs
T_ParseDollarVariableString
関連
→ ScanFromTemplate
***********************************************************************
<<< % を使った文字列変換関数 >>>
***********************************************************************
% を使った文字列変換関数
vbslib の提供するいくつかの関数の中で、% を使った文字列変換関数が使えます。
% を使った環境変数も展開されます。
サンプル
ABC
***%FullPath(.)%***
***%RegExp(.*)%***
ABC
***C:\FolderA***
***01234567879***
展開
関数一覧
(*1)
(*2)
変換前
変換後の例
○
○
%FullPath(..\SampleLib)%
C:\folder\SampleLib
○
○
%FullPath(.)%
C:\folder\current
○
○
%DesktopPath%
C:\Documents and Settings\user1\デスクトップ
○
×
%RegExp(.*)%
正規表現にマッチする任意の文字列
→ 正規表現
○
×
%MultiLine%〜
複数行にマッチする (*3)
(*1)
比較対象も指定する関数で使えるかどうか。
例:
AssertFC
IsSameTextFile
の c.RightHasPercentFunction
比較対象を指定しない関数で使えるかどうか。
(*2)
例:
ConvertToFullPath
(*3)
%MultiLine% は、任意の複数行とマッチします。
また、%MultiLine% の直後にテキスト(%を使った関数可能)を置くと、その複数行が
マッチするかどうかをチェックします。
start
%MultiLine%
end
start
Line1
Line2
Line3
end
展開
start
%MultiLine%%FullPath(.)%>
end
start
C:\FolderA>
C:\FolderA>
C:\FolderA>
end
展開
関連
→ URL にプレースホルダーを含める
→ sscanf
キーワード:
%FullPath(.)%, %RegExp(.*)%, %MultiLine%, %DesktopPath%
***********************************************************************
<<< grep (検索) >>>
***********************************************************************
grep (検索)
Function grep( Parameters as string, OutPath as string ) as array of GrepFound
GrepFound
ファイルの中で、指定したキーワードを含む行を検索します。
【引数】
Parameters
オプションと、キーワードと、検索対象フォルダーやワイルドカード(複数可)
OutPath
Empty または 検索結果の出力先のファイル・パス
返り値
GrepFound オブジェクト
の配列、または Empty
参考
→ ファイル名、パス (Windows)
Parameters は、Linux の
grep コマンド
のパラメーターと同じです。
ただし、オプションは、-r と -i と -l と --include のみ指定できます。
-r : サブフォルダーも検索対象にする
-i : 大文字と小文字を区別しないで検索する
-l : ファイルのパスのみ出力する
-L : キーワードを含まないファイルのパスを出力する
-c : キーワードを含む行の数を取得するだけのため、返り値の LineNum を求める処理をしない
--include : 拡張子を指定する
キーワードは、必ず
正規表現
で指定してください。
関連
→ GrepKeyword
-u オプション(vbslib オリジナル)を指定しないと、Unicode テキストにはヒットしません。
-u オプションを指定したときは、内部で
VBScript.RegExp
が使われます。
OutPath 引数と返り値
OutPath 引数に 検索結果の出力先のファイル・パスを指定すると、
下記のサンプル
のように
表示され、返り値は Empty になります。 返り値を GrepFound オブジェクトの配列にしたい
ときは、OutPath 引数に Empty を指定してください。
RunProg
同様、
EchoOff オブジェクト
を使ったり、OutPath 引数に
g_VBS_Lib.NotEchoStartCommand を指定すると、見つかった場所について、echo 表示しなく
なります。
サンプル
"define" を検索する。 結果は返り値で取得する。
検索対象ファイルは、..\FolderA フォルダーで、サブ・フォルダーも含める。(-r)
founds = grep( "-r ""define"" ""..\FolderA\*""", Empty ) '// as array of GrepFound
'// 返り値のサンプル
'// UBound( founds ) は、見つかった行数−1
'// founds(0).Path = "..\FolderA\grep_target1.txt"
'// founds(0).LineNum = 2
'// founds(0).LineText = " #define string"
For Each found In founds
echo found.LineText
Next
\*
GrepFound
GrepFound::Path プロパティ
Parameters に指定した検索対象のパスが、相対パスなら、Path プロパティも
相対パスになります。 そのときの基準フォルダーは、カレント・フォルダーになります。
サンプル
結果をファイルに出力する
"define" を検索する。 結果は、"grep_out.txt" ファイルに出力する。
検索対象ファイルは、拡張子が .txt と .ini で、サブ・フォルダーも含める。(-r)
大文字小文字は区別しない。(-i)
grep "-r -i define *.txt *.ini", "grep_out.txt"
grep_out.txt ファイルのサンプル
grep_target1.txt:2: define string
grep_target3.txt:2: define string
grep_target3.txt:4: define text
sub\grep_target1.txt:2: define string
サンプル
ファイル・パスの一覧を得る(-l オプション)
Set c = g_VBS_Lib
founds = grep( "-r -l ""define"" ""..\FolderA\*""", c.NotEchoStartCommand )
For Each found In founds
echo found.Path
Next
互換性
"|" (バーチカルライン)は、OR の意味になります。
"|" を検索したいときは、"\|" のようにエスケープしてください。
"-" を検索したいときは、"\-" のようにエスケープしてください。
"/"(スラッシュ)は、一般文字であり、エスケープする必要はありません。
+ のメタ文字を使うことができます。
単語単位はできません。
-u オプションがなければ、内部で、コマンドプロンプトの findstr コマンドを使用します。
-u オプションがあれば、内部で、VBScript.RegExp を使用します。
\ 文字は bash を経由したときと同じになります。
つまり、\\ が \ に、\" が " に置き換わった後の文字列が、正規表現に適用されます。
例:
\(
または
\\(
を指定すると、一般文字の(制御文字でない)
(
例:
\\\\
を指定すると、一般文字の(制御文字でない)
\
ExpandWildcard_Sort 変数
が使えます。 ただし、-u オプションが付いていないと無視されます。
ソース
→ vbslib.vbs
テスト
→ T_Grep.vbs
参考
→ 正規表現
→ 互換性
→ grep コマンド (Linux)
→ findstr (DOS)
関連
→ sscanf
文字列の途中を取り出します。
→ FindStringLines
キーワードがある行だけ抽出します。
→ grep コマンド (vbslib)
***********************************************************************
<<< SortGrepFoundArray >>>
***********************************************************************
SortGrepFoundArray
Sub SortGrepFoundArray( Founds as array of GrepFound )
GrepFound
GrepFound クラスのオブジェクトの配列をソートします。
【引数】
Founds
GrepFound クラスのオブジェクトの配列
ソース
→ vbslib.vbs
関連
→ ExpandWildcard_Sort 変数
***********************************************************************
<<< GrepClass >>>
***********************************************************************
GrepClass
ファイルの中で、指定したキーワードを含む行を検索します。
VBScript.RegExp
にあるメンバーと同じものは、同じ名前にしています。
string
.Pattern
検索キーワード
(正規表現)
\ は、bash を経由しないときと同じになります
boolean
.IgnoreCase
大文字小文字を区別しないかどうか
boolean
.IsRecurseSubFolders
サブ・フォルダーも再帰的に検索対象にする。
Execute の TargetPath 引数に PathDictionaryClass
を指定したときは、無視されます
boolean
.IsOutFileNameOnly
ファイル名のみ出力する
boolean
.IsInvertMatch
キーワードにマッチしないものを出力する
boolean
.IsHitCount
LineNum を求める処理をしない
Function
.Execute
指定したファイルの中に対して、検索を実行する
サンプル
Set a_grep = new GrepClass
a.grep.Pattern = "?xml>"
founds = a_grep.Execute( "folder\*.txt" )
ソース
→ vbslib.vbs
テスト
→ T_Grep.vbs
T_GrepClass1
T_Grep1 の *_U (grep -u の内部で使っている)
***********************************************************************
<<< Execute (GrepClass) >>>
***********************************************************************
Execute (GrepClass)
<< GrepClass
Function GrepClass::Execute( TargetPath as variant ) as array of GrepFound
GrepFound
ファイルの中で、指定したキーワードを含む行を検索します。
【引数】
TargetPath
検索対象フォルダーやワイルドカード(複数可)、または
PathDictionaryClass
返り値
GrepFound オブジェクト
の配列、または Empty
TargetPath 引数は、
VBScript.RegExp
の Execute メソッドの引数と異なります。
サンプル
founds = a_grep.Execute( "folder\*.txt" )
founds = a_grep.Execute( Array( "folder_A\*.txt", "folder_B\*.txt" ) )
paths = ArrayFromWildcard( "folder" )
paths.AddRemove "folder\.svn"
founds = a_grep.Execute( paths )
***********************************************************************
<<< GrepKeyword >>>
***********************************************************************
(src)
GrepKeyword
EGrepKeyword
(src)
GrepExpression
(src)
Function GrepKeyword( Keyword as string ) as string
Function EGrepKeyword( Keyword as string ) as string
Function GrepExpression( RegularExpression as string ) as string
検索キーワードを grep や egrep のコマンドラインに指定する形式に変換します。
【引数】
Keyword
検索キーワード
RegularExpression
正規表現
返り値
grep や egrep のコマンドラインに指定する形式
返り値を grep や egrep のパラメーターに指定するときは、" " で囲んでください。
grep -r "\---" *
RegularExpression 引数
RegularExpression 引数に指定した \ 文字は bash を経由しないときと同じになります。
例: \\\\ = \ 文字が2つをキーワードとする
RegularExpression 引数の先頭に、- を指定したときにオプションと扱われないように、
先頭に \ が付いたものが返ります。
サンプル
Assert GrepKeyword( "---\" ) = "\---\\\\"
Assert GrepExpression( "---\" ) = "\---\\"
テスト
→ T_Grep.vbs # [T_GrepKeyword]
***********************************************************************
<<< find >>>
***********************************************************************
(src)
find
Function find( keyword as string, path as string ) as string
テキストファイルの中で、指定したキーワードを含む行をまとめて返します。
【引数】
keyword
検索するキーワード
path
テキストファイルのパス
返り値
キーワードを含む行、または複数行
サンプル:
lines = find( "
Fail.
返り値のサンプル
関連
→ FindStringLines
***********************************************************************
<<< find_c >>>
***********************************************************************
(src)
find_c
Function find_c( keyword as string, path as string ) as integer
テキストファイルの中で、指定したキーワードを含む行数を返します。
【引数】
keyword
検索するキーワード
path
テキストファイルのパス
返り値
キーワードを含む行数
***********************************************************************
<<< type_ >>>
***********************************************************************
type_
Sub type_( Path as string )
テキストファイルの内容を表示します。
【引数】
Path
表示するファイルのパス
参考
→ ファイル名、パス (Windows)
type は、VBScript の予約語なので、type の後に末尾にアンダースコアを付けた名前にしています。
サンプル:
type_ "result.txt"
***********************************************************************
<<< ReadFile >>>
***********************************************************************
(src)
mini (src)
ReadFile
Function ReadFile( Path as string ) as string
テキストファイルの全体を読み込みます。
【引数】
Path
読み込むテキストファイルのパス、または
FilePathClass
返り値
テキストファイルの内容
サンプル:
text = ReadFile( "a.txt" )
ファイルが存在しないときでもエラーにならず、"" を返します。
エラーにするときは次のようにします。
Set file = OpenForRead( "a.txt" )
text = ReadAll( file )
多くの場合、行末に改行文字があります。 ReadFile で取得した末尾に
改行文字があることに注意してください。
CreateFile
で作成したファイルは、改行文字は付きません。
a.txt
Text1
ReadFile( "a.txt" ) = "Text1"+vbCRLF
文字コードを指定するときは、
new_TextFileCharSetStack
を使って
ください。 ただし、Shift-JIS, Unicode, UTF-8(BOMあり) は、使わな
くても自動的に文字コードを判定して、正しく読み込みます。
Set cs = new_TextFileCharSetStack( "EUC-JP" )
t = ReadFile( "a.txt")
cs = Empty
テスト
→ T_File.vbs # [T_ReadFile]
関連
→ ReadAll
→ ReadFileInTag
→ CreateFile
***********************************************************************
<<< ReadFileInTag >>>
***********************************************************************
(src)
ReadFileInTag
Function ReadFileInTag( Path as string, StartOfText as string, EndOfText as string ) as string
テキストファイルの中にある指定の開始タグと終了タグの間にあるテキストを読み込みます。
【引数】
Path
読み込むテキストファイルのパス
StartOfText
読み込む範囲の先頭にあるタグ(テキスト)、または Empty(=先頭から)
EndOfText
読み込む範囲の末尾にあるタグ(テキスト)、または Empty(=末尾まで)
返り値
タグの間のテキストファイルの内容。 タグ、および、先頭と末尾の改行は除く
サンプル
Dim text
CreateFile "index.html", "abc123
def"
text = ReadFileInTag( "index.html", "", "
" ) : Assert text = "123"
CreateFile "index.html", "abcdef"
text = ReadFileInTag( "index.html", "
", Empty ) : Assert text = "def"
text = ReadFileInTag( "index.html", Empty, "
" ) : Assert text = "abc"
読み込みサンプル
StartOfText = "", EndOfText = "" とします。
ファイル
返り値
abc123def
123
abc
123
456
def
123
456
(456の後に改行なし)
テスト
→ T_File.vbs # [T_ReadFileInTag]
関連
→ sscanf
文字列の途中を取り出します
→ ReplaceRange (ReplaceTextFile1)
指定のタグで囲まれたテキストを置き換えます
***********************************************************************
<<< ReadAll >>>
***********************************************************************
(src)
ReadAll
Function ReadAll( FileStream as TextStream ) as string
テキストファイルをすべてリードします。
【引数】
FileStream
開いている読み込むファイル
返り値
最後までリードしたテキスト
TextStream::ReadAll
と異なり、ファイルサイズが 0 のときでも、エラーになりません。
関連
→ ReadFile
***********************************************************************
<<< ReadBinaryFile >>>
***********************************************************************
ReadBinaryFile
Function ReadBinaryFile( Path as string ) as BinaryArray
バイナリーファイルの全体を読み込みます。
【引数】
Path
バイナリーファイルのパス
返り値
バイナリー・データ
→ BinaryArray クラス
サンプル
Set bin = ReadBinaryFile( "unicode_sample.txt" )
If bin(0) = &hFF and bin(1) = &hFE Then
echo "This is unicode file."
End If
"unicode_sample.txt"
ソース
→ System.vbs
テスト
→ T_Binary.vbs
関連
→ Load (BinaryArray)
→ new_BinaryArray
***********************************************************************
<<< CreateFile >>>
***********************************************************************
(src)
mini (src)
CreateFile
Function CreateFile( path as string, text as string ) as string
指定のテキストを内容としたテキストファイルを作成します。
【引数】
path
作成するテキストファイルのパス
text
テキストファイルの内容
返り値
作成したテキストファイルのフル・パス
参考
→ ファイル名、パス (Windows)
→ Out of Writable 警告 [E_OutOfWritable]
text に指定した文字列の末尾に改行が自動的に入らないテキストが作成されます。
サンプル
カレントフォルダに a.txt ファイルを作る
CreateFile "a.txt", "ABC"
サンプル
obj の xml プロパティを、テンポラリファイルに出力して開く
start CreateFile( "*.xml", obj.xml )
start
obj
xml
Unicode 形式かどうかを維持してファイルの内容を変更する
サンプル
path = "_work.txt"
text = ReadFile( path )
'// ここで text を変更
Set cs = new_TextFileCharSetStack( ReadUnicodeFileBOM( path ) )
CreateFile path, text
cs = Empty
ReadFile
new_TextFileCharSetStack
ReadUnicodeFileBOM
補足
new_TextFileCharSetStack
を使うと、テキストファイルのフォーマットを指定できます。
new_IsSafeFileUpdateStack
を使うと、内部で
SafeFileUpdate
を使います。
path に相対パスを指定したとき、基準フォルダはカレント・フォルダになりますが、ワイルド
カードが含まれていると、テンポラリ・フォルダになります。 詳しくは、
→ GetTempPath
テスト
→ T_File.vbs [T_CreateFile]
→ T_File.vbs [T_CreateFile_Err]
関連
→ WaitForFile
→ GetTempPath
→ OpenForWrite
→ テキストファイルを作成する (VBS)
→ FileT_create (clib)
***********************************************************************
<<< touch >>>
***********************************************************************
touch
Sub touch( Path as string )
タイムスタンプ(ファイルの更新日時)を現在の日時に更新します。
【引数】
Path
タイムスタンプを更新するファイルのパス
Path に指定したファイルが存在しないときは、空のファイルを作成します。
ソース
→ vbslib.vbs
→ vbslib_helper.c
テスト
→ T_File.c
T_touch
***********************************************************************
<<< Out of Writable 警告 [E_OutOfWritable] >>>
***********************************************************************
Out of Writable 警告 [E_OutOfWritable]
スクリプトが想定していない場所に、ファイルを出力しようとしたとき、出力してよいかユーザに
確認を取ります。
コマンドプロンプトへの出力例:
[WARNING] Out of Writable, see "Out of Writable" in vbslib manual.
"C:\home\scriptlib\vbslib_new\_src\Test\vbslib_test\T_Writable\work2"
確認ウィンドウ:
vbslib を使ったスクリプトは、ダブルクリックした .vbs ファイルがあるフォルダ、または、ユーザが
設定した場所のフォルダのどちらかしか、ファイルを作成したり削除しないように作られます。
このルールが守られなかったとき、警告が出ます。
この機能は、スクリプト開発者のミスによって問題が起きないようにするためのものであり、
悪意のあるスクリプトは、この警告を出さないでファイルを壊すこともあります。
この警告が出る最も多い原因は、ユーザが設定した場所に書き込み許可を設定しなかった
スクリプトのバグです。 スクリプト開発者は、
AppKeyClass::NewWritable
を使ってください。
グローバル変数のデストラクタでファイル操作をすると、メイン関数で作成した Writables
オブジェクトが削除された後なので、必ず警告が発生します。
Out of Writable 警告のデバッグ
デバッガでスクリプトを起動し、Out of Writable の警告で、プログラムの終了やキャンセルを
選ぶと、例外によりブレークします。
Err.Raise E_OutOfWritable,, "Out of Writable """ & CheckPath & """"
' Watch g_CurrentWritables.CurrentPathes and CheckPath
g_CurrentWritables.CurrentPathes や CheckPath をウォッチウィンドウでチェックしてください。
Writable の状況を確認したいときは、
AppKeyClass::Watch
をばらまいてください。
コールツリー
AppKey.NewWritable
Writables::SetPathes
g_CurrentWritables.AskFileAccess
m_Pathes(i) = abs_path + "\"
Writable の登録
m_Pathes( UBound( m_Pathes ) ) = g_TempFile.m_FolderPath + "\"
テンポラリを Writable に登録
Writables::Enable
Writable を有効にする
WritablesStack::PushPathes
CurrentWritables::PushPathes
m_PathesStack.Push
mkdir など
g_AppKey.CheckWritable
公開キーのメソッド
m_Key.CheckWritable
隠しキーのメソッド
g_CurrentWritables.CheckWritable
"...\*" 以外のチェック
m_Key.CheckPlusWritable
"...\*" で追加されたものと比較
If IsEmpty( abs_path ) Then Exit Sub
Writable の中なので OK
m_Key.Ask
警告の表示
m_PlusWritables( UBound( m_PlusWritables ) ) = abs_path
Writable を追加
テスト
→ T_Writable
***********************************************************************
<<< NewWritable (AppKeyClass) >>>
***********************************************************************
NewWritable (AppKeyClass)
(src)
[ 親: Out of Writable 警告 ]
Function AppKeyClass::NewWritable( Pathes as variant ) as Writables
書き込み可能なフォルダの設定オブジェクトを生成します。
【引数】
Pathes
書き込み可能なフォルダの
パス
。文字列、または文字列の配列
返り値
Writable 設定オブジェクト
→ Writables::Enable
本関数を正しく使えば、
Out of Writable 警告
が出ないようになります。
通常は、サンプル1のように使い、NewWritable 関数の引数を調整します。
もしくは、使っているオブジェクトの
GetWritable メソッド
を使います。
AppKeyClass は、
Main 関数
の第2引数である AppKey のクラスです。
AppKey は、なるべく他の関数に渡さないようにしてください。
渡すと、書き込み可能なフォルダの設定を不正に変えられる可能性があります。
返り値である Writable 設定オブジェクトは、他の関数に渡すことができます。
Pathes に指定するパスの最後に "\*" があると、新規フォルダの作成を可能にし、
新規フォルダの中は書き込み可能にします。 "C:\folder1\*" とすると、C:\folder1
にファイルを作成できませんが、フォルダは作成できます。
すでに C:\folder1 にあるフォルダの中は、上書きされないように、書き込み不可
になります。
Program Files などの OS のシステムフォルダを NewWritable に指定すると、
System folder access の警告になります。 この警告を自動的に無視するときは、
NewWritable を呼び出す前に
SetWritableMode
に F_IgnoreIfWarn を指定して、
呼び出してください。
サンプル1: カレントフォルダを書き込み可能にする
Sub Main( Opt, AppKey )
Set w_= AppKey.NewWritable( "." ).Enable()
'// 書き込み可能な範囲
w_ = Empty '// これを書かないときは、関数が終わるまでが範囲
End Sub
NewWritable( "." )
Enable
サンプル: デスクトップに新規フォルダの作成を可能にし、新規フォルダの中は書き込み
可能にする。 新規フォルダを作成することができるフォルダのパスの後に \* を指定して
ください。
Sub Main( Opt, AppKey )
desktop = g_sh.SpecialFolders( "Desktop" )
Set w_= AppKey.NewWritable( desktop+"\*" ).Enable()
mkdir desktop+"\New Folder"
'// 書き込み可能な範囲
w_ = Empty '// これを書かないときは、関数が終わるまでが範囲
End Sub
サンプル: 複数のフォルダを書き込み可能にする
Sub Main( Opt, AppKey )
Set w_= AppKey.NewWritable( Array("out1","out2") ).Enable()
'// 書き込み可能な範囲
End Sub
サンプル: 後で out フォルダを書き込み可能にする
Sub Main( Opt, AppKey )
Set wr = AppKey.NewWritable( "out" )
sub2 wr
End Sub
Sub sub2( wr )
Set w_ = wr.Enable()
'// "out" に書き込み可能な範囲
End Sub
関連
→ Out of Writable 警告
→ SetWritableMode
→ ファイル名、パス
テスト
→ T_Writable フォルダ
→ [T_Writable] の説明
***********************************************************************
<<< GetWritable メソッド >>>
***********************************************************************
GetWritable メソッド
Function ClassA::GetWritable() as array of string
書き込み許可の設定が必要なフォルダの一覧を取得します。
GetWritable メソッドは、それぞれのクラスで定義してください。
使用サンプル:
Sub main2( Opt, AppKey )
Dim writable : writable = m.GetWritable
If not AppKey.InPath( writable, "..\out" ) Then Error
Dim w_ : Set w_= AppKey.NewWritable( writable ).Enable()
'// 書き込み可能な範囲
w_ = Empty
End Sub
writable
InPath
writable
NewWritable
writable
定義サンプル:
Class ClassA
Public Function GetWritable()
GetWritable = Array( "Work" )
End Function
End Class
***********************************************************************
<<< InPath (AppKeyClass) >>>
***********************************************************************
InPath (AppKeyClass)
(src)
Function AppKeyClass::InPath( Paths as Array of string, EnablePath as string ) as boolean
Paths に指定したパスの集合が、EnablePath の中に含まれるかどうかを返します。
【引数】
Paths
パスの配列
EnablePath
許可しているパス
返り値
Paths の要素がすべて許可しているパスに含まれているかどうか
ファイル:
vbslib.vbs
サンプル:
→ GetWritable メソッド
***********************************************************************
<<< CheckWritable (AppKeyClass) >>>
***********************************************************************
CheckWritable (AppKeyClass)
(src)
Sub AppKeyClass::CheckWritable( Path as string, Opt as variant )
指定したパスが、
Enable (Writables)
されているかどうかチェックします。
【引数】
Path
チェックするパス
Opt
Empty または c.ForMkDir (*1)
(*1)
Opt 引数に、g_VBS_Lib.ForMkDir を指定すると、Path に指定したパスの
フォルダーを作るために、Path の子フォルダー(Path より長いパス)だけが、
Enable (Writables) されていたときでも、チェックに引っかからなくなります。
Path が、Enable (Writables) されていなかったら、
Out of Writable 警告
が出ます。
サンプル
g_AppKey.CheckWritable path, Empty
関連
→ mkdir_for
***********************************************************************
<<< Watch (AppKeyClass) >>>
***********************************************************************
Watch (AppKeyClass)
Sub AppKeyClass::Watch()
Writable の状態を echo 出力します。
***********************************************************************
<<< Enable (Writables) >>>
***********************************************************************
Enable (Writables)
(src)
[ 親: Out of Writable 警告 ]
Function Writables::Enable() as WritablesStack
書き込み可能なフォルダを設定します。
【引数】
返り値
WritableStack オブジェクト
Writables は、
AppKeyClass::NewWritable
から取得できます。
Dim w_:Set w_= AppKey.NewWritable( "." ).Enable()
返り値の WritableStack オブジェクトが、どこからも参照されなくなったら、書き込み
可能では無くなります。
1つ目の WritableStack が存在するときに、2つ目の Writable::Enable をすると、ネスト
して、2つ目の WritableStack のみ有効になります。 2つ目の WritableStack が参照
されなくなったら、1つ目の WritableStack が有効になります。
Set w1 = AppKey.NewWritable( "out1" )
Set w2 = AppKey.NewWritable( "out2" )
Set w1_ = w1.Enable()
'// "out1" が書き込み可能
Set w2_ = w2.Enable()
'// "out2" が書き込み可能
w2_ = Empty
'// "out1" が書き込み可能
w1_ = Empty
関連
→ Out of Writable 警告
***********************************************************************
<<< SetWritableMode >>>
***********************************************************************
SetWritableMode
(src)
[ 親: Out of Writable 警告 ]
Sub SetWritableMode( Mode as integer )
Sub AppKeyClass::SetWritableMode( Mode as integer )
NewWritable
で指定していないフォルダにライトしようとしたときの動きを設定します。
F_AskIfWarn
ユーザにライトしていいかどうかを確認します(デフォルト)
F_ErrIfWarn
E_OutOfWritable エラーにします
F_IgnoreIfWarn
警告を無視します(AppKeyClass::SetWritableMode でのみ指定可能)
サンプル
SetWritableMode F_ErrIfWarn
サンプル: F_IgnoreIfWarn には、AppKey が必要
AppKey.SetWritableMode F_IgnoreIfWarn
Set w_=AppKey.NewWritable( env("%ProgramFiles%")+"\SampleApp" ).Enable()
SetWritableMode F_AskIfWarn
関連
→ Out of Writable 警告
***********************************************************************
<<< OpenForRead >>>
***********************************************************************
(src)
OpenForRead
Function OpenForRead( Path as string ) as TextStream
テキストファイルを開きます。(リード用=ファイルから入力します)
【引数】
Path
開くファイルのパス
→ ファイル名、パス
返り値
ファイルのストリーム
→ TextStream (VBScript)
FileSystemObject::OpenTextFile
と異なり、エラーがあったら、
エラーメッセージに Path が付きます。
E_FileNotExist エラー
または
E_PathNotFound エラー
になります。
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
サンプル
Set c = g_VBS_Lib
Set args = WScript.Arguments.Unnamed
If args.Count = 0 Then
path = InputPath( "ファイルのパス >", c.CheckFileExists )
Else
path = args(0)
End If
Set file = OpenForRead( path )
Do Until file.AtEndOfStream
line = file.ReadLine()
'// If InStr( line, "DEBUG" ) > 0 Then echo line
Loop
file = Empty
文字コードを指定するときは、
new_TextFileCharSetStack
を使ってください。
ただし、Shift-JIS, Unicode, UTF-8(BOMあり) は、使わなくても自動的に文字コード
を判定して、正しく読み込みます。
Set cs = new_TextFileCharSetStack( "EUC-JP" )
Set file = OpenForRead( args(0) )
cs = Empty
Do Until file.AtEndOfStream
line = file.ReadLine()
Loop
テスト
→ T_File.vbs # [T_OpenFile]
関連
→ FileSystemObject::OpenTextFile
→ new_TextFileCharSetStack
既定の文字コードを指定します
→ ReadFile
→ ReplaceTextFile
→ VBScript - テキストファイルの内容を読む (Read)
→ StringStream クラス
***********************************************************************
<<< ReadUnicodeFileBOM >>>
***********************************************************************
(src)
ReadUnicodeFileBOM
Function ReadUnicodeFileBOM( Path as string ) as integer
ファイルの文字コードを判定するために、ファイルの先頭にある BOM を読みます。
【引数】
Path
文字コードを判定するファイルのパス
返り値
BOM の文字コード。 c.UTF_8, c.Unicode, c.No_BOM, Empty(ファイルが無い)
サンプル
同じ文字コードを使ってファイルを作成する
Set cs = new_TextFileCharSetStack( ReadUnicodeFileBOM( "File1.txt" ) )
CreateFile "File1.txt", "abc"
cs = Empty
File1.txt
BOM が無いときは、OS に設定された地域の標準形式になります。
ただし、
XML宣言 (?xml)
や
MIME
や HTML の charset によって、文字コードが指定される場合もあり
ます。 その場合、
new_TextFileCharSetStack
を使って開きなおしてください。
テスト
→ T_File.vbs # [T_ReadUnicodeFileBOM]
関連
→ new_TextFileCharSetStack
→ 文字エンコーディングの指定方法
***********************************************************************
<<< ReadLineSeparator >>>
***********************************************************************
(src)
ReadLineSeparator
Function ReadLineSeparator( Path as string ) as integer
ファイルの先頭行を読んで、改行文字の種類を返します。
【引数】
Path
改行文字の種類を判定するファイルのパス
返り値
vbCRLF または vbLF
ファイルによっては、改行文字の種類がバラバラになっていることもあります。
サンプル
f.LineSeparator = ReadLineSeparator( "File1.txt" )
テスト
→ T_File.vbs # [T_ReadLineSeparator]
関連
→ new_TextFileLineSeparatorStack
***********************************************************************
<<< GetLineCount >>>
***********************************************************************
GetLineCount
Function GetLineCount( Text as string, RoundWay as integer )
文字列の行数をカウントします。
【引数】
Text
行数をカウントする文字列
RoundWay
通常 Empty、g_VBS_Lib.NoRound も可能
(下記)
返り値
文字列の行数
サンプル
Set c = g_VBS_Lib
Assert GetLineCount( "a", Empty ) = 1
Assert GetLineCount( "a" +vbCRLF, Empty ) = 1
Assert GetLineCount( "a" +vbCRLF+ "b", Empty ) = 2
Assert GetLineCount( "a" +vbLF+ "b", Empty ) = 2
Assert GetLineCount( "", Empty ) = 0
Assert GetLineCount( "a", c.NoRound ) = 1
Assert GetLineCount( "a" +vbCRLF, c.NoRound ) = 1.5
サンプル
position の位置の行番号を取得する
line_num = GetLineCount( Left( string, position ), Empty )
RoundWay 引数
RoundWay 引数には、通常 Empty を指定します。
g_VBS_Lib.NoRound を指定すると、最終行の行末が改行文字なら +0.5 します。
ソース
→ ToolsLib.vbs
テスト
→ T_StrEx.vbs
T_GetLineCount
***********************************************************************
<<< ReadVBS_Comment >>>
***********************************************************************
ReadVBS_Comment
Function ReadVBS_Comment( Path as string, StartTag as string, EndTag as string, Opt as Empty )
VBScript のファイルの中のコメントを、複数行の文字列として読み込みます。
【引数】
Path
VBScript ファイルのパス、# 可能、Empty =
WScript.ScriptFullName
StartTag
VBScript ファイルの中の、読み込みを開始する1つ上の行にあるキーワード
EndTag
読み込む最後の行の1つ下の行にあるキーワード
Opt
Empty を指定してください
返り値
読み込んだ文字列。 先頭に ' は付きません
StartTag と EndTag に指定したキーワードがヒットしないよう、下記のサンプルにあるように + でつなぐ
などの対策をしてください。
サンプル
スクリプト
text = ReadVBS_Comment( Empty, "["+"FileA.txt]", "[/"+"FileA.txt]", Empty )
'-------------------------------------------------------------------[FileA.txt]
'((( これはテキストファイルの代わりです )))
'
'END
'------------------------------------------------------------------[/FileA.txt]
text に入った値
((( これはテキストファイルの代わりです )))
END
最後の行の末尾には改行があります
Path に、URL のように # を付けると、StartTag と EndTag の一部になります。
下記の2つは同じ動きをします。 StartTag と EndTag に指定した引数は無視されます。
text = ReadVBS_Comment( "#FileA.txt", Empty, Empty, Empty )
text = ReadVBS_Comment( Empty, "["+"FileA.txt]", "[/"+"FileA.txt]", Empty )
ソース
→ vbslib.vbs
テスト
→ T_FileInScript.vbs
T_ReadVBS_Comment
関連
→ WriteVBS_Comment
→ new_FilePathForFileInScript
***********************************************************************
<<< OpenForWrite >>>
***********************************************************************
(src)
OpenForWrite
Function OpenForWrite( Path as string, Flags as integer ) as TextStream
テキストファイルを開きます。(ライト用=ファイルへ出力します)
【引数】
Path
開くファイルのパス
→ ファイル名、パス
Flags
Empty、またはオプション(下記)
返り値
ファイルのストリーム
→ TextStream (VBScript)
NewWritable
メソッドを使って、Out of Writable 警告が出ないようにしておいてください。
FileSystemObject::OpenTextFile
と異なり、エラーがあったら、エラーメッセージに Path が付きます。
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
テキストファイルの内容を書き換えるときは、文字コード(Unicode ファイルのBOM)や改行文字を
継承する
StartReplace
を使ってください。
サンプル
Dim file
Dim w_:Set w_= AppKey.NewWritable( "." ).Enable()
Set file = OpenForWrite( "a.txt", Empty )
file.WriteLine "abc"
file = Empty
NewWritable
a.txt
Flags 引数
Empty または 次の値
文字コードの指定は、次のどれかが指定できます。
new_TextFileCharSetStack
を使うと、その他のフォーマットも指定できます。
c.Unicode
Unicode 形式ファイルにします。 指定しないときは、
new_TextFileCharSetStack で指定した既定の文字コードになります。
c.UTF_8
BOM 付き UTF-8
c.UTF_8_No_BOM
BOM なし UTF-8
c.Shift_JIS
Shift-JIS
c.EUC_JP
EUC(JP)
改行コードの指定は、
new_TextFileLineSeparatorStack
を使ってください。
次の値と論理和をとることもできます。
c.Append
追記します。
Shift-JIS, Unicode, UTF-8(BOMあり) のときは、文字コードを指定しなくても、
元のファイルと同じ文字コードになります。
c は g_VBS_Lib から取得できます。
→ g_VBS_Lib
テスト
→ T_File.vbs [T_OpenForWrite]
→ T_File.vbs [T_OpenForWrite_Overwrite]
関連
→ FileSystemObject::CreateTextFile
→ ReplaceTextFile
→ StringStream クラス
→ バイナリ混在テキスト生成 (txt2bintxt.exe)
→ LockByFileMutex
→ CreateFile
***********************************************************************
<<< new_TextFileCharSetStack >>>
***********************************************************************
(src)
new_TextFileCharSetStack
Function new_TextFileCharSetStack( CharSet as string ) as TextFileCharSetStack
ファイルの文字コードを指定します。
【引数】
CharSet
ファイルの文字コード, Empty=デフォルト
新規作成するときの出力ファイルや、ファイルから読み込むときの文字コードを指定
します。 返り値のオブジェクトが削除されたら、指定は無効になります。
CharSetの例:
"Shift_JIS", "EUC-JP", "Unicode", "UTF-8", "UTF-8-No-BOM",
"ISO-8859-1", "ISO-2022-JP"
c.Unicode, c.UTF_8, c.UTF_8_No_BOM, c.EUC_JP, c.Shift_JIS,
c.ISO_2022_JP
新規作成時のデフォルトは、"Shift_JIS" です。
CharSet 引数に指定する文字列の大文字小文字は区別しません。
c.Unicode などの数値定数を指定することもできます。
"UTF-8" は、ファイルの先頭に
BOM
が付きます。 "UTF-8-No-BOM" は付きません。
BOM を付けないときは XML の encoding や HTML の charset などを用いて文字
コードを記述しなければ、多くのプログラムは文字化けを起こします。 一方で、
BOM があるとエラーを起こすプログラムも多くあります。
指定できる値は、レジストリの HKEY_CLASSES_ROOT\MIME\Database\Charset の
サブキーを参照してください。 ただし、"UTF-8-No-BOM" はサブキーにありません。
サンプル
Set cs = new_TextFileCharSetStack( "UTF-8" )
CreateFile "File1.txt", "abc"
"UTF-8"
ファイル内の文字コードの指定
XML の場合
UTF-8
HTML の場合
UTF-8
テスト
→ T_File.vbs [T_OpenForWrite]
関連
→ OpenForWrite
→ CreateFile
→ Charset (ADODB.Stream)
→ XmlWriteEncoding
XML ファイルの文字コードを指定します。
→ ReadUnicodeFileBOM
ファイルの先頭にある BOM を読みます。
→ ConvertCharCodeInHref
→ Text (BinaryArray)
文字コードセットを変換します。
***********************************************************************
<<< Decode_MIME_HeaderLine >>>
***********************************************************************
Decode_MIME_HeaderLine
Function Decode_MIME_HeaderLine( Line as string ) as string
MIME ヘッダーの1行を "=? … ?=" 形式から、通常の文字列に戻します。
【引数】
Line
MIME ヘッダーの1行
返り値
Line からでコードした通常の文字列
ソース
→ System.vbs
サンプル
str = Decode_MIME_HeaderLine( "Subject: =?ISO-2022-JP?B?YWJjGyRCJUYlOSVIGyhCZGVm?=" )
Assert str = "Subject: abcテストdef"
テスト
→ T_Binary.vbs
T_MIME
参考
→ MIME
→ ISO-2022-JP
→ Base64
関連
→ Base64 (BinaryArray)
→ Text (BinaryArray)
文字コードの変換
***********************************************************************
<<< new_TextFileLineSeparatorStack >>>
***********************************************************************
(src)
new_TextFileLineSeparatorStack
Function new_TextFileLineSeparatorStack( LS as string ) as TextFileLineSeparatorStack
ファイルの改行文字コードを指定します。
【引数】
LS
ファイルの改行文字コード、または Empty
返り値のオブジェクトが削除されたら、指定は無効になります。
サンプル
Dim ls : Set ls = new_TextFileLineSeparatorStack( get_ADODBConsts().Keep )
Set f = OpenForRead( Path )
ls = Empty
text = f.ReadLine()
LS 引数
Empty
自動判定 (下記)
vbCRLF, g_VBS_Lib.CRLF
CR+LF
vbLF, g_VBS_Lib.LF
LF
g_VBS_Lib.KeepLineSeparators
改行文字の種類を継承する(下記)
LS 引数 = Empty のときの動き
リードするときは改行文字を自動判定、ライトするときは CR+LF、修正するとき(*下記)は
改行文字の種類を継承します。
改行文字の種類を継承するときの動き (KeepLineSeparators)
「改行文字の種類を継承する」 とは、入力ファイルに書かれた改行文字の種類が、1行
単位で、そのまま出力ファイルに書かれることです。 1つのファイルに複数の改行文字の
種類が混ざっていても、そのまま継承されることです。
OpenForReplace
など、修正前のテキストと修正後のテキストの両方を指定する vbslib
の関数を使ったときは、その関数の中で改行文字の種類の継承処理が行われます。
そうではなく、OpenForRead などを使ってテキストをリードして、OpenForWrite などを
使ってテキストをライトする処理をプログラミングするときは、以下で説明する詳細な
手順を参考に、改行文字の継承を行ってください。
はじめに、
ReadLineSeparator
を使って、入力ファイルの先頭行の改行文字の種類を
判定して、出力ファイルのデフォルト改行文字の種類を設定します。
入力ファイル、出力ファイル、ともに、g_VBS_Lib.KeepLineSeparators (上記) のモード
を使うように、new_TextFileLineSeparatorStack を呼び出します。
KeepLineSeparators モードでは、TextStream::ReadLine や TextStream::WriteLine に
よってアクセスする1行のテキストの内容が、次のように変わります。
TextStream::ReadLine の返り値である1行のテキストの末尾に改行文字が加わります。
改行文字は、ファイルの内容によって、LF または CR+LF のどちらかになります。
ただし、最終行の末尾に改行文字が無いときだけ、改行文字は加わりません。
TextStream::WriteLine に渡すテキストの末尾に vbCRLF または vbLF を付けることが
できます。 付けたときは、その種類の改行文字が出力され、TextStream::WriteLine に
よって自動的に改行文字を付けることはなくなります。 また、デフォルトの改行文字も
指定した種類に変更されます。 改行文字を付けなかったときは、デフォルトの改行
文字が自動的に付きます。 つまり、TextStream::ReadLine で入力した1行をそのまま
TextStream::WriteLine に出力すると、改行文字の種類は継承され、末尾に改行文字
を付けない新たな1行を TextStream::WriteLine に出力すると、前の行の改行文字の
種類を継承します。
TextStream::WriteLineDefault を使うと、渡したテキストの改行文字を、デフォルトの
改行文字に置き換え、渡したテキストの最後に改行文字を追加して、出力します。
テスト
→ T_Replace.vbs # T_StartReplace_KeepRet_1
→ T_File.vbs # T_OpenFile_LineSepFromFS
参考
→ LineSeparator (ADODB.Stream)
関連
→ CutCRLF
***********************************************************************
<<< new_IsSafeFileUpdateStack >>>
***********************************************************************
(src)
new_IsSafeFileUpdateStack
Function new_IsSafeFileUpdateStack( IsEnabled as boolean ) as IsSafeFileUpdateStack
ファイルを作成するときに
SafeFileUpdate
を実行します。
【引数】
IsEnabled
SafeFileUpdate を実行するかどうか
返り値のオブジェクトが削除されたら、指定は無効になります。
サンプル
Dim sf : Set sf = new_IsSafeFileUpdateStack( True )
CreateFile "File1.txt", "abc"
テスト
→ T_File.vbs [T_CreateFile]
***********************************************************************
<<< g_FileOptions >>>
***********************************************************************
(src)
g_FileOptions
g_FileOptions = new FileOptionsClass
Class FileOptionsClass
Public Property Get CharSet '// as lower case string. ADODB.Stream.Charset
Public Property Get CharSetEx '// as Empty, c.UTF_8_No_BOM
Public Property Get LineSeparator '// as ADODBConsts.Keep
Public Property Get IsSafeFileUpdate '// as boolean
End Class
→ new_TextFileCharSetStack
→ new_IsSafeFileUpdateStack
***********************************************************************
<<< WriteVBS_Comment >>>
***********************************************************************
WriteVBS_Comment
Sub WriteVBS_Comment( Path as string, StartTag as string, EndTag as string,
Text as string, Opt as Empty )
VBScript のファイルの中のコメントに、複数行の文字列を書き込みます。
【引数】
Path
VBScript ファイルのパス、Empty =
WScript.ScriptFullName
StartTag
VBScript ファイルの中の、書き込みを開始する1つ上の行にあるキーワード
EndTag
書き込む最後の行の1つ下の行にあるキーワード
Text
書き込む文字列。 先頭に ' は不要です
Opt
Empty を指定してください
StartTag と EndTag に指定したキーワードがヒットしないよう、下記のサンプルにあるように + でつなぐ
などの対策をしてください。
サンプル
スクリプト(実行前)
WriteVBS_Comment Empty, "["+"FileA.txt]", "[/"+"FileA.txt]", _
"abc" +vbCRLF+_
"DEF" +vbCRLF, Empty
'-------------------------------------------------------------------[FileA.txt]
'((( これはテキストファイルの代わりです )))
'
'END
'------------------------------------------------------------------[/FileA.txt]
スクリプト(実行後)
WriteVBS_Comment Empty, "["+"FileA.txt]", "[/"+"FileA.txt]", _
"abc" +vbCRLF+_
"DEF" +vbCRLF, Empty
'-------------------------------------------------------------------[FileA.txt]
'abc
'DEF
'------------------------------------------------------------------[/FileA.txt]
abc
DEF
ソース
→ vbslib.vbs
テスト
→ T_FileInScript.vbs
T_WriteVBS_Comment
関連
→ ReadVBS_Comment
***********************************************************************
<<< WriteVBSLibFooter >>>
***********************************************************************
(src)
WriteVBSLibFooter
Sub WriteVBSLibFooter( OutFileStream as TextStream, Opt as WriteVBSLibFooter_Option )
vbslib include
を出力します。 (メイン.vbs ファイルの最後にするとき)
【引数】
OutFileStream
開いている書き込むファイル
Opt
オプション or Empty
現在実行している、メイン.vbs ファイルの中にある --- start of vbslib include --- 以降を
OutFileStream に出力します。
--- start of vbslib include --- が Main 関数より前にあるときは、何もしません。
WriteVBSLibFooter_Option
Class WriteVBSLibFooter_Option
Public CommandPromptMode
End Class
… Empty でないなら g_CommandPrompt の値を変更します
***********************************************************************
<<< WriteVBSLibHeader >>>
***********************************************************************
(src)
WriteVBSLibHeader
Sub WriteVBSLibHeader( OutFileStream as TextStream, Opt as WriteVBSLibHeader_Option )
vbslib include
を出力します。 (メイン.vbs ファイルの最初にするとき)
【引数】
OutFileStream
開いている書き込むファイル
Opt
オプション or Empty
現在実行している、メイン.vbs ファイルの中にある --- end of vbslib include --- まで(先頭から)を
OutFileStream に出力します。
--- start of vbslib include --- が Main 関数より後にあるときは、何もしません。
WriteVBSLibHeader_Option
Class WriteVBSLibHeader_Option
Public m_OverCommandPrompt
End Class
… Empty でないなら g_CommandPrompt の値を変更します
***********************************************************************
<<< OpenForReplace >>>
***********************************************************************
OpenForReplace
Function OpenForReplace( SrcPath as string, DstPath as string ) as ReplaceTextFile1
テキストファイルの内容を変更します。
【引数】
SrcPath
変更前のテキストファイルのパス
DstPath
変更後のテキストファイルのパス。 SrcPath と同じ、または Empty 可。
返り値
→ ReplaceTextFile1 クラス
ソース
→ vbslib.vbs
サンプル
Value の設定値を 0 から 1 に変える
Set file = OpenForReplace( "file1.txt", Empty )
file.Replace "Value = 0", "Value = 1"
file = Empty
file1.txt
Value = 0
Value = 1
サンプル
上と同じ内容の短縮形
OpenForReplace( "file1.txt", Empty ).Replace "Value = 0", "Value = 1"
file1.txt
Value = 0
Value = 1
サンプル
TopOfContexts タグの後ろに new Topic を追加する
Set file = OpenForReplace( "file1.html", Empty )
file.Replace "", ""+vbCRLF+ "new Topic"
file = Empty
サンプル
タグに囲まれた複数行を変更する
→ ReplaceRange (ReplaceTextFile1)
補足
変更する内容は、返り値のメソッドに指定します。
→ ReplaceTextFile1 クラス
ランダムアクセスに対応しています。 OpenForRead や OpenForWrite のようにシーケンシャル
(ファイルの先頭から順番)にアクセスする必要はなく、ReplaceTextFile1::Replace などを
任意の順番で呼び出すことができます。
DstPath を Empty にすると、DstPath = SrcPath にした時と同じ動きをします。
テスト
→ T_Replace.vbs # T_OpenForReplace
関連
→ OpenForReplaceXML
→ ReadFile
→ Replace
→ CreateFile
→ ReplaceSymbols コマンド
→ StringReplaceSetClass
→ StartReplace
***********************************************************************
<<< ReplaceTextFile1 クラス >>>
***********************************************************************
ReplaceTextFile1 クラス
(src)
テキストを置き換えます。
指定のタグで囲まれたテキストを置き換えます。
サンプル
→ OpenForReplace
取得
→ OpenForReplace
.Text
編集中のファイルの内容。
.Replace
テキストを置き換えます。
.ReplaceRange
指定のタグで囲まれたテキストを置き換えます。
.Close
テキストファイルの内容の変更を完了します。
***********************************************************************
<<< Text (ReplaceTextFile1) (OpenForReplace) >>>
***********************************************************************
Text (ReplaceTextFile1) (OpenForReplace)
Dim ReplaceTextFile1::Text as string
編集中のファイルの内容。
この内容を直接変更することで、ファイルの内容を変更することができます。
サンプル
Set rep = OpenForReplace( "file1.txt", Empty )
rep.Text = Replace( rep.Text, "from", "to" )
rep = Empty
テスト
→ T_Replace.vbs
T_OpenForReplaceText
関連
→ FindStringLines
***********************************************************************
<<< Replace (ReplaceTextFile1) >>>
***********************************************************************
[ 親: ReplaceTextFile1 クラス ]
Replace (ReplaceTextFile1)
(src)
Sub ReplaceTextFile1::Replace( FromText as string, ToText as string )
テキストを置き換えます。
【引数】
FromText
置き換える前のテキスト
ToText
置き換えた後のテキスト
置き換えた後のテキストが存在するときは、置き換えを行いません。
これは、VBS の Replace 関数と結果が異なりますが、追加的な置き換えをしたときに、多重的に
追加されることがなくなります。
例:
f.Replace "a = 0", "a = 0 : b = 0"
a = 0 の後に b = 0 を追加する
置き換える前
置き換えた後
a = 0
a = 0 : b = 0
a = 0 : b = 0
a = 0 : b = 0
… [a = 0 : b = 0 : b = 0] にはなりません
テスト
→ T_Replace.vbs
T_OpenForReplace
T_OpenForReplaceCharSet
***********************************************************************
<<< ReplaceRange (ReplaceTextFile1) >>>
***********************************************************************
[ 親: ReplaceTextFile1 クラス ]
ReplaceRange (ReplaceTextFile1)
(src)
Sub ReplaceTextFile1::ReplaceRange( StartOfFromText as string, EndOfFromText as string,
ToText as string )
指定のタグで囲まれたテキストを置き換えます。
【引数】
StartOfFromText
置き換える前のテキストが始まる場所にあるタグ(テキスト)
EndOfFromText
置き換える前のテキストが終わる場所にあるタグ(テキスト)
ToText
置き換えた後のテキスト。 通常、タグも含む。
置き換える範囲は、複数行であってもかまいません。
サンプル
Set file = OpenForReplace( "file1.html", Empty )
file.ReplaceRange "", "", _
""+vbCRLF+ "new Topic" +vbCRLF+""
file = Empty
置き換えサンプル
StartOfFromText = "", EndOfFromText = "" とします。
置き換える前
ToText
置き換えた後
abc123def
456
abc456def
abc123def
456
abc456def
123
456
789
789
テスト
→ T_Replace.vbs
T_OpenForReplaceRange
関連
→ ReadFileInTag
***********************************************************************
<<< Close (ReplaceTextFile1) >>>
***********************************************************************
Close (ReplaceTextFile1)
→ ReplaceTextFile1 クラス
Sub ReplaceTextFile1::Close()
テキストファイルの内容の変更を完了します。
デストラクタから自動的に呼ばれますが、明示的に呼び出すこともできます。
***********************************************************************
<<< SafeFileUpdateEx >>>
***********************************************************************
SafeFileUpdateEx
Sub SafeFileUpdateEx( FromTmpFilePath as string, ToFilePath as string, Option_ as string )
ファイルを安全に更新します。 上書き移動します。
【引数】
FromTmpFilePath
新しい内容が書かれたファイルのパス
ToFilePath
更新するファイルのパス
Option_
Empty、または、g_VBS_Lib.ToTrashBox
ソース
→ vbslib.vbs
サンプル
tmp_path = GetTempPath( "new_*.txt" )
CreateFile tmp_path, "新情報!"
SafeFileUpdateEx tmp_path, "FileA.txt", Empty
"新情報!"
"FileA.txt"
FileA.txt の内容を、"新情報!" という内容に更新します。
一時的に存在するファイル tmp_path に、新しい内容を出力する必要があります。
SafeFileUpdate を呼び出した後は、tmp_path の場所にファイルは無くなります。
更新するファイルを直接開いてライトするプログラムの場合、ライトしている途中で、
容量不足になったり、接続できなくなったりしてエラーになると、更新する前の内容
が消えてしまいます。 それだけでなく、更新した後の内容も保存できない可能性が
あります。 その場合、ファイルに格納していた情報がすべて消えてしまいます。
SafeFileUpdate は、そのリスクを回避します。
SafeFileUpdate を呼び出している途中で、ファイルの更新やバックアップなどに失敗
したら、エラーが発生しますが、ファイルの内容は、消えることなく、元に戻ります。
ただし、新しい内容は保存できていないので、エラー復帰して、別のディスクに保存
できるようにしてください。
Option_ = g_VBS_Lib.ToTrashBox を指定すると、
SafeFileUpdate
と同じ動きになります。
テスト
→ T_SafeCopy.vbs # [T_SafeFileUpdate]
***********************************************************************
<<< SafeFileUpdate >>>
***********************************************************************
SafeFileUpdate
Sub SafeFileUpdate( FromTmpFilePath as string, ToFilePath as string )
ファイルを安全に更新します。 上書き移動して、元の内容はゴミ箱に入ります。
【引数】
FromTmpFilePath
新しい内容が書かれたファイルのパス
ToFilePath
更新するファイルのパス
ソース
→ vbslib.vbs
テスト
→ T_SafeCopy.vbs # [T_SafeFileUpdate]
関連
→ new_IsSafeFileUpdateStack
***********************************************************************
<<< ConvertToFullPath >>>
***********************************************************************
ConvertToFullPath
(src)
Sub ConvertToFullPath( SrcFilePath as string, DstFilePath as string )
テキストファイルの中の相対パスや特殊フォルダのパスをフル・パスに変換してコピーします。
【引数】
SrcFilePath
変換前のファイルのパス
DstFilePath
変換後のファイルのパス(新規作成または上書き), Empty不可
%FullPath(x)% の x に相対パスを記述すると、DstFilePath のファイルが入ったフォルダを相対
パスの基準にしたフル・パスに変換されます。 基準を SrcFilePath ではなく DstFilePath にして
いる理由は、1つの SrcFilePath のファイルに対して、複数の場所で使用することができるよう
にするためです。
% を使った環境変数も展開されます。
変換前
変換後の例
%FullPath(..\SampleLib)%
C:\folder\SampleLib
%FullPath(.)%
C:\folder\current
%DesktopPath%
C:\Documents and Settings\user1\デスクトップ
参考
→ % を使った変換式
Unicode ファイルにするときは、次のように設定してから ConvertToFullPath を呼んでください。
Dim c : Set c = g_VBS_Lib
Dim cs : Set cs = new_TextFileCharSetStack( c.Unicode )
ConvertToFullPath "ans.txt", "ans_tmp.txt"
参考
→ TextFileConvertFormat::Set_
テスト
→ T_ConvAbs.vbs # ConvertToFullPath
***********************************************************************
<<< ReplaceStringTemplate >>>
***********************************************************************
ReplaceStringTemplate
Sub ReplaceStringTemplate( FolderPath as string, RegularExpressionPart as string,
BeforeTemplate as string, AfterTemplate as string, Opt as Empty )
テキストファイルの中をキーワードで検索し、テンプレートを置き換えます。
【引数】
FolderPath
検索対象フォルダーやワイルドカード
→ Execute (GrepClass)
RegularExpressionPart
置き換える前のキーワード。複数行不可
→ 正規表現
BeforeTemplate
置き換える前のテンプレート(複数行可)
AfterTemplate
置き換えた後のテンプレート(複数行可)
Opt
Empty を指定してください
置き換えた後のテンプレートにある変数が、置き換える前のテンプレートにないときは、
変数のまま残ります。 ただし、Opt 引数に dictionary 型を指定して、変数に一致する
キーに対応した値に置き換えることもできます。
RegularExpressionPart 引数に指定するキーワードは、BeforeTemplate に含まれるキーワード
を指定します。 AfterTemplate に含まれていなくても構いません。
サンプル
BeforeTemplate
AfterTemplate
@param ${Arguments}
@return ${RerutnValue}
関数名: ${FunctionName}
引数: ${Arguments}
返り値: ${RerutnValue}
補足: ${Note}
のように指定した場合、FolderPath にマッチしたあるファイルの内容は、次のように変化します。
@param First Parameter
@return None
関数名: ${FunctionName}
引数: First Parameter
返り値: None
補足:
ただし、Opt 引数に次のように指定したものとします。
Dict(Array( "${Note}", "" ))
Dict
予約変数
テンプレートの中に次の予約変数を記述することができます。
${FileName}
ファイル名に置き換わります
ソース
→ ToolsLib.vbs
テスト
→ T_fc.vbs
T_ReplaceStringTemplate
関連
→ RunReplace (ReplaceTemplateClass)
→ SearchStringTemplate
→ PartRep
→ GetLineNumOfTemplateDifference
→ Replace
→ ${ } 変数, LazyDictionaryClass
***********************************************************************
<<< new_ReplaceTemplateClass >>>
***********************************************************************
new_ReplaceTemplateClass
Function new_ReplaceTemplateClass( path_of_XML as string ) as ReplaceTemplateClass
テキストファイルのテンプレートを操作するアプリケーションのオブジェクトを生成します。
【引数】
xml_path
テンプレートに関するの設定ファイルのパス
返り値
テンプレートを操作するアプリケーション
path_of_XML に指定したファイルの内容については、サンプルを参照してください。
テキストファイルのテンプレートを操作するアプリケーションのオブジェクトは、次のメソッドを持ちます。
→ EchoOld
合っていない(古い)テンプレートの場所を表示します
→ RunGetDifference
合っていない(古い)テンプレートの中の場所を表示します
→ RunReplace
テンプレートを置き換えます
ソース
→ SyncFilesMenuLib.vbs
サンプル
→ Samples\ReplaceTemplate フォルダー
XML ファイルの説明は、サンプルの XML ファイルの中にあります。
***********************************************************************
<<< EchoOld (ReplaceTemplateClass) >>>
***********************************************************************
EchoOld (ReplaceTemplateClass)
<< new_ReplaceTemplateClass
Sub ReplaceTemplateClass::EchoOld()
現在使われているテンプレートと合っていない(古い)テンプレートの場所を表示します。
サンプル
表示内容
以下の場所にあるテンプレートがマッチしませんでした。
Template_getDifference コマンドで、違いがある場所の行番号を調べられます。
-------------------------------------------------------------------------------
Target\a.txt(2)
Target\a.txt(13)
-------------------------------------------------------------------------------
ソース
→ SyncFilesMenuLib.vbs
関連
→ SearchStringTemplate
***********************************************************************
<<< RunGetDifference (ReplaceTemplateClass) >>>
***********************************************************************
RunGetDifference (ReplaceTemplateClass)
<< new_ReplaceTemplateClass
Sub ReplaceTemplateClass::RunGetDifference()
現在使われているテンプレートと合っていない(古い)テンプレートの中の場所を表示します。
調べる対象のファイルの入力を要求されます。
サンプル
表示内容
Enterのみ:"Target\a.txt"
調べるファイルのパス >
以下の場所にあるテンプレートがマッチしませんでした。
-------------------------------------------------------------------------------
Target\a.txt(5)
-------------------------------------------------------------------------------
ソース
→ SyncFilesMenuLib.vbs
関連
→ GetLineNumOfTemplateDifference
***********************************************************************
<<< RunReplace (ReplaceTemplateClass) >>>
***********************************************************************
RunReplace (ReplaceTemplateClass)
<< new_ReplaceTemplateClass
Sub ReplaceTemplateClass::RunReplace()
テンプレートを置き換えます。
実行するかどうかの確認を要求されます。
サンプル
表示内容
以下の場所にあるファイルの中にあるテンプレートを置き換えます
編集するフォルダー = Target
ReplaceTemplateID_From = #Template1_Old
ReplaceTemplateID_To = #Template1
続行するには Enter キーを押してください . . .
-------------------------------------------------------------------------------
>ReplaceStringTemplate "Target", "\* Function:"
Target\a.txt
ソース
→ SyncFilesMenuLib.vbs
関連
→ ReplaceStringTemplate
***********************************************************************
<<< StartReplace >>>
***********************************************************************
StartReplace
(src)
Function StartReplace( SrcPath as string, TmpDstPath as string, IsDstWillBeExist as boolean )
as StartReplaceObj
StartReplaceObj
ファイルの一部を行単位で置き換える準備をします。
【引数】
SrcPath
置き換えようとするファイル
TmpDstPath
一時ファイルのパス、または置き換えた後のパス
IsDstWillBeExist
TmpDstPath が置き換えた後のパスかどうか
返り値
コンテキスト
StartReplace を呼び出すと、SrcPath と TmpDstPath のファイルを開きます。
返り値を使って、ファイルにアクセスできます。(下記サンプルを参照)
IsDstWillBeExist = False のときは、返り値の Finish メソッドを呼び出すと、全てのファイルを閉じ、
TmpDstPath から SrcPath へ、ファイルコピーを行い、TmpDstPath を削除します。
IsDstWillBeExist に g_VBS_Lib.DstIsBackUp を指定すると、TmpDstPath にバックアップを作成し、
SrcPath 置き換えた後の内容が入ります。
サンプル
Set rep = StartReplace( "a.txt", GetTempPath("*.txt"), False )
Do Until rep.r.AtEndOfStream
SplitLineAndCRLF rep.r.ReadLine(), line, cr_lf
line = Replace( line, "Value=0", "Value=1" )
rep.w.WriteLine line + cr_lf
Loop
rep.Finish
SplitLineAndCRLF
関連
→ GetTempPath
→ AddLastOfFileName
その他のサンプル
→ サンプル (ドラッグ&ドロップからテキスト処理)
→ サンプル (ウィザード)
改行文字コードについて
改行文字コードは、SrcPath に記述されているものが、そのまま継承されます。 ただし、
get_ADODBConsts
が使える環境である必要があります。 (通常、使えます)
ReadLine で取得できる行の末尾には、vbCRLF または vbLF が付きます。
SplitLineAndCRLF
を使えば、改行文字を分けることができます。
WriteLine で行を出力するときは、ReadLine で取得した改行文字を付けてください。
また、rep.r 「以外」のファイルから rep.w にライトするときは、リードするファイルを開くときに、
new_TextFileLineSeparatorStack( get_ADODBConsts().Keep ) が必要です。
テスト
→ T_Replace.vbs # [T_StartReplace]
関連
→ StringStream クラス
→ FindStringLines
***********************************************************************
<<< StartReplaceObj クラス >>>
***********************************************************************
StartReplaceObj クラス
テキストファイルの一部を置き換えるインターフェース
取得
→ StartReplace
→ StartReplace2
r
置き換えようとするファイルのストリーム
→ TextStream
w
一時ファイル、または置き換えた後のファイルのストリーム
→ TextStream
Finish
正常に完了したら呼び出す必要がある関数
ExitFinish Empty
置き換えをキャンセルします。
Class_Terminate
デストラクタ。 Finish または ExitFinish が呼ばれなかったら警告します
→ サンプル
***********************************************************************
<<< ReplaceTextFile >>>
***********************************************************************
ReplaceTextFile
(src)
ver4 で、廃止になりました。 OpenForReplace を使ってください。
→ OpenForReplace
Sub ReplaceTextFile( SrcPath as string, TmpDstPath as string,
bDstWillBeExist as boolean, ReplaceList as ReplaceItem, Opt as variant )
ファイルの一部を置き換えます。
【引数】
SrcPath
置き換えようとするファイル
TmpDstPath
一時ファイルのパス、または置き換えた後のパス
bDstWillBeExist
TmpDstPath が置き換えた後のパス=True, 一時パス=False
ReplaceList
置き換えるテキスト
Opt
Empty を指定してください
サンプル:
Dim reps : new_ReplaceItem_array reps, 1
reps(0).Src = "%base%" : reps(0).Dst = g_sh.CurrentDirectory
ReplaceTextFile "file.txt", GetTempPath("*.txt"), False, reps, Empty
1
%base%
g_sh.CurrentDirectory
file.txt
new_ReplaceItem_array については、
→ new_ReplaceItem_array : オブジェクトの配列を生成する
Class ReplaceItem
Public Src
Public Dst
End Class
参考
→ TextFileConvertFormat::Set_
***********************************************************************
<<< サンプル (ドラッグ&ドロップからテキスト処理) >>>
***********************************************************************
サンプル (ドラッグ&ドロップからテキスト処理)
スクリプト・ファイルに処理をするファイルを直接ドラッグ&ドロップしても、スクリプト・ファイルをダブル・
クリックして開いたウィンドウに処理するファイルをドラッグ&ドロップしても処理ができます。
「line = "> "+ line」 の部分を処理内容に書き換えてお使いください。
Sub Main( Opt, AppKey )
Dim c : Set c = g_VBS_Lib
Dim path : path = InputPath( "変換するファイル >", c.CheckFileExists or c.UseArgument1 )
Dim w_:Set w_=AppKey.NewWritable( path ).Enable()
Dim rep, line, cr_lf
Set rep = StartReplace( path, GetTempPath("Replace_*.txt"), c.DstIsBackUp )
Do Until rep.r.AtEndOfStream
SplitLineAndCRLF rep.r.ReadLine(), line, cr_lf
line = "> "+ line
rep.w.WriteLine line + cr_lf
Loop
rep.Finish
start GetEditorCmdLine( path )
End Sub
***********************************************************************
<<< サンプル (ウィザード) >>>
***********************************************************************
サンプル (ウィザード)
exe name>
と表示されるので、入力すると、
デスクトップに、テンプレート・ファイルを少し加工してフォルダを作成します。
wizard
sample_wizard.vbs
files
template.c
_src\Test\vbslib_test\T_Replace\T_Replace_Sample1 にあります。
sample_wizard.vbs
Sub main2( Opt, AppKey )
Dim exe_name
Dim desktop : desktop = g_sh.SpecialFolders( "Desktop" )
Dim rep, line
Dim w_:Set w_=AppKey.NewWritable( desktop ).Enable()
'//=== Input exe name
Do
exe_name = input( "exe name>" )
If exist( desktop + "\" + exe_name ) Then
Raise 1, "すでにデスクトップに " + exe_name + " が存在するため、新規作成できません"
Else
Exit Do
End If
Loop
'//=== Make output folder
mkdir desktop + "\" + exe_name
copy g_vbslib_folder + "*", desktop + "\" + exe_name + "\scriptlib"
'//=== Make exe_name.c
Set rep = StartReplace( "files\template.c", _
desktop + "\" + exe_name + "\" + exe_name + ".c", True )
Do Until rep.r.AtEndOfStream
line = rep.r.ReadLine()
line = Replace( line, "Sample", exe_name )
rep.w.WriteLine line
Loop
rep.Finish
'//=== Open output folder
Setting_openFolder desktop + "\" + exe_name
End Sub
***********************************************************************
<<< StartReplace2 >>>
***********************************************************************
StartReplace2
Function StartReplace2( SrcPath as string, MidPath as string, Flags as integer,
TmpDstPath as string, bDstWillBeExist as boolean ) as StartReplaceObj
StartReplaceObj
ファイルの一部を置き換えて、更にフィルタ処理をするための準備をします。
【引数】
SrcPath
置き換えようとするファイル
MidPath
一時ファイルのパス
Flags
F_Txt2BinTxt を指定してください(下記)
TmpDstPath
一時ファイルのパス、または置き換えた後のパス
bDstWillBeExist
TmpDstPath が置き換えた後のパスかどうか
返り値
コンテキスト
F_Txt2BinTxt
StartReplaceObj.w に、Chr(&hFF) から始める行を出力すると、その行はバイナリになり
ます。
→ バイナリ混在テキスト生成 (txt2bintxt.exe)
参考
→ TextFileConvertFormat::Set_
***********************************************************************
<<< PassThroughLineFilters >>>
***********************************************************************
PassThroughLineFilters
(src)
廃止予定
代わり
→ FindStringLines
→ Text (ReplaceTextFile1)
Sub PassThroughLineFilters( SrcPath as string, TmpDstPath as string,
IsDstWillBeExist as boolean, Opt as Empty, FilterArray as array of string )
指定のキーワードを含む行を抽出します。
【引数】
SrcPath
置き換えようとするファイル
TmpDstPath
一時ファイルのパス、または置き換えた後のパス
IsDstWillBeExist
TmpDstPath が置き換えた後のパスかどうか
Opt
Empty または False (=FilterArray に含まない行を抽出)
FilterArray
キーワードの配列
サンプル
(TRACE) と (DEBUG) を含む行だけにします。
PassThroughLineFilters( "a.txt", GetTempPath("*.txt"), False, Empty, _
Array( "(TRACE)", "(DEBUG)" )
テスト
→ T_Replace.vbs # [T_PassThroughLineFilters]
関連
→ FindStringLines
→ grep (検索)
***********************************************************************
<<< SplitLineAndCRLF >>>
***********************************************************************
SplitLineAndCRLF
(src)
Sub SplitLineAndCRLF( LineAndCRLF as string, out_Line as string, out_CRLF as string )
行の本文と、行末の改行文字を分けます。
【引数】
LineAndCRLF
改行文字が末尾に含まれている可能性がある文字列
out_Line
(出力) 改行文字より前の文字列
out_CRLF
(出力) 行末の改行文字
ファイル:
vbslib
***********************************************************************
<<< CutCRLF >>>
***********************************************************************
CutCRLF
(src)
Function CutCRLF( Line as string )
改行文字を削除します。
【引数】
Line
改行文字が削除される文字列
返り値
改行文字が削除された文字列
ファイル:
vbslib
テスト
→ T_Replace.vbs # [T_CutCRLF]
***********************************************************************
<<< Translate >>>
***********************************************************************
Translate
Sub Translate( TranslatorPath as string, FromLanguage as string, ToLanguage as string )
翻訳ファイルの情報に従って、テキストファイルの一部を翻訳します。
【引数】
TranslatorPath
翻訳ファイル(*.trans)のパス
FromLanguage
翻訳前の言語。 通常 "JP"
ToLanguage
翻訳後の言語。 通常 "EN"
英語に翻訳するときに、英文字以外が残っていたときは、エラーが発生します。
ソース
→ ToolsLib.vbs
テスト
→ T_Translate.vbs # [T_Translate1]
→ T_Translate.vbs # [T_Translate_sth]
参考
→ Translate コマンド
翻訳ファイル(*.trans) の説明など
***********************************************************************
<<< TranslateTest >>>
***********************************************************************
TranslateTest
(src)
Sub TranslateTest( TranslatorPath as string, FromLanguage as string, ToLanguage as string,
OutFolderPath as string )
翻訳ファイルの情報に従って、テキストファイルの一部を翻訳できるかどうかチェックします。
【引数】
TranslatorPath
翻訳ファイルのパス
FromLanguage
翻訳前の言語。 通常 "JP"
ToLanguage
翻訳後の言語。 通常 "EN"
OutFolderPath
翻訳後を格納するフォルダーのパス。 または "" = 出力しない
EN(英語)に翻訳するときは、Ascii 文字だけ使っているかどうかをチェックします。
Ascii 文字以外の文字があるときは、get_ToolsLibConsts().E_NotEnglishChar エラーになります。
テスト
→ T_Translate.vbs # [T_TranslateTest]
→ T_Translate.vbs # [T_TranslateTest_sth]
参考
→ Translate コマンド
翻訳ファイル(*.trans) の説明など
関連
→ Translate
→ TranslateTest コマンド
***********************************************************************
<<< TranslateEx >>>
***********************************************************************
TranslateEx
Sub TranslateEx( TranslatorPath as string, FromLanguage as string, ToLanguage as string,
in_out_Config as TranslateConfigClass )
翻訳ファイルの情報に従って、テキストファイルの一部を翻訳します。
【引数】
TranslatorPath
翻訳ファイルのパス
FromLanguage
翻訳前の言語。 通常 "JP"
ToLanguage
翻訳後の言語。 通常 "EN"
in_out_Config
(入出力) 各種設定、または Empty
→ TranslateConfigClass
TranslateConfigClass
.IsTestOnly
True = すべて翻訳されたかどうかチェックだけします。 (デフォルト)
False = 翻訳します。
.OutFolderPath
翻訳後のファイルを格納するフォルダーのパス。
省略時は、翻訳後のファイルを出力しません。
.BaseFolderPath
翻訳ファイルの BaseFolder タグを置き換えた後のパス。
省略時は、翻訳ファイルの BaseFolder タグのテキストが使われます。
ソース
→ ToolsLib.vbs
テスト
→ T_Translate.vbs
参考
→ Translate コマンド
翻訳ファイル(*.trans) の説明など
***********************************************************************
<<< new_TranslateToEnglish >>>
***********************************************************************
new_TranslateToEnglish
(src)
キーワード:
英訳、翻訳
廃止
Function new_TranslateToEnglish( DictionaryCsvPath as string ) as TranslateToEnglish
TranslateToEnglish
辞書ファイルを使って、ソース・ファイルのコメントを英訳します。
【引数】
DictionaryCsvPath
CSV 形式の辞書ファイルのパス
モジュール・ファイル:
ToolsLib.vbs
サンプル:
Dim tr : Set tr = new_TranslateToEnglish( "Text1.txt.trans.csv" )
'// tr.IsReverseTranslate = True
Dim w_:Set w_=AppKey.NewWritable( tr.Writable ).Enable()
tr.Translate
Text1.txt.trans.csv
関連
→ サンプル - new_TranslateToEnglish
英訳処理のサンプル
いわゆる英訳ソフトのような、文法解析を行って大きな辞書を引くような翻訳ではありません。
内部では、単純なテキストの置換と、置換後のファイルに含まれる文字が英文字だけかどうか
のチェックをします。 翻訳後に英文字以外の文字が残ったら、TranslateToEnglish::c.
E_NotEnglishChar エラーになります。
1行目の左は、変換前のファイルパスです。
1行目の右は、変換後のファイルパスです。
1行目は、% % で囲んだ環境変数を指定できます。
1行目の右を省略すると、ファイルの置き換えをします。
2行目以降は、翻訳するキーワードを指定します。
Text1_trans.csv
Text1.c, %eng%\Text1.c
メイン関数, Main function
サブ関数, Sub function
Text1.c
%eng%\Text1.c
#include
int main() { } // メイン関数
int sub() { } // サブ関数
#include
int main() { } // Main function
int sub() { } // Sub function
テスト
→ TranslateToEnglish フォルダ
関連
→ sample / CheckEnglishOnly
英文字以外が無いか、フォルダ全体をチェックする
***********************************************************************
<<< TranslateToEnglish クラス >>>
***********************************************************************
TranslateToEnglish クラス
廃止
取得
→ new_TranslateToEnglish
.DictionaryCsvPath
Property TranslateToEnglish::DictionaryCsvPath as string
CSV 形式の辞書ファイルのパス。
new_TranslateToEnglish に指定した引数の値と同じです。
.NotEnglishTextPath
Property TranslateToEnglish::NotEnglishTextPath as string
英語以外のテキスト・ファイルのパス。
new_TranslateToEnglish を呼び出したら、翻訳 CSV ファイルに書かれたパスが格納されます。
このとき、翻訳 CSV ファイルに書かれた環境変数は展開されます。
.Translate を呼び出す前に変更することができます。
.EnglishTextPath
Property TranslateToEnglish::EnglishTextPath as string
英語のテキスト・ファイルのパス。
NotEnglishTextPath と同じパスを指定できます。
new_TranslateToEnglish を呼び出したら、翻訳 CSV ファイルに書かれたパスが格納されます。
このとき、翻訳 CSV ファイルに書かれた環境変数は展開されます。
.Translate を呼び出す前に変更することができます。
.IsReverseTranslate
Property TranslateToEnglish::IsReverseTranslate as boolean
True なら、翻訳する方向を逆に設定します。
EnglishTextPath から NotEnglishTextPath に翻訳します。
デフォルトは False です。
.Writable
Property TranslateToEnglish::Writable as string
出力ファイルのパス。
AppKey.NewWritable に指定してください。
.Translate
Sub TranslateToEnglish::Translate()
翻訳を実行します。
.c.E_NotEnglishChar
Property TranslateToEnglish::c.E_NotEnglishChar as integer
翻訳後も英文字以外の文字が残っていたときのエラーコード。
.Reverse が呼び出されたときは、このエラーは発生しません。
***********************************************************************
<<< サンプル - new_TranslateToEnglish >>>
***********************************************************************
サンプル - new_TranslateToEnglish
廃止
翻訳ファイル *.trans.csv を、変換対象のフォルダーと同じ構成で配置して、翻訳します。
cd g_fs.GetParentFolderName( WScript.ScriptFullName )
Dim trs, tr, folder, fnames(), fname, w_, step_path, b
set_ "folder_jp", "C:\FolderA"
set_ "folder_en", GetFullPath( "..\folder_en", WScript.ScriptFullName )
echo_line
echo "コメントを英訳します"
echo "From: "+ GetVar( "folder_jp" )
echo "To: "+ GetVar( "folder_en" )
pause
'//=== 翻訳 CSV ファイルを集める
Set trs = new ArrayClass
ExpandWildcard GetVar( "folder_en" ) +"\*.trans.csv", F_File or F_SubFolder, folder, fnames
For Each fname in fnames
step_path = fname : CutLastOf step_path, ".trans.csv", Empty
set_ "step", step_path
trs.Add new_TranslateToEnglish( folder +"\"+ fname )
Next
'//=== 翻訳する。 ただし、翻訳済みファイルがあるとき(英文字以外が無く、新しいとき)は処理しない
For Each tr In trs.Items
b = MakeRule_compare( tr.EnglishTextPath, tr.NotEnglishTextPath )
If not b Then b = ( GetLineNumsExistNotEnglighChar( tr.EnglishTextPath, Empty ) > 0 )
If b Then
Set w_=AppKey.NewWritable( tr.Writable ).Enable()
tr.Translate
End If
Next
翻訳ファイル *.trans.csv
%folder_jp%\%step%, %folder_en%\%step%
日本語, Japanese
***********************************************************************
<<< GetLineNumsExistNotEnglighChar >>>
***********************************************************************
GetLineNumsExistNotEnglighChar
(src)
Function GetLineNumsExistNotEnglighChar( Path as string, out_LineNums as Array of integer ) as integer
テキスト・ファイルの中に、英文字以外の文字が含まれる行番号の配列を取得します。
【引数】
Path
テキスト・ファイルのパス
out_LineNums
(出力) 英文字以外の文字が含まれる行番号の配列、Empty 指定可
返り値
英文字以外の文字が含まれる行数
モジュール・ファイル:
ToolsLib.vbs
サンプル
GetLineNumsExistNotEnglighChar "Text1.txt", line_nums '//[out] line_nums
For Each i In line_nums
echo i
Next
サンプル
Set tr = new_TranslateToEnglish( "Text1.txt.trans.csv" )
If GetLineNumsExistNotEnglighChar( tr.EnglishTextPath, Empty ) > 0 Then ...
関連
→ CheckEnglishOnly
→ LenK
日本語(文字コード256以上)を 2文字として文字数を返します。
***********************************************************************
<<< CheckEnglishOnly >>>
***********************************************************************
CheckEnglishOnly
Function CheckEnglishOnly( CheckFolderPath as string, SettingPath as string )
as ArrayClass of CheckEnglishOnlyFound
テキスト・ファイルの中に、英文字以外の文字が含まれるファイルを一覧します。
【引数】
CheckFolderPath
調べるフォルダのパス
SettingPath
設定ファイルのパス。または Empty
返り値
英文字以外の文字が含まれるファイルの情報
モジュール・ファイル:
ToolsLib.vbs
サンプル:
Set founds = CheckEnglishOnly( "FolderA", "SettingForCheckEnglish.ini" )
For Each file In founds.Items
For Each found In file.NotEnglishItems.Items
echo file.Path +"("& found.LineNum &"): "+ found.NotEnglishText
Next
Next
サンプル: scriptlib フォルダーをチェックする
→ 3.CheckNotEnglish フォルダー
ソース
→ ToolsLib.vbs # [CheckEnglishOnly]
テスト
→ T_CheckEnglishOnly.vbs # [T_CheckEnglishOnly]
関連
→ CheckEnglishOnly
実行ファイル版、設定ファイルの例
→ CheckEnglishOnly
コマンド・プロンプト版
→ GetLineNumsExistNotEnglighChar
簡易版
→ TranslateTest
***********************************************************************
<<< MakeSettingForCheckEnglish >>>
***********************************************************************
MakeSettingForCheckEnglish
Sub MakeSettingForCheckEnglish( CheckEnglishOnlyFilePath as string,
TranslateFilePaths as array of string )
CheckEnglishOnly
の対象外となるファイルの一覧を翻訳ファイル(*.trans)から作成します。
【引数】
CheckEnglishOnlyFilePath
ファイルの一覧が書かれた出力ファイルのパス
TranslateFilePaths
翻訳ファイルのパスの配列
サンプル
VBScript
MakeSettingForCheckEnglish "SettingForCheckEnglish.ini", Array( "Sample.trans" )
翻訳ファイル
CheckEnglishOnly の設定ファイル
Sample1.txt
..\Sample2.txt
日本語Japanese
英語English
[CheckEnglishOnlyExe]
;// From "sample.trans" file
ExceptFile = Sample1.txt
ExceptFile = ..\Sample2.txt
ソース
→ ToolLib.vbs # [MakeSettingForCheckEnglish]
テスト
→ T_CheckEnglishOnly.vbs # [T_MakeSettingForCheckEnglish]
関連
→ CheckEnglishOnly
→ Translate
***********************************************************************
<<< ConvertBinaryEmulated >>>
***********************************************************************
ConvertBinaryEmulated
(src)
書きかけ
Dim zip1, sub_fo1, step_paths, step_path, target_root, work_root
'//=== convert binary file emulated
zip1 = work_root +"\converted_files"
unzip "converted_files.zip", zip1, Empty
sub_fo1 = "target"
step_paths = Array( sub_fo1+"\file1.bin", sub_fo1+"\file2.bin" )
For Each step_path In step_paths
ConvertBinaryEmulated target_root +"\"+ step_path, Empty, False, _
zip1+"\src\"+step_path, zip1+"\dst\"+step_path
Next
del zip1
***********************************************************************
<<< その他 >>>
***********************************************************************
その他
→ 開発サポートツール
-
PartRep
→ ReplaceSymbolsClass
複数のファイルの中の複数の単語(文字列)を一度に置き換えます。
→ % を使った変換式
→ OpenForReplaceXML
→ ReplaceRange (ReplaceTextFile1)
指定のタグで囲まれたテキストを置き換えます
旧仕様
ConvertToAbsPath
→ ConvertToFullPath
***********************************************************************
<<< テンポラリ・フォルダー >>>
***********************************************************************
テンポラリ・フォルダー
vbslib を使うと、PC の内臓 HDD (OSが指定するテンポラリ・フォルダの中の Report フォルダ)
に、一時ファイルを作成することがあります。
PCを借りているときは情報漏えいに注意してください。
vbslib のテンポラリ・フォルダの場所の例: (Windows Vista/7 のとき)
C:\Users\user1\AppData\Local\Temp\Report
C:\Documents and Settings\user1\Local Settings\Temp\Report
テンポラリ・フォルダを削除するときは、
→ DelTemp
テンポラリ・フォルダの設定は、
Setting_getTemp
関数を作成することで変更できます。
ゴミ箱にも一時ファイルが格納されることがあります。
→ SafeFileUpdate
ごみ箱を空にしてください。
参考
→ GetTempPath
***********************************************************************
<<< GetTempPath >>>
***********************************************************************
(src)
GetTempPath
Function GetTempPath( BasePath as string ) as string
テンポラリ・フォルダ
の中のファイルやフォルダのパスを返します。
【引数】
BasePath
ファイル名のテンプレート。 * または ? を含んでもよい
返り値
テンポラリ・フォルダの中のファイルパス
BasePath に、* または ? を含んでいる場合は、ファイルまたはフォルダが存在
しないパスに変換して返します。
サンプル・ファイルパス: (Windows Vista のとき)
C:\Users\user1\AppData\Local\Temp\Report\090401\DataA_090401_1300_1.xml
C:\Users\user1\AppData\Local\Temp\Report\090401\DataA_1.xml
ファイルパスは、環境変数 TEMP の値を使っています。 上段は * 、下段は ? を使ったとき。
サンプル:
Dim f, path
Dim c : Set c = g_VBS_Lib
path = GetTempPath( "DataA_*.xml" )
Set f = OpenForWrite( path, c.Unicode )
f.WriteLine ""
f = Empty
start path
GetTempPath
DataA_*.xml
c.Unicode
CreateFile
にワイルドカードを指定すれば、テンポラリ・フォルダにファイルを作る
ので、簡単にテキストファイルや XML ファイルを作成できます。
サンプル: obj の xml プロパティを、テンポラリファイルに出力して開きます。
start CreateFile( "*.xml", obj.xml )
start
CreateFile
obj
xml
本関数を呼び出すと、テンポラリ・フォルダに作成した2日以上前のファイルを削除
します。 このとき、ファイルがロックされていると再試行を繰り返して、最終的に
エラーになります。
BasePath 引数は、テンポラリ・フォルダからの相対パスになり、* はタイムスタンプと
識別番号になります。 ? は識別番号になります。 存在するファイルパスにならない
ように調整され、常に新しいファイルを作成します。 同時に保存期間を超えたファイル
やフォルダを削除します。(起動したプロセスで初めてテンポラリ・フォルダにファイル
を作成するとき、および g_TempPath= Empty のときのみ)
***********************************************************************
<<< ファイル名、パス >>>
***********************************************************************
ファイル名、パス
→ DesktopPath
デスクトップのフル・パスを返す。
→ GetFullPath
フル・パスを返す。
→ GetStepPath
相対パスを返す。
→ GetParentFullPath
親フォルダのフル・パスを返す。
→ IsFullPath
フル・パスかどうかを返します。
→ AddLastOfFileName
ファイルパスの最後文字列を追加します。
参考
→ ファイル名、パス (Windows)
→ サブ・フォルダー記号 (vbslib)
→ パスにピリオドを3つ並べた場合 (vbslib)
関連
→ 文字列
→ PathDictionaryClass
パスの辞書(集合)
→ new_PathDictionaryClass_fromXML
***********************************************************************
<<< DesktopPath >>>
***********************************************************************
DesktopPath
(src)
Function DesktopPath() as string
デスクトップのフル・パスを返します。
***********************************************************************
<<< GetFullPath >>>
***********************************************************************
GetFullPath
Function GetFullPath( StepPath as string, BasePath as string ) as string
フル・パスを返します。
【引数】
StepPath
返り値と同じファイルの相対パス
BasePath
基準フォルダのフル・パス、Empty でカレントフォルダ
返り値
StepPath と同じファイルのフル・パス
サンプル
path2 = GetFullPath( Path, BaseFolderPath )
path2 = GetFullPath( "..\"+ Path, BaseFilePath )
path2 = GetFullPath( Path, GetParentFullPath( BaseFilePath ) )
BasePath をファイルパスにしたときは、StepPath を1つ親にしてください。
GetFullPath( "file.txt", "C:\folder1" ) =
GetFullPath( "..\file.txt", "C:\folder1\file2.txt" )
g_fs.GetAbsolutePathName は、StepPath に * が入っていると、ピリオドに
置き換わってしまいますが、GetFullPath では発生しません。
パスにピリオドを3つ並べた場合 (vbslib)
親フォルダー、または、その親フォルダー … と探すときは、"..." とピリオドを
3つ並べてください。 ただし、スクリプトを記述できるときは、
SearchParent
を呼ぶ方が可読性が高まります。
GetFullPath( "...\file.txt", "C:\folder1\sub" )
上記の返り値は、C:\folder1\sub\file.txt 、C:\folder1\file.txt 、C:\file.txt
のいずれかになります。 または、E_PathNotFound エラーになります。
参考
→ ファイル名、パス (VBS)
ソース
→ vbslib.vbs
テスト
→ T_Path.vbs # [T_GetFullPath]
関連
→ GetCaseSensitiveFullPath
→ ConvertToFullPath
***********************************************************************
<<< GetStepPath >>>
***********************************************************************
GetStepPath
Function GetStepPath( AbsPath as string, BasePath as string ) as string
相対パスを返します。
【引数】
AbsPath
返り値と同じファイルのフル・パス
BasePath
基準フォルダのフル・パス
返り値
AbsPath と同じファイルの相対パス
ソース
→ vbslib.vbs
テスト
→ T_Path.vbs # [T_GetStepPath]
***********************************************************************
<<< NormalizePath >>>
***********************************************************************
NormalizePath
Function NormalizePath( Path as string ) as string
ファイル・パスの ".." や "." をなくします。
【引数】
Path
変換する前のファイル・パス
返り値
変換した後のファイル・パス
サンプル
Assert NormalizePath( "C:\folder\..\a" ) = "C:\a"
Assert NormalizePath( "C:\..\a" ) = "C:\..\a"
Assert NormalizePath( "C:\folder\.\a" ) = "C:\folder\a"
Assert NormalizePath( "C:\folder\a\" ) = "C:\folder\a"
Assert NormalizePath( "C:\" ) = "C:\"
Assert NormalizePath( "http://example.com/folder/" ) = "http://example.com/folder/"
末尾の \ はカットされますが、/ はカットされません。
ソース
→ vbslib.vbs
テスト
→ T_Path.vbs
T_NormalizePath
***********************************************************************
<<< GetCaseSensitiveFullPath >>>
***********************************************************************
GetCaseSensitiveFullPath
Function GetCaseSensitiveFullPath( StepPath as string ) as string
フル・パスを返します。 大文字小文字はファイル名に合わせます。
【引数】
StepPath
返り値と同じファイルの相対パス、または、フルパス
返り値
大文字小文字をファイル名に合わせたフル・パス
本関数は、ファイルシステムにアクセスして、ファイル名を調べます。
ファイルが存在しないときは、カレント フォルダーを基準とした相対パスとして、
フルパスを返します。
サンプル
path = GetCaseSensitiveFullPath( "file.txt" )
Assert path = "C:\Folder\File.txt"
file.txt に該当するファイルのフルパスが、C:\Folder\File.txt のとき。
ソース
→ vbslib.vbs
テスト
→ T_Path.vbs # [T_GetFullPath]
関連
→ GetFullPath
***********************************************************************
<<< IsFullPath >>>
***********************************************************************
IsFullPath
(src)
Function IsFullPath( Path as string ) as boolen
Path に指定したパスがフル・パスかどうかを返します。
テスト
→ T_Path.vbs # [T_IsFullPath]
***********************************************************************
<<< GetRootSeparatorPosition >>>
***********************************************************************
GetRootSeparatorPosition
Function GetRootSeparatorPosition( Path as string ) as integer
Path に入っているルート・フォルダーの位置を返します。
【引数】
Path
ファイルなどのパス
返り値
ルート・フォルダーの位置、0=相対パス
サンプル
Assert GetRootSeparatorPosition( "C:\File" ) = 3
Assert GetRootSeparatorPosition( "\File" ) = 1
Assert GetRootSeparatorPosition( "File" ) = 0
Assert GetRootSeparatorPosition( "..\File" ) = 0
Assert GetRootSeparatorPosition( "\\PC01\Folder\File" ) = 14
Assert GetRootSeparatorPosition( "http://www.example.com/" ) = 23
ソース
→ vbslib.vbs
テスト
→ T_Path.vbs
T_GetRootSeparatorPosition
***********************************************************************
<<< GetFilePathSeparator >>>
***********************************************************************
GetFilePathSeparator
Function GetFilePathSeparator( Path as string ) as string
Path に入っているフォルダーの区切り記号を返します。
【引数】
Path
ファイルなどのパス
返り値
フォルダーの区切り記号
フォルダーの区切り記号が無いときは、"\" を返します。
最も左にある / または \ が、どちらの文字かを返します。
サンプル
Assert GetFilePathSeparator( "http://www.example.com/" ) = "/"
ソース
→ vbslib.vbs
***********************************************************************
<<< GetPathWithSeparator >>>
***********************************************************************
GetPathWithSeparator
Function GetPathWithSeparator( Path as string ) as string
Path の最後に、フォルダーの区切り記号がなければ追加します。
【引数】
Path
ファイルなどのパス
返り値
フォルダーの区切り記号が最後に付いたパス
フォルダーの区切り記号は、Path に応じて、"\" または "/" が追加されます。
サンプル
Assert GetPathWithSeparator( "C:\BaseFolder" ) = "C:\BaseFolder\"
Assert GetPathWithSeparator( "C:\" ) = "C:\"
Assert GetPathWithSeparator( "http://www.example.com/fo" ) = "http://www.example.com/fo/"
Assert GetPathWithSeparator( "http://www.example.com/" ) = "http://www.example.com/"
ソース
→ vbslib.vbs
テスト
→ T_Path.vbs
T_GetPathWithSeparator
関連
→ AddIfNotExist
***********************************************************************
<<< SplitPathToSubFolderSign >>>
***********************************************************************
SplitPathToSubFolderSign
(src)
Sub SplitPathToSubFolderSign( in_out_Path as string, out_SubFolderSign as string,
out_IsFolder as boolean, out_Separator as string )
パスから、サブ フォルダー記号を分離します。
【引数】
in_out_Path
ファイルなどのパス (入力)記号あり、(出力)記号なし
out_SubFolderSign
(出力) サブ フォルダー記号、"." か "*" か ""
out_IsFolder
(出力) フォルダー指定かどうか
out_Separator
(出力) フォルダー区切り文字
サンプル
path = "C:\Folder\.\log.txt"
SplitPathToSubFolderSign path, sign, is_folder, separator
Assert path = "C:\Folder\log.txt"
Assert sign = "."
Assert is_folder = False
Assert separator = "\"
サブ フォルダー記号 (vbslib)
パスの最後の \ の左に * または . を指定することで、サブ フォルダーを
検索するかどうかを指定することができます。
"*\file.txt"
*\
… サブ フォルダーも含めて file.txt を検索する
".\file.txt"
.\
… サブ フォルダーも含めないで file.txt を検索する
"fo\*\file.txt"
*\
… サブ フォルダーも含めて fo フォルダーの中の file.txt を検索する
"fo\.\file.txt"
.\
… fo フォルダーにある file.txt を検索する
(参考) zsh では、** がサブ フォルダーも含めて検索します。
パスの最後が \ のときは、フォルダー名を指定したことになります。
"*\folder\"
\
… サブ フォルダーも含めて、フォルダー名 folder を検索する
サンプル
path (入力)
path (出力)
サブ フォルダー記号
フォルダー指定かどうか
"C:\Folder\.\log.txt"
"C:\Folder\log.txt"
"."
False
"C:\Folder\*\log.txt"
"C:\Folder\log.txt"
"*"
False
"C:\Folder\*\*.txt"
"C:\Folder\*.txt"
"*"
False
"C:\Folder\log.txt"
"C:\Folder\log.txt"
""
False
"C:\Folder\*.txt"
"C:\Folder\*.txt"
""
False
"C:\Folder\*"
"C:\Folder\*"
""
False
"C:\Folder\*\*"
"C:\Folder\*"
"*"
False
"C:\Folder\.\*"
"C:\Folder\*"
"."
False
"C:\.\Folder\"
"C:\Folder"
"."
True
"C:\*\Folder\"
"C:\Folder"
"*"
True
"C:\Folder\*\"
"C:\Folder\*"
""
True
"C:\Folder\.\"
"C:\Folder"
""
True
"C:\Folder\*\*\"
"C:\Folder\*"
"*"
True
"C:\Folder\.\*\"
"C:\Folder\*"
"."
True
補足
次の関数に、サブ フォルダー記号が使えます。
→ ArrayFromWildcard
→ ExpandWildcard
→ new_PathDictionaryClass_fromXML
→ PathDictionaryClass
テスト
→ T_Path.vbs
T_SplitPathToSubFolderSign
***********************************************************************
<<< GetParentFullPath >>>
***********************************************************************
GetParentFullPath
(src)
Function GetParentFullPath( Path as string ) as string
Path に指定したファイルやフォルダの親フォルダのフル・パスを返します。
【引数】
Path
基準パス(相対パスは、カレントからの相対)
返り値
親フォルダのフル・パス
サンプル
cd "C:\Folder"
Assert GetParentFullPath( "sub\file.txt" ) = "C:\Folder\sub"
参考
→ FileSystemObject::GetParentFolderName
関連
→ SearchParent
***********************************************************************
<<< GetParentFoldersName >>>
***********************************************************************
GetParentFoldersName
(src)
Function GetParentFoldersName( FilePath as string, Level as integer,
SeparatorReplacedStr as Empty or string )
FilePath に指定したファイルが入ったフォルダーの名前を Level 個つなげたものを返します。
【引数】
FilePath
基準となるファイルまたはフォルダーのパス
Level
親フォルダの個数。 親の方向へたどる数。 1以上
SeparatorReplacedStr
フォルダー区切り文字を置き換えた後の文字
返り値
複数の親フォルダーの名前をつなげたもの
Level = 1 なら、ファイルが入っているフォルダーの名前が返ります。
Level = 2 なら、ファイルが入っているフォルダーの親フォルダーの名前と、SeparatorReplacedStr
と、ファイルが入っているフォルダーの名前を結合した文字列が返ります
サンプル
cd "C:\Folder"
Assert GetParentFoldersName( "sub\file.txt", 1, "/" ) = "sub"
Assert GetParentFoldersName( "sub\file.txt", 2, "/" ) = "Folder/sub"
Assert GetParentFoldersName( "sub\file.txt", 99, "/" ) = "C:/Folder/sub"
Level が大きすぎても、エラーにはなりません。
テスト
→ T_Path.vbs # [T_GetParentFoldersName]
***********************************************************************
<<< ReplaceParentPath >>>
***********************************************************************
ReplaceParentPath
Function ReplaceParentPath( Path as string, FromSign as string, ToSign as string ) as string
親フォルダーの記号を置き換えます。
【引数】
Path
置き換える前のパス
FromSign
置き換える前の親フォルダーの記号
ToSign
置き換えた後の親フォルダーの記号
返り値
置き換えた後のパス
親フォルダーにアクセスさせないときに使用します。
返り値に、FromSign の文字列は、全く含まれなくなります。
内部で、
NormalizePath
が呼ばれます。
サンプル
Assert ReplaceParentPath( "..\..\folder", "..", "_parent" ) = "_parent\_parent\folder"
ソース
→ vbslib.vbs
テスト
→ T_Path.vbs
T_ReplaceParentPath
***********************************************************************
<<< SearchParent >>>
***********************************************************************
SearchParent
(src)
Function SearchParent( StepPath as string ) as string
StepPath に指定したファイルまたはフォルダを、親フォルダに向かって探します。
【引数】
StepPath
ファイル名、または相対パス
返り値
見つかったファイルまたはフォルダのフル・パス
サンプル:
..\common.xml などを開きます
Set root = LoadXML( SearchParent( "common.xml" ), Empty )
見つからないときは、Empty を返します。
テスト
→ T_Path.vbs
T_SearchParent
関連
→ GetParentFullPath
→ GetFullPath
を使ってピリオドを3つ並べる記法を展開する
***********************************************************************
<<< AddLastOfFileName >>>
***********************************************************************
AddLastOfFileName
(src)
Function AddLastOfFileName( BasePath as string, AddName as string ) as string
ファイルパスの最後(拡張子より前)に、文字列を追加します。 または拡張子を変更します。
【引数】
BasePath
追加前のファイルパス
AddName
追加する文字列
返り値
追加後のファイルパス
AddName に拡張子があったら、返り値の拡張子は、AddName の拡張子に変わります。
サンプル:
AddLastOfFileName( "file.txt", "123" ) = "file123.txt"
AddLastOfFileName( "file.txt", "123.html" ) = "file123.html"
AddLastOfFileName( "file.txt", ".html" ) = "file.html"
AddLastOfFileName( "file.txt", "." ) = "file"
拡張子を無くす
AddLastOfFileName( path1, "."+g_fs.GetExtensionName( path2 ) )
拡張子を合わせる
キーワード:
拡張子の変更
テスト
→ T_Path.vbs # [T_AddLastOfFileName]
関連
→ CutLastOfFileName
→ StrT_addLastOfFileName (clib)
***********************************************************************
<<< CutLastOfFileName >>>
***********************************************************************
CutLastOfFileName
(src)
Sub CutLastOfFileName( in_out_Path as string, LastStr as string, Opt as integer )
ファイル名(拡張子を除く)の最後に、指定した文字列があれば削除します。
【引数】
in_out_Path
(入出力)パスやファイル名を含む文字列
out_Obj
(出力) 削除する内容の文字列
Opt
Empty または
c.CaseSensitive
サンプル:
Dim s
s = "File_Add.txt"
CutLastOfFileName s, "_Add", Emtpy
'// s = "File.txt"
File_Add.txt
_Add
File.txt
呼び出し前の in_out_Path
LastStr
呼び出し後の in_out_Path
"File_Add.txt"
"_Add"
"File.txt"
"File_Add.txt"
"_Insert"
"File_Add.txt"
補足
拡張子も含めて削除するときは、
CutLastOf
を使ってください。
テスト
→ T_Str.vbs # [T_StrComp]
関連
→ CutLastOf
→ StrCompLastOfFileName
***********************************************************************
<<< StrCompLastOfFileName >>>
***********************************************************************
StrCompLastOfFileName
(src)
Function StrCompLastOfFileName( Path as string, LastStr as string, Opt as integer ) as integer
ファイル名(拡張子を除く)の末尾を比較します。
【引数】
Path
比較されるファイル名またはパス
LastStr
Path の末尾と比較する文字列
Opt
Empty または
c.CaseSensitive
返り値
Path の末尾 = LastStr なら、0
→ StrComp
Str 引数の値
LastStr 引数の値
返り値
"ABCDE.txt"
"CDE"
0 (=一致)
"ABCDE.txt"
"ABC"
0以外(=異なる)
"ABCDE.txt"
"CDE.txt"
0以外(=異なる)
テスト
→ T_Str.vbs # [T_StrComp]
関連
→ StrCompLastOf
→ CutLastOfFileName
***********************************************************************
<<< GetTagJumpParams >>>
***********************************************************************
GetTagJumpParams
(src)
Function GetTagJumpParams( PathAndFragment as string ) as TagJumpParams
タグジャンプ形式の文字列(パス+行番号)を分解します。
サンプル:
Set jumps = GetTagJumpParams( "C:\folder\file1.txt(100)" )
'// jumps.Path = "C:\folder\file1.txt"
'// jumps.LineNum = 100
'// IsEmpty( jumps.Keyword )
Set jumps = GetTagJumpParams( "file1.txt#Key" )
'// jumps.Path = "file1.txt"
'// jumps.Keyword = "Key"
'// IsEmpty( jumps.LineNum )
Set jumps = GetTagJumpParams( "file1.txt" )
'// jumps.Path = "file1.txt"
'// IsEmpty( jumps.LineNum )
'// IsEmpty( jumps.Keyword )
GetTagJumpParams( "C:\folder\file1.txt(100)" ).Path
参考
→ GetEditorCmdLine
タグジャンプ形式の文字列の詳細
TagJumpParams クラス
Class TagJumpParams
Public Path '// パス or ""、フル・パスとは限りません
Public LineNum '// as integer or Empty
Public Keyword '// as string or Empty
End Class
テスト
→ T_EditorDiff_Manually.vbs # [T_EditorManually]
→ T_Path.vbs # [T_GetTagJumpParams]
関連
→ GetEditorCmdLine
***********************************************************************
<<< GetTagJumpPath >>>
***********************************************************************
GetTagJumpPath
(src)
Function GetTagJumpPath( PathAndLine as string ) as string
タグジャンプ形式の文字列(パス+行番号)から、パスを取り出す。
廃止予定です。 GetTagJumpParams を使ってください。
サンプル:
path = GetTagJumpPath( "C:\folder\file1.txt(100)" )
path には、"C:\folder\file1.txt" が入ります。
テスト
→ T_Path.vbs # GetTagJumpPath
関連
→ GetTagJumpParams
***********************************************************************
<<< GetTagJumpLine >>>
***********************************************************************
GetTagJumpLine
(src)
Function GetTagJumpLine( PathAndLine as string ) as integer
タグジャンプ形式の文字列(パス+行番号)から、行番号を取り出す。
廃止予定です。 GetTagJumpParams を使ってください。
PathAndLine に行番号が無いときは、0 が返ります。
サンプル:
line = GetTagJumpPath( "C:\folder\file1.txt(100)" )
line には、100 が入ります。
テスト
→ T_Path.vbs # GetTagJumpLine
関連
→ GetTagJumpParams
***********************************************************************
<<< IsMovablePathToPath >>>
***********************************************************************
IsMovablePathToPath
(src)
Function IsMovablePathToPath( SrcPath as string, DstPath as string, IsDstFolder as boolean )
as boolean
ファイルやフォルダーのパス SrcPath と DstPath の間で、移動ができるかどうかを返します。
【引数】
SrcPath
移動元のファイルやフォルダーのパス
DstPath
移動先のファイルやフォルダーのパス
IsDstFolder
DstPath がフォルダーかどうか
返り値
移動ができるかどうか
テスト
→ T_Path.vbs # [T_IsMovablePathToPath]
***********************************************************************
<<< FilePathClass >>>
***********************************************************************
FilePathClass
ファイルのパスか、ファイルの内容に相当する文字列の抽象。
一部の vbslib の関数の引数にファイル名の代わりに指定することができるファイル・パス・オブジェクトです。
文字列や、スクリプトの中のコメントなどを、ファイルとして扱います。
次の関数で FilePathClass のオブジェクトを生成することができます。
new_FilePathForString
文字列をファイルとして扱います
new_FilePathForFileInScript
スクリプトの中のコメントをファイルとして扱います
GetFilePathString
入力ファイル・パスに相当する文字列を返します
次のプロパティがあります。
FilePathClass のオブジェクトを ReadFile 関数に渡し、その返り値を使ってファイルの内容を処理するコード
は共通にできるでしょう。
.Text
テキスト・ファイルの内容
→ ReadFile
.FilePath
ファイル・パス
関連
→ GetFilePathString
次の関数のファイル名の代わりに指定することができます。
ReadFile
LoadXML
AssertExist
IsSynchronizedFilesX
サンプル
Set root = LoadXML( new_FilePathForString( "" ), Empty )
ソース
→ vbslib.vbs
テスト
→ T_XML.vbs
T_LoadXML_PathObject
***********************************************************************
<<< new_FilePathForString >>>
***********************************************************************
new_FilePathForString
Function new_FilePathForString( Text as string ) as FilePathClass
文字列をファイルとして扱うように、ファイル名の代わりに指定するオブジェクトを返します。
【引数】
Text
ファイルの内容
返り値
ファイル名の代わりに指定するオブジェクト
→ FilePathClass
サンプル
Set root = LoadXML( new_FilePathForString( "" ), Empty )
ソース
→ vbslib.vbs
テスト
→ T_XML.vbs
T_LoadXML_PathObject
***********************************************************************
<<< new_FilePathForFileInScript >>>
***********************************************************************
new_FilePathForFileInScript
Function new_FilePathForFileInScript( Parameter as Empty ) as FilePathClass
スクリプトの中のコメントをファイルとして扱うように、ファイル名の代わりに指定するオブジェクトを返します。
【引数】
Parameter
VBScript ファイルのパス、# 可能、Empty =
WScript.ScriptFullName
返り値
ファイル名の代わりに指定するオブジェクト
→ FilePathClass
メイン・スクリプト・ファイル(WScript.ScriptFullName) に書かれた [FileInScript.*] がある行の次の行から、
[/FileInScript.*] がある行の前の行までを、ファイルの内容として扱います。 * は任意の文字列です。
参考
→ スクリプト・データ・ファイル (vbslib)
サンプル
スクリプト・ファイルの中にある XML データを CommandA に渡します。
ファイルの内容(XML データ)の部分の行頭には、' が必要です。
'------------------------------------------------------------[FileInScript.xml]
'
'
'
'-----------------------------------------------------------[/FileInScript.xml]
Sub Main( Opt, AppKey )
CommandA_App AppKey, new_FilePathForFileInScript( Empty )
End Sub
'--- start of vbslib include ------------------------------
: (vbslib をインクルードして main を呼び出すコード)
vbslib include
上記スクリプトから呼び出す CommandA_App 関数の例:
Sub CommandA_App( AppKey, Path )
Set root = LoadXML( Path, Empty )
out_path = root.selectSingleNode( "./Tag" ).getAttribute( "out_path" )
Set w_=AppKey.NewWritable( out_path ).Enable()
End Sub
Path に、URL のように # を付けると、スクリプト・ファイルの中の行末にあるタグを検索して、
その中のデータをファイルとして扱います。
path_object = new_FilePathForFileInScript( "#FileInScript.xml" )
ソース
→ vbslib.vbs
テスト
→ T_FileInScript.vbs
T_new_FilePathForFileInScript
関連
→ ReadVBS_Comment
***********************************************************************
<<< GetFilePathString >>>
***********************************************************************
GetFilePathString
Function GetFilePathString( Path as string or FilePathClass ) as string
入力ファイル・パスに相当する文字列を返します。
【引数】
Path
ファイル・パス・オブジェクト、または、入力ファイル・パス
返り値
入力ファイル・パスに相当する文字列
Path 引数が
FilePathClass 型
なら、WScript.ScriptFullName を返します。
Path 引数が 文字列なら、その文字列を返します。
返り値は、データが存在するファイル・パスを表示するため、データ・ファイルがあるフォルダーの
パスを取得するために使うことができます。
返り値を、
ReadFile
など、ファイルの内容にアクセスする関数に渡すと、期待と異なるデータを入力
してしまうことがあります。 たとえば、
new_FilePathForFileInScript
の返り値を、GetFilePath の
引数に指定したときは、スクリプトの中のコメントではなく、スクリプト・ファイル全体を入力します。
ソース
→ vbslib.vbs
***********************************************************************
<<< その他 >>>
***********************************************************************
その他
→ ReplaceFileNameWildcard
ワイルドカードを使って、ファイルパスを変更します。
旧仕様
IsAbsPath
→ IsFullPath
GetAbsPath
→ GetFullPath
GetParentAbsPath
→ GetParentFullPath
***********************************************************************
<<< ファイル一覧、ArrayFromWildcard >>>
***********************************************************************
ファイル一覧、ArrayFromWildcard
Function ArrayFromWildcard( WildcardPath as string ) as PathDictionaryClass of Nothing
ワイルドカードを展開します。 サブ フォルダーも検索します。
【引数】
WildcardPath
ワイルドカードを含むパス。フォルダー指定も可。配列可
(*1)
返り値
PathDictionaryClass
of Nothing
ファイル名やフォルダー名でソートされます。
→ PathNameCompare
サンプル
For Each full_path In ArrayFromWildcard( "data\*" ).FullPaths
echo full_path
Next
(*1) WildcardPath 引数
可能:
"*", "*.txt", "file*", "folder\*.txt", Array( "Fo\*.txt", "Fo\*.log" )
"NoWildcard.txt", "folder\*", "fo\*\file.txt", "*\file.txt", ".\file.txt"
不可能:
"folder*\file.txt", "folder"
サブ フォルダー記号
が使えます。
サブ フォルダー記号が指定されていない( .\ も *\ もない)ときは、
ワイルドカードが、ファイル名やフォルダー名に相当する部分(もっとも右の \ の右側)に
あれば、サブ・フォルダーも検索します。 また、指定したパスのファイルやフォルダーがない
ときはエラーにします。
ワイルドカードがなくてもフォルダーを指しているパスなら、そのフォルダーの中のサブ
フォルダーを検索します。
ファイルを指しているパスなら、サブ フォルダーを検索しません。
ただし、WildcardPath 引数に指定した
サブ フォルダー記号
が優先されます。
配列を指定したら、配列要素それぞれのワイルドカードを展開します。
PathDictionaryClass のオブジェクトを指定したら、そのオブジェクトを返します。
ソース
→ vbslib.vbs
テスト
→ T_Wildcard.vbs
T_ArrayFromWildcard1
性能
→ ファイルを一覧するときの速度
関連
→ ファイル一覧 (VBScript)
→ ファイル一覧
→ EnumFolderObject
高速なフォルダ一覧
→ CallForEach_copy
ファイル・パスの配列を使ってコピーする
***********************************************************************
<<< ファイルを一覧するときの速度 >>>
***********************************************************************
ファイルを一覧するときの速度
最も速いのは、
EnumFolderObject
を使う方法です。
テスト
→ T_Wildcard.vbs # T_Wildcard_Speed
参考
→ ファイルを一覧するときの速度 - VBScript
***********************************************************************
<<< ExpandWildcard >>>
***********************************************************************
ExpandWildcard
Sub ExpandWildcard( WildcardPath as string, Flags as integer,
out_Folder as string, out_StepPaths as array of string )
ワイルドカードを展開します。 サブ・フォルダーも検索します。
【引数】
WildcardPath
ワイルドカードを含むパス。フォルダ指定も可。配列可
(*1)
Flags
論理和フラグ
(*2)
out_Folder
(出力) wildcard が含まれるフォルダのフル・パス
out_StepPaths
(出力) ワイルドカードにマッチした相対パスの配列
ソース
→ vbslib.vbs
(*1) WildcardPath 引数
→ (*1) ArrayFromWildcard の WildcardPath 引数
(*2) Flags 引数
旧 F_File, F_Folder, F_SubFolder
下記の定数の or。 下記の c は、g_VBS_Lib の返り値。
c.File
ファイルを検索する
c.Folder
フォルダーを検索する
c.SubFolder
サブ・フォルダーも検索する。
ただし、WildcardPath 引数に指定した
サブ フォルダー記号
が優先されます。
サブ・フォルダーも検索するかどうかは、ワールドカードが
指定されたかどうかなどによって決めます。
c.SubFolderIfWildcard
詳細は、
→ (*1) ArrayFromWildcard の WildcardPath 引数
c.NoError
指定したパスに見つからないときにもエラーにしない
c.FullPath
out_Folder を out_StepPaths に含め、out_Folder = Empty にする
c.ArrayOfArray
out_StepPaths の配列要素数を、WildcardPath に指定した配列
の要素数と同じにして、配列要素は、それぞれのワイルドカード
にマッチしたパスの配列にする
サンプル
Set c = g_VBS_Lib
ExpandWildcard "data\*", c.File or c.SubFolder, folder, step_paths
For Each step_path In step_paths
If InStr( step_path, "\_setup_" ) = 0 Then '// 除外
echo GetFullPath( step_path, folder ) '// g_fs.BuildPath は使わないこと
End If
Next
wildcard
c.SubFolder
f.txt
f.bin
sub\f.txt
sub\abc.txt
f.txt
False
○
×
×
×
f.txt
True
○
×
○
×
*.txt
True
○
×
○
○
sub\*
True
×
×
○
○
sub
True
×
×
×
×
ExpandWildcard_Sort 変数
下記のように設定してから、ExpandWildcard を呼び出すと、ファイル名やフォルダー名で
ソートされます。 少し遅くなりますが、列挙されるファイルの順番がどのような環境でも
同じになります。
g_Vers("ExpandWildcard_Sort") = True
ソース
→ vbslib.vbs
テスト
→ T_Wildcard.vbs # Main
性能
→ ファイルを一覧するときの速度
関連
→ ファイル一覧 (VBScript)
→ ファイル一覧
→ EnumFolderObject
高速なフォルダ一覧
→ CallForEach_copy
ファイル・パスの配列を使ってコピーする
***********************************************************************
<<< ExpandWildcard の内部データ構造 >>>
***********************************************************************
ExpandWildcard の内部データ構造
dictionary < (folder_path), ArrayClass >
reg_exp_dic
ExpandWildcardWorkClass
work
ArrayClass
.items
re_type (*1)
.re
re2_type (*1)
.re2
boolean
.IsSubFolder
boolean
.is_root_folder
string
.folder_path
integer
.first_out_count
// ExpandWildcard_sub 開始時の UBound( out_StepPaths )
integer
.out_fast_ubound
// 実質的な UBound( out_StepPaths )
ArrayClass
.sort_box
array < File or Folder or (abs_path) >
out_StepPaths
(*1) re_type と re2_type は、以下の組み合わせのいずれかです。
WildcardPath 引数
re_type
re2_type
"*"
Empty
Empty
ワイルドカードがない
NameOnlyClass
Empty
"*" が1個のとき
StrMatchKey
Empty
* が2つのときか、? があるとき
RegExp
RegExp
***********************************************************************
<<< PathDictionaryClass >>>
***********************************************************************
PathDictionaryClass
キーがファイルやフォルダーのパスである辞書。
アイテムには、任意のオブジェクトを指定できますが、オブジェクト型のみ指定できます。
Set dic = new PathDictionaryClass
Set dic( "Folder\File.txt" ) = a_object
Assert dic( "Folder\File.txt" ) Is a_object
存在するファイルのパスをキーに指定してください。
フォルダーの中にあるファイルをキーに指定したら、フォルダーに対する Item が得られます。
ArrayFromWildcard
でも、PathDictionaryClass のオブジェクトが得られます。
Set dic = new PathDictionaryClass
Set dic( "Folder" ) = a_object
Assert dic( "Folder\File.txt" ) Is a_object
Set dic = ArrayFromWildcard( "Folder" )
Assert dic( "Folder\File.txt" ) Is Nothing
new_PathDictionaryClass_fromXML
を使えば、XML ファイルの中からパスの指定を取得できます。
Variable name
value
File path
Folder path
Except
path
Except
path
サブフォルダーのキーも設定されたときは、サブ フォルダーの設定が優先されます。
Set dic = new PathDictionaryClass
Set dic( "Folder" ) = a_object
Set dic( "Folder\Sub" ) = b_object
Assert dic( "Folder\File.txt" ) Is a_object
Assert dic( "Folder\Sub\File.txt" ) Is b_object
FilePaths プロパティは、フォルダーの中にあるファイルのパスも含まれます。
AddRemove が呼び出してあったら、FilePaths の対象外になります。
Set dic = new PathDictionaryClass
dic.BasePath = "C:\Folder"
Set dic( "Folder" ) = a_object
dic.AddRemove "*.bak"
Assert IsSameArray( dic.FilePaths, Array( "Files\1\A.txt", "Files\1\B.txt" ) )
FilePaths プロパティは、
PathNameCompare
でソートされた配列を取得します。
メンバー
.BasePath
キーに相対パスを指定した時の基準パス。 初期値は生成時のカレントフォルダー
.Item Set
ファイル、または、フォルダーのパスをキーに指定します。
サブ フォルダーも含むワイルド カードも指定可能です。
.Item Get
.Item Set に指定したフォルダーの中にあるファイルやフォルダーも指定可能。
ただし、.Item Set に指定したキーが相対パスなら、絶対パスとはマッチしません。
.FilePaths
.Item Set に指定したフォルダーの中にあるファイルも列挙します。
キーが相対パスなら、相対パスの配列が返ります。
.FullPaths
絶対パスの配列が返る FilePaths。
.AddRemove()
対象外にするフォルダーのパスや、拡張子を設定します
.FileExists( Path )
キーに指定したファイルパスが辞書にあるなら True。
キーに指定したフォルダーの中(のサブフォルダー)にあるファイルの
パスが指定されたときも、True。
.Add( Key, Item ), .Count, .Keys, .Items, .CompareMode, .Remove(), .RemoveAll()
Scripting.Dictionary と同じ
サンプル
Set dic = new PathDictionaryClass
Set dic( "Folder\Sub" ) = a_object
dic.AddRemove "*.bak"
Assert IsSameArray( dic.FilePaths, Array( "Files\1\A.txt", "Files\1\B.txt" ) )
For Each key In dic.FilePaths
Assert dic( key ) Is a_object
Next
ソース
→ vbslib.vbs
テスト
→ T_Wildcard.vbs
T_PathDictionary_1, T_PathDictionary_Wildcard, T_PathDictionary_OverSub
関連
→ Dictionary クラス (ハッシュ、辞書、Scripting.Dictionary)
→ new_PathDictionaryClass_fromXML
XML からファイルの集合を指定する
→ ArrayFromWildcard
PathDictionaryClass を取得する別の方法
→ EnumFolderObjectDic
→ Folder::SubFolders
フォルダーを一覧する
→ EnumFileObjectDic
→ Folder::Files
ファイルを一覧する
→ FilePathClass
ファイルのパスか、ファイルの内容に相当する文字列の抽象
***********************************************************************
<<< new_PathDictionaryClass_fromXML >>>
***********************************************************************
new_PathDictionaryClass_fromXML
Function new_PathDictionaryClass_fromXML( path_XML_Elements as IXMLDOMNodeList,
AttributeName as string, BasePath as string ) as PathDictionaryClass of IXMLDOMElement
FF-path 属性対応の XML から PathDictionaryClass のオブジェクトを生成します。
【引数】
path_XML_Elements
パスが書かれた XML 要素(タグ)のオブジェクトの集合
AttributeName
パスが書かれた XML 属性の名前
BasePath
相対パスの基準パス
返り値
PathDictionaryClass のオブジェクト
→ PathDictionaryClass
path_XML_Elements 引数には、XML の path 属性がある XML 要素(タグ)の集合を指定します。
返り値の辞書のアイテムは、XML 要素(タグ)オブジェクト(
IXMLDOMElement 型
)になります。
FF-path 属性対応の XML、path 属性と、Except タグ
FF-path 属性 (File or Folder as files Path attribute) は、ファイルのパスを指定する XML の path
属性です。
Sample.xml
Variable name
value
File path
Folder path
Except
path
Except
path
緑色の文字の名前は、FF-path 属性、または Variable タグによって定義された名前です。
赤色の文字の名前は、XML ファイルの種類によって異なります。
(new_PathDictionaryClass_fromXML 関数に指定します。)
上記は、Sample.txt ファイルと、SubFolder フォルダーとそのサブフォルダーの中にあるすべての
ファイルのうち、拡張子が obj と bak のファイルと、SubFolder\Debug フォルダーの中のファイルを
除いたファイルを、指定したことになります。
複数のファイルをまとめて指定したいときは、フォルダーのパスを指定することもできます。
フォルダーのパスを指定したら、そのフォルダーとそのサブフォルダーの中にあるすべてのファイル
を指定したことになります。
Except タグを使えば、サブフォルダーの中にあるファイルのうち、指定したファイルやフォルダーを
対象外にすることができます。 Except タグは、FF-path 属性に対応したタグの子ノードとして配置
してください。 ワイルドカードを使って拡張子を指定することができます。 複数指定するときは、
コンマで区切ってください。 相対パスの基準は、XML ファイルがあるフォルダーです。
フォルダーの中の一部のファイルやフォルダーに対して、特別な設定を XML に記述することが
できます。 記述する順番には依存しません。 子ノードの記述が優先されます。
サブ フォルダー記号
が使えます。
サブ フォルダー記号が指定されていないときは、ワイルドカードがあるときだけ、
サブ フォルダーも検索します。
path 属性を持つタグの名前は、"Folder" や "File" 以外の可能性があります。
ファイルを指定する属性が、path 属性でない可能性もあります。
それぞれの名前は、設定する XML ファイルの仕様を参照してください。
FF-path 属性が使える XML ファイルには、Variable タグを指定することができます。 そして、
path 属性に、Variable タグの参照を指定することができます。 (例:下記の ${ExceptExts})
Except タグの path 属性にも、Variable タグの参照を指定することができます。
→ Variable タグ
XML ファイルの仕様によっては、path 属性を持つタグに path 属性以外の属性を指定することが
できます。 (例:下記の Folder タグの attr 属性)
サンプル
path_of_XML = "Files\Files1.xml"
base_path = GetParentFullPath( path_of_XML )
Set root = LoadXML( path_of_XML, Empty )
Set dic = new_PathDictionaryClass_fromXML( root.selectNodes( "Folder | File" ), "path", _
base_path )
Assert IsSameArray( dic.FilePaths, Array( "SubFolder\A.c", "SubFolder\Sub\A.c" ) )
For Each key In dic.FilePaths
Assert dic( key ).getAttribute( "attr" ) = "ABC"
Next
new_PathDictionaryClass_fromXML
selectNodes
ソース
→ vbslib.vbs
テスト
→ T_Wildcard.vbs
T_PathDictionary_XML
関連
→ SyncFilesX
***********************************************************************
<<< ArrayFromWildcard2 >>>
***********************************************************************
ArrayFromWildcard2
Function ArrayFromWildcard2( WildcardPath as string ) as PathDictionaryClass of Nothing
ワイルドカードを展開します。 サブ フォルダーも検索します。
【引数】
WildcardPath
フォルダーパス。 ワイルドカードも可。
返り値
PathDictionaryClass
of Nothing
ArrayFromWildcard
との違いは、返り値の BasePath プロパティが、WildcardPath 引数に指定した
フォルダーになることです。 ワイルドカードがあると、ファイル名でフィルターします。
一般に、相対パスのベースとなるフォルダーのパスを WildcardPath 引数に指定します。
サンプル
ワイルドカードがないときは、フォルダーのパスとして展開します。
Set dic = ArrayFromWildcard2( "Folder" )
Assert dic.BasePath = GetFullPath( "Folder", Empty )
Assert IsSameArray( dic.FilePaths, Array( "A.txt", "B.ini", "Sub\A.txt" ) )
サンプル
ワイルドカードがあるときは、ファイル名でフィルターします。
Set dic = ArrayFromWildcard2( "Folder\*.txt" )
Assert dic.BasePath = GetFullPath( "Folder", Empty )
Assert IsSameArray( dic.FilePaths, Array( "A.txt", "Sub\A.txt" ) )
ソース
→ vbslib.vbs
テスト
→ T_Wildcard.vbs
T_ArrayFromWildcard2
***********************************************************************
<<< IsWildcard >>>
***********************************************************************
IsWildcard
(src)
Function IsWildcard( path as string ) as boolean
文字列の中にワイルドカードを含むかどうかを返します。
【引数】
path
調べる文字列
返り値
path の中にワイルドカードを含むかどうか
関連
→ ReplaceFileNameWildcard
***********************************************************************
<<< IsMatchedWithWildcard >>>
***********************************************************************
IsMatchedWithWildcard
(src)
Function IsMatchedWithWildcard( Path, WildCard ) as boolean
ワイルドカードにマッチするかどうかを返します。
【引数】
Path
検査する文字列
WildCard
ワイルドカード
返り値
Path がワイルドカードにマッチしたかどうか
WildCard で指定できるワイルドカードは、先頭に * だけです。
WildCard に * が無い文字列も指定できます。
サンプル
Assert IsMatchedWithWildcard( "a.bmp", "*.bmp" ) = True
Assert IsMatchedWithWildcard( "a.bmp", "*.jpg" ) = False
***********************************************************************
<<< RemoveWildcardMatchedArrayItems >>>
***********************************************************************
RemoveWildcardMatchedArrayItems
(src)
Sub RemoveWildcardMatchedArrayItems( in_out_PathArray as array of string, WildCard as string )
ワイルドカードにマッチしたパスを配列から除きます。
【引数】
in_out_PathArray
(入出力) パスが入った文字列の配列
WildCard
ワイルドカードを含むファイルまたはフォルダの名前
WildCard で指定できるワイルドカードは、先頭に * だけです。
WildCard に * が無い文字列も指定できます。
サンプル
arr = Array( "a.jpg", "b.bmp", "c.jpg" )
RemoveWildcardMatchedArrayItems arr, "*.jpg"
Assert IsSameArray( arr, Array( "b.bmp" ) )
***********************************************************************
<<< RemoveWildcard >>>
***********************************************************************
RemoveWildcard
(src)
Sub RemoveWildcard( WildCard as string, fnames as array of string )
廃止予定です
代わり
→ RemoveWildcardMatchedArrayItems
***********************************************************************
<<< ReplaceFileNameWildcard >>>
***********************************************************************
ReplaceFileNameWildcard
(src)
Function ReplaceFileNameWildcard( Path as string, FromStr as string, ToStr as string )
ワイルドカードを使って、ファイルパスを変更します。
【引数】
Path
ファイルパス(ワイルドカードは使えません)
FromStr
変更前の文字列。ワイルドカード可能。
ToStr
変更後の文字列。ワイルドカード可能。 "" 可能。
返り値
変更後のファイルパス。 Empty=Path が FromStr にマッチしなかった
ファイル:
vbslib.lib
Path が、FromStr にマッチしなかったときは、Empty が返ります。
サンプル
Assert ReplaceFileNameWildcard( "Fo\File.txt", "Fo\*.txt", "Fo\*.ini" ) = "Fo\File.ini"
Path に親フォルダー名が含まれるときは、FromStr, ToStr にも親フォルダー名を含めてください。
s= ReplaceFileNameWildcard( Fo\File.txt", "Fo\*.txt", "Fo\*.xml" '// OK
s= ReplaceFileNameWildcard( Fo\File.txt", "*.txt", "*.xml" '// NG
テスト
→ T_Wildcard.vbs # [T_ReplaceFileNameWildcard]
関連
→ StrMatchKey クラス
ワイルドカードにマッチするかどうか
→ RemoveWildcard
→ IsWildcard
***********************************************************************
<<< GetReadOnlyList >>>
***********************************************************************
GetReadOnlyList
Function GetReadOnlyList( FolderPath as string,
out_ReadOnlyDictionary as dictionary of boolean, Opt as Empty ) as integer
フォルダーにあるすべてのファイルのファイル読み取り属性を取得します。
【引数】
FolderPath
調べるフォルダーのパス
out_ReadOnlyDictionary
(出力) ファイル読み取り属性の辞書、キーは相対パス、Empty可
Opt
Empty を指定してください
返り値
読み取り属性がオンであるファイルの数
フォルダー自体の 読み取り属性は取得できません。
サンプル
count = GetReadOnlyList( "C:\Folder", read_onlys, Empty )
For Each step_path In read_onlys.Keys
is_read_only = read_onlys( step_path )
Next
ソース
→ ToolsLib.vbs
テスト
→ T_File.vbs
T_GetReadOnlyList
***********************************************************************
<<< EnumFolderObjectDic >>>
***********************************************************************
EnumFolderObjectDic
(src)
Sub EnumFolderObjectDic( FolderPath as string, Opt as Empty, out_Folders as dictinoary of Folder )
Folder
サブ・フォルダー・オブジェクトを高速に辞書に列挙します。 サブフォルダのサブフォルダも列挙します。
【引数】
FolderPath
調べるフォルダのパス。 このフォルダの中から列挙します
Opt
Empty を指定してください
out_Folders
(出力) サブフォルダを含む Folder オブジェクトの辞書
out_Folders は辞書型です。 キーは、フォルダーへの相対パスです。 その基準フォルダーは、FolderPath
です。 アイテムは、Folder オブジェクトです。
→ Folder オブジェクト (VBS)
out_Folders には、FolderPath の Folder オブジェクトと、FolderPath のサブフォルダーの Folder オブジェクト
の両方が含まれます。 FolderPath に相当するキーの値は "." です。
サンプル
EnumFolderObjectDic "C:\FolderA", Empty, folders1 '// [out] folders1
EnumFolderObjectDic "C:\FolderB", Empty, folders2 '// [out] folders2
For Each step_path In folders1.Keys
If not folders2.Exists( step_path ) Then
mkdir "C:\FolderB\"+ step_path
For Each file In folders1.Item( step_path ).Files
copy "C:\FolderA\"+ step_path + file.Name, "C:\FolderB\"+ step_path
Next
End If
Next
EnumFolderObjectDic
EnumFolderObjectDic
出力例
"."
"fe"
"fo1"
"fo1\fo1"
"fo1\fo11.ex"
"fo1\t1"
"fo2"
テスト
→ T_Wildcard.vbs # [T_EnumFolderObjectDic]
関連
→ ExpandWildcard
→ ファイルを一覧するときの速度
→ EnumFolderObject
→ EnumFileObjectDic
***********************************************************************
<<< EnumFileObjectDic >>>
***********************************************************************
EnumFileObjectDic
(src)
Sub EnumFileObjectDic( FolderOrPath as string or Folder, out_Files as dictinoary of File
File
フォルダの中のファイル・オブジェクトを高速に辞書に列挙します。
【引数】
FolderOrPath
調べるフォルダのパス。 または、Folder オブジェクト(高速)
out_Files
(出力) ファイルのオブジェクトの辞書
out_Files は辞書型です。 キーは、ファイル名です。 アイテムは、File オブジェクトです。
サブ・フォルダーにあるファイルは列挙しません。
サンプル
Dim files1, files2, file_name
EnumFileObjectDic "C:\FolderA", files1 '// [out] files1
EnumFileObjectDic "C:\FolderB", files2 '// [out] files2
For Each file_name In files1.Keys
If not files2.Exists( file_name ) Then
copy "C:\FolderA\"+ file_name, "C:\FolderB"
End If
Next
EnumFileObjectDic
EnumFileObjectDic
関連
→ EnumFolderObjectDic
***********************************************************************
<<< EnumFolderObject >>>
***********************************************************************
EnumFolderObject
(src)
Sub EnumFolderObject( FolderPath as string, out_Folders as array of Folder )
Folder
サブフォルダのオブジェクトを高速に列挙します。 サブフォルダのサブフォルダも列挙します。
【引数】
FolderPath
調べるフォルダのパス。 このフォルダの中から列挙します
out_Folders
(出力) サブフォルダのオブジェクトの配列
out_Folders には、FolderPath の Folder オブジェクトと、FolderPath のサブフォルダーの Folder
オブジェクトの両方が含まれます。
サンプル
EnumFolderObject "C:\FolderA", folders '// [out] folders
For Each folder In folders '// folder as Folder Object
For Each file In folder.Files '// file as File Object
echo file.Path
Next
Next
EnumFolderObject
→ Folder オブジェクト
→ File オブジェクト
サンプル
Set fname_key = new StrMatchKey
fname_key.Keyword = LCase( "*.txt" )
EnumFolderObject "C:\FolderA", folders '// [out] folders
For Each fo In folders '// fo as Folder
For Each fi In fo.Files '// fo as File
If fname_key.IsMatch( fi.Name ) Then
echo fi.DateLastModified
End If
Next
Next
EnumFolderObject
性能
→ ファイルを一覧するときの速度
関連
→ ExpandWildcard
→ ファイルを一覧するときの速度
→ Folder::SubFolders
サブ・フォルダーを列挙しない場合
→ EnumFolderObjectDic
→ EnumFileObjectDic
***********************************************************************
<<< GetSubFolders >>>
***********************************************************************
GetSubFolders
(src)
Sub GetSubFolders( folders as array of string, path as string )
サブ フォルダーのパスを列挙します。 サブ フォルダーのサブ フォルダーも列挙します。
【引数】
folders
(出力) サブ フォルダーのパスの配列
path
調べるフォルダーのパス。 このフォルダーの中から列挙します
関連
→ ExpandWildcard
***********************************************************************
<<< タブ文字 >>>
***********************************************************************
タブ文字
ChangeHeadSpaceToTab
行頭の空白文字をタブ文字に変換します
ChangeHeadTabToSpace
行頭のタブ文字を空白文字に変換します
ChangeMiddleSpaceToTab
行頭以外の空白文字をタブ文字に変換します
ChangeMiddleTabToSpace
行頭以外のタブ文字を空白文字に変換します
テスト
→ T_ChangeTabSpace フォルダ
***********************************************************************
<<< ChangeHeadSpaceToTab >>>
***********************************************************************
ChangeHeadSpaceToTab
ToolsLib.vbs (src)
Sub ChangeHeadSpaceToTab( ReadStream as TextStream, WriteStream as TextStream,
TabSize as integer )
行頭の空白文字をタブ文字に変換します。
【引数】
ReadStream
変換前のテキスト・ファイル・ストリーム
→ StartReplaceObj::r
WriteStream
変換後のテキスト・ファイル・ストリーム
→ StartReplaceObj::w
TabSize
1つのタブ文字あたりの空白文字の数
***********************************************************************
<<< ChangeHeadTabToSpace >>>
***********************************************************************
ChangeHeadTabToSpace
ToolsLib.vbs (src)
Sub ChangeHeadTabToSpace( ReadStream as TextStream, WriteStream as TextStream,
TabSize as integer )
行頭のタブ文字を空白文字に変換します。
【引数】
ReadStream
変換前のテキスト・ファイル・ストリーム
→ StartReplaceObj::r
WriteStream
変換後のテキスト・ファイル・ストリーム
→ StartReplaceObj::w
TabSize
1つのタブ文字あたりの空白文字の数
サンプル
Set rep = StartReplace( "in\sample.c", "out\sample.c", True )
ChangeHeadTabToSpace rep.r, rep.w, 4
rep.Finish
***********************************************************************
<<< ChangeMiddleSpaceToTab >>>
***********************************************************************
ChangeMiddleSpaceToTab
ToolsLib.vbs (src)
Sub ChangeMiddleSpaceToTab( ReadStream as TextStream, WriteStream as TextStream,
TabSize as integer )
行頭以外の空白文字をタブ文字に変換します。
【引数】
ReadStream
変換前のテキスト・ファイル・ストリーム
→ StartReplaceObj::r
WriteStream
変換後のテキスト・ファイル・ストリーム
→ StartReplaceObj::w
TabSize
1つのタブ文字あたりの空白文字の数
***********************************************************************
<<< ChangeMiddleTabToSpace >>>
***********************************************************************
ChangeMiddleTabToSpace
ToolsLib.vbs (src)
Sub ChangeMiddleTabToSpace( ReadStream as TextStream, WriteStream as TextStream,
TabSize as integer )
行頭以外のタブ文字を空白文字に変換します。
【引数】
ReadStream
変換前のテキスト・ファイル・ストリーム
→ StartReplaceObj::r
WriteStream
変換後のテキスト・ファイル・ストリーム
→ StartReplaceObj::w
TabSize
1つのタブ文字あたりの空白文字の数
***********************************************************************
<<< SetBreakByFName (デバッグ) >>>
***********************************************************************
SetBreakByFName (デバッグ)
(src)
Sub SetBreakByFName( FName as string )
指定した名前のファイルをライトするときにブレークさせます。
【引数】
FName
ブレークするファイル名(フォルダパス指定不可)
g_debug ≧ 1 のときだけブレークします。
vbslib の関数(copy、del、OpenForWrite など)ではない(g_fs.CopyFile など)関数によって
ライトしたときはブレークしません。
サンプル:
SetBreakByFName "Out.txt" '//[TODO]
テスト
→ T_Debug フォルダ
関連
→ SetupDebugTools
***********************************************************************
<<< IsWriteAccessDenied >>>
***********************************************************************
IsWriteAccessDenied
(src)
Function IsWriteAccessDenied( ErrNumber as integer, Path as string,
FolderOrFile as bitfield, in_out_nRetry as integer )
負荷が高いときに発生する書き込み拒否エラーに対処します。
【引数】
ErrNumber
チェックするエラーコード
Path
アクセスしたパス
FolderOrFile
F_File または F_Folder または F_File or F_Folder
in_out_nRetry
(入出力) 再試行回数
返り値
書き込み拒否エラーが発生したかどうか
VBScript (Windows) では、ファイルがロックされたときだけでなく、ディスク・アクセスの負荷が
高くなると、書き込み拒否エラー(エラーコード 70)が発生します。 このエラーに対処しないと、
スクリプトによる自動実行が中断されてしまいます。 IsWriteAccessDenied は、書き込み拒否
エラーによってスクリプトが中断されないように、再試行するスクリプトの記述を補助します。
vbslib が提供するファイル操作機能は、書き込み拒否エラーが発生しないように対処されて
いるため、IsWriteAccessDenied を呼び出す必要はありません。
参考
→ E_WriteAccessDenied
→ ファイルの負荷が高いとスクリプトが中断してしまう Windows (Web)
サンプル: 高負荷状態でも使える CreateTextFile
Dim f, path, n_retry, en, ed
n_retry = 0
Do
On Error Resume Next
Set f = g_fs.CreateTextFile( path )
en = Err.Number : ed = Err.Description : On Error GoTo 0
If not IsWriteAccessDenied( en, path, F_File, n_retry ) Then Exit Do
Loop
If en <> 0 Then Err.Raise en,,ed
path
path
書き込み拒否エラー(エラーコード 70)が発生する可能性があるものの例
g_fs.CopyFile, g_fs.CopyFolder, g_fs.MoveFile, g_fs.MoveFolder
g_fs.DeleteFolder, g_fs.CreateFolder
g_fs.CreateTextFile, g_fs.OpenTextFile
File::Name への代入による改名, ADODBStream::SaveToFile
キーワード:
g_FileSystemRetryMSec
再試行ユーザーインターフェース
g_FileSystemMaxRetryMSec
コマンドプロンプト(cscript.exe)で動く vbslib で、書き込み拒否エラーが発生したら、
次の警告を表示して、グローバル変数 g_FileSystemRetryMSec に指定した時間(ミリ秒)
(通常4秒)だけ Sleep します。 グローバル変数 g_FileSystemMaxRetryMSec に指定した
時間(ミリ秒)(通常60秒)だけ再試行したら、書き込み拒否エラーを発生させます。
再試行は、IsWriteAccessDenied の内部では行いません。 参考:下記サンプル。
ウィンドウ(wscript.exe)で動く vbslib で、書き込み拒否エラーが発生したら、次の警告を
表示して [ 再試行 ] か [ キャンセル ] を選ぶメッセージボックスが表示されます。
ユーザーが入力するまで自動実行は一時停止します。
書き込みできません。
[再試行] [キャンセル]
テスト
→ T_File_c_Manually.vbs
→ T_File_w_Manually.vbs
→ T_Replace_target.vbs # T_FromLock
→ T_Copy.vbs # T_CopyLocked
→ T_File.vbs # T_OverwriteFolderFile
***********************************************************************
<<< BinaryArray クラス、バイナリーファイル >>>
***********************************************************************
BinaryArray クラス、バイナリーファイル
(src)
バイナリー・ファイルのデータを扱いやすくするクラスです。
ファイルを配列のように扱うことができます。
ファイル:
System.vbs
関連
→ Byte 配列 (VBScript)
サンプル
バイナリーファイルからリード。Unicode 形式のテキストファイルかどうか判定する
Set bin = ReadBinaryFile( "unicode_sample.txt" )
If bin(0) = &hFF and bin(1) = &hFE Then
echo "This is unicode file."
End If
ReadBinaryFile
バイナリーファイルへライト。 Unicode 形式のテキストファイル 「む(=0x3080)」 を作る
Set bin = new BinaryArray
bin.Size = 4
bin(0) = &hFF '// low byte of BOM
bin(1) = &hFE '// high byte of BOM
bin(2) = &h80 '// low byte of hiragana mu
bin(3) = &h30 '// high byte of hiragana mu
bin.Save "unicode_sample.txt"
.Size
.Save
バイナリーファイルの変更。 Unicode テキスト・ファイルの先頭に 「は(=0x306F)」 を追加する
Set bin = new BinaryArray
bin.Load "unicode_sample.txt"
strbin = bin.Read( Empty, Empty )
strbin = LeftB( strbin, 2 ) + ChrB( &h6F ) + ChrB( &h30 ) + MidB( strbin, 3 )
bin.Write strbin, 0, Empty
bin.Save "unicode_sample.txt"
.Load
.Read
.Write
.Save
LeftB, MidB, RightB, LenB, AscB, ChrB は、文字列操作関数のバイナリ版です。
バイナリーファイルを構造化してリードする
Dim bin, out, size
bin.Write &h10, Empty, Array( &h12, &h34, &h56, &h78, &h9A, &hBC, &hDE )
size = bin.ReadStruct( &h10, out, Array( "a", vbByte, "b", vbInteger+vbArray, 3 ) )
'// out("a") = &h12
'// out("b")(0) = &h5634
'// out("b")(1) = &h9A78
'// out("b")(2) = &hDEBC
.Write
.ReadStruct
バイナリーデータを作成する
Set bin = new_BinaryArray( Array( &h42, &h4D ) )
メンバー
.Item
配列の要素。 配列番号。 (デフォルト・プロパティ)
.Size
配列の要素数。 バイト・サイズ
.Length
配列の要素数。 バイト・サイズ
.Count
配列の要素数。 バイト・サイズ
.ReDim_
配列の要素数を変更します。 ReDim Preserve と同じです。
.Load
ファイルの内容を、配列に入力します。
.Save
配列の内容を、ファイルに出力します。
.Read
配列の内容の一部を、Byte 配列にして返します。
.Write
配列の内容の一部を、変更します。
.ReadStruct
配列の内容の一部を、構造化した辞書を取得します。
.WriteStruct
構造化した配列を使って、バイナリ配列の内容の一部にライトします。
.WriteFromBinaryArray
配列の内容の一部をコピーします。
.ToEmpty
配列を空にします。 配列要素数は 0 になります。
.UBound_
配列の最大要素番号を返します。
.xml
配列のすべての要素を文字列にします。
テスト
→ T_Binary フォルダ
***********************************************************************
<<< new_BinaryArray >>>
***********************************************************************
new_BinaryArray
Function new_BinaryArray( IntegerArray as array of integer ) as BinaryArray
バイナリ配列を生成します。
【引数】
IntegerArray
バイナリーの内容
返り値
生成されたバイナリ配列
ソース
→ System.vbs
サンプル
Set bin = new_BinaryArray( Array( &h42, &h4D ) )
関連
→ ReadBinaryFile
***********************************************************************
<<< new_BinaryArrayFromFile >>>
***********************************************************************
new_BinaryArrayFromFile
Function new_BinaryArrayFromFile( Path as string ) as BinaryArray
バイナリ・ファイルからバイナリ配列を生成します。
【引数】
Path
バイナリ・ファイルのパス
返り値
生成されたバイナリ配列
ソース
→ System.vbs
関連
→ Load (BinaryArray)
→ ReadBinaryFile
***********************************************************************
<<< new_BinaryArrayFromBase64 >>>
***********************************************************************
new_BinaryArrayFromBase64
Function new_BinaryArrayFromBase64( Base64_Text as string ) as BinaryArray
Base64 でエンコードされた文字列からバイナリ配列を生成します。
【引数】
Base64_Text
Base64 でエンコードされた文字列
返り値
生成されたバイナリ配列
ソース
→ System.vbs
テスト
→ T_Binary.vbs
Test_of_Base64
サンプル
Set bin = new_BinaryArrayFromBase64( "EjRWeA==" )
関連
→ Base64 (BinaryArray)
***********************************************************************
<<< new_BinaryArrayAsText >>>
***********************************************************************
new_BinaryArrayAsText
Function new_BinaryArrayAsText( Text as string, CharacterSet as string ) as BinaryArray
文字列から指定した文字コードセットのバイナリ・データを持つバイナリ配列を生成します。
【引数】
Text
文字列
CharacterSet
文字コードセット
返り値
生成されたバイナリ配列
EUC-JP 形式の文字列が格納されたバイナリ配列を生成します。
サンプル
Set bin = new_BinaryArrayAsText( "漢字", "EUC-JP" )
ソース
→ System.vbs
テスト
→ T_Binary.vbs
T_Binary_TextCharacterSet
関連
→ Text (BinaryArray)
→ new_TextFileCharSetStack
文字コードセット一覧
***********************************************************************
<<< Item、配列番号 (BinaryArray) >>>
***********************************************************************
Item、配列番号 (BinaryArray)
(src)
Default Property BinaryArray::Item( i as integer ) as integer
配列番号を使って、バイナリ配列の要素を参照します。 (デフォルト・プロパティ)
【引数】
i
配列の要素の番号。 先頭は 0
1バイトずつアクセスします。
サンプル
Dim bin : Set bin = new BinaryArray
bin.Load "a.bin"
echo bin(0) '// bin.Item(0) と同じ
bin(0) = &h30
bin(0)
bin(0)
***********************************************************************
<<< Size, Length, Count (BinaryArray) >>>
***********************************************************************
Size, Length, Count (BinaryArray)
Property BinaryArray::Size as integer
Property BinaryArray::Length as integer
Property BinaryArray::Count as integer
バイナリ配列の要素数。 バイト・サイズ
値を設定すると、配列のサイズが変化します。
大きくなった部分の値は、0x00 になります。
小さくなった部分は削除されます。
サンプル
Dim bin : Set bin = new BinaryArray
bin.Load "a.bin"
bin.Size = bin.Size + 1
bin.Save "a_plus1.bin"
Size
Size
***********************************************************************
<<< ReDim_ (BinaryArray) >>>
***********************************************************************
ReDim_ (BinaryArray)
(src)
Sub BinaryArray::ReDim_( UBound as integer )
バイナリ配列の要素数(=バイトサイズ)を変更します。 ReDim Preserve と同じです。
【引数】
UBound
新しい配列の最大要素番号
ReDim の末尾にアンダースコアが付いています。
(ReDim は予約語であるため。)
***********************************************************************
<<< Load (BinaryArray) >>>
***********************************************************************
Load (BinaryArray)
Sub BinaryArray::Load( Path as string )
ファイルの内容を、バイナリ配列に入力します。
【引数】
Path
ファイルのパス
バイナリ配列に元々入っていた内容は無くなります。
関連
→ ReadBinaryFile
→ new_BinaryArrayFromFile
***********************************************************************
<<< Save (BinaryArray) >>>
***********************************************************************
Save (BinaryArray)
Sub BinaryArray::Save( Path as string )
バイナリ配列の内容を、ファイルに出力します。
【引数】
Path
ファイルのパス
サンプル
Dim i
Dim bin : Set bin = new BinaryArray
bin.ReDim_ &hFF
For i=0 To &hFF : bin(i) = i : Next
bin.Save "a.bin"
***********************************************************************
<<< Read (BinaryArray) >>>
***********************************************************************
Read (BinaryArray)
(src)
Function BinaryArray::Read( Offset as integer, Length as integer ) as array of Byte
array of Byte
バイナリ配列の内容の一部を、Byte 配列にして返します。
【引数】
Offset
配列の中で抽出する部分の先頭の位置。 配列の先頭から = 0
Length
配列の中で抽出する部分の長さ(バイト)。 -1 = 最後まで
返り値
配列の内容の一部を抽出した Byte 配列
→ Byte 配列
Offset = 0 または Empty にすると、配列の先頭からになります。
Length = -1 または Empty にすると、配列の最後までになります。
返り値に、文字列関数 LeftB, MidB, RightB, LenB, AscB, ChrB を使うことができます。
返り値に対して + 演算子は使えませんが、MidB( ByteArray, 1 ) などで String 型に変換
すれば、+ 演算子が使えます。
サンプル
binary = bin.Read( &h10, &h28 )
echo AscB( MidB( binary, 3, 1 ) )
サンプル
→ バイナリ・ファイルの変更
関連
→ ReadStruct (BinaryArray)
→ Write (BinaryArray)
→ Read (ADODB.Stream)
***********************************************************************
<<< Write (BinaryArray) >>>
***********************************************************************
Write (BinaryArray)
(src)
Sub BinaryArray::Write( Offset as integer, Length as integer, ByteArray as variant )
バイナリ配列の内容の一部を、変更します。
【引数】
Offset
配列の中で変更する部分の先頭の位置。 配列の先頭から = 0
Length
配列の中で変更する部分の長さ(バイト)。 -1 = ByteArray 全体
ByteArray
変更内容が格納された文字列、または配列、または数値
Offset = 0 または Empty にすると、配列の先頭からになります。
Length = -1 または Empty にすると、配列の最後までになります。
サンプル
bin.Write 0, Empty, Array( &h42, &h4D )
bin.Write 0, 2, ChrB( &h42 ) + ChrB( &h4D )
bin.Write 1, 1, &h4D
サンプル
→ バイナリ・ファイルの変更
関連
→ Read (BinaryArray)
→ WriteStruct (BinaryArray)
→ ConvertToByteArray (ADODBConsts)
***********************************************************************
<<< ReadStruct (BinaryArray) >>>
***********************************************************************
ReadStruct (BinaryArray)
(src)
Function BinaryArray::ReadStruct( Offset as integer, out_Dic as dictionary,
FormatArray as integer ) as integer
バイナリ配列の内容の一部をリードした内容を、構造化した辞書を取得します。
【引数】
Offset
配列の中で抽出する部分の先頭の位置。 配列の先頭から = 0
out_Dic
(出力) 数値の辞書。 キーは FormatArray に指定したもの。
FormatArray
バイナリ配列から抽出する部分の型の集合 (下記)
返り値
抽出した部分のバイナリの大きさ(バイト)
サンプル
Dim bin, out, size
bin.Write &h10, Empty, Array( &h12, &h34, &h56, &h78, &h9A, &hBC, &hDE )
size = bin.ReadStruct( &h10, out, Array( "a", vbByte, "b", vbInteger+vbArray, 3 ) )
'// out("a") = &h12
'// out("b")(0) = &h5634
'// out("b")(1) = &h9A78
'// out("b")(2) = &hDEBC
&h10 out
"a", vbByte, "b", vbInteger+vbArray, 3
FormatArray 引数
out_Dic (辞書型) に格納するキーの名前と、値の型を、順番に並べた配列を指定します。
vbInteger などの型に +vbArray したときは、配列をリードします。 このとき、更に配列の
要素数を指定してください。 要素数を -1 にすると、ファイルの最後までリードします。
vbByte
1バイト、符号なし、0〜255
vbInteger
2バイト、符号あり、-32768〜32767, &h0000〜&hFFFF
vbInteger + c.Unsigned
2バイト、符号なし、Long型、0〜65535
vbLong
4バイト、符号あり、-2147483648〜2147483647、&h10000〜&hFFFFFFFF
* + vbArray
配列。 vbByte などの型に vbArray をプラスしてください。
FormatArray には、配列の要素数も指定してください。
要素数を -1 にすると、ファイルの最後までリードします。
関連
→ WriteStruct (BinaryArray)
→ Read (BinaryArray)
***********************************************************************
<<< WriteStruct (BinaryArray) >>>
***********************************************************************
WriteStruct (BinaryArray)
(src)
Sub BinaryArray::WriteStruct( Offset as integer, FormatAndDataArray as array )
構造化した配列を使って、バイナリ配列の内容の一部に、数値の集合をライトします。
【引数】
Offset
バイナリ配列の中で変更する範囲の先頭位置。 配列の先頭から = 0
FormatAndDataArray
バイナリ配列へライトする部分の型とライトする値の集合 (下記)
サンプル
bin.WriteStruct 0, Array( vbByte, Array( &h12, &h34, &h56, &h78 ) )
'// bin = 0x0000 : 12 34 56 78
バイナリ配列 bin の 0 の位置に、vbByte型(8ビット整数型)の 0x12、0x34、0x56、0x78 格納します。
bin.WriteStruct &h40, Array( vbByte, &h12, vbInteger, Array( &h5634, &h9A78, &hDEBC ) )
'// bin = 0x0040 : 12 34 56 78 9A BC DE
バイナリ配列 bin の 0x40 の位置に、vbByte型(8ビット整数型)の 0x12 と、vbInteger型(16ビット
整数型)の 0x5634, 0x9A78, 0xDEBC を格納します。
FormatAndDataArray 引数
「値の型」 要素と、「値、または、値を並べた配列」 要素を繰り返す配列を指定します。
vbByte
1バイト、符号なし、0〜255
vbInteger
2バイト、符号あり、-32768〜32767, &h0000〜&hFFFF
vbInteger + c.Unsigned
2バイト、符号なし、Long型、0〜65535
vbLong
4バイト、符号あり、-2147483648〜2147483647、&h10000〜&hFFFFFFFF
関連
→ Write (BinaryArray)
→ new_BinaryArray
→ ReadStruct (BinaryArray)
→ ConvertToStructuredByteArray (ADODBConsts)
***********************************************************************
<<< WriteFromBinaryArray (BinaryArray) >>>
***********************************************************************
WriteFromBinaryArray (BinaryArray)
(src)
Sub BinaryArray::WriteFromBinaryArray( WriteOffset as integer,
ReadBinaryArray as BinaryArray, ReadOffset as integer, Size as integer )
バイナリ配列の一部を別のバイナリ配列に、高速にコピーします。
【引数】
Me
コピー先となるバイナリ配列
WriteOffset
Me の中で変更する範囲の先頭位置。 配列の先頭から = 0
ReadBinaryArray
コピー元となるバイナリ配列
ReadOffset
ReadBinaryArray の中の範囲の先頭位置。 配列の先頭から = 0
Size
コピーするサイズ(バイト), -1=最後まで
ReadBinaryArray のサイズより大きな値を Size 引数に指定したときは、最後までコピーします。
***********************************************************************
<<< Compare (BinaryArray) >>>
***********************************************************************
Compare (BinaryArray)
Function BinaryArray::Compare( ThanBinary as BinaryArray )
バイナリ配列を比較します。
【引数】
ThanBinary
比較対象のバイナリ配列
返り値
一致=0、StrComp と同じ
ソース
→ System.vbs
テスト
→ T_Binary.vbs
***********************************************************************
<<< SwapEndian (BinaryArray) >>>
***********************************************************************
SwapEndian (BinaryArray)
Sub BinaryArray::SwapEndian( Offset as integer, Size as integer, SwapUnitSize as integer )
バイナリ配列の一部のエンディアンを逆にします。
【引数】
Offset
エンディアンを逆にする範囲の先頭オフセット
Size
エンディアンを逆にする範囲のサイズ(バイト)
SwapUnitSize
逆にする単位
サンプル
'// bin = 12 34 56 78 9A BC DE
bin.SwapEndian &h2, &h4, 2
'// bin = 12 56 34 9A 78 BC DE
バイナリ配列 bin の 0x2 の位置から始まる 4バイトの範囲を、2バイト単位(2バイト整数)で逆にします。
ソース
→ System.vbs
テスト
→ T_Binary.vbs
***********************************************************************
<<< ToEmpty (BinaryArray) >>>
***********************************************************************
ToEmpty (BinaryArray)
Sub BinaryArray::ToEmpty()
配列を空にします。 配列要素数は 0 になります。
***********************************************************************
<<< UBound_ (BinaryArray) >>>
***********************************************************************
UBound_ (BinaryArray)
(src)
Property Get BinaryArray::UBound_() as integer
配列の最大要素番号を返します。
UBound の末尾にアンダースコアが付いています。
(UBound をオーバーライドすると、BinaryArray が実装できなくなるため。)
***********************************************************************
<<< xml (BinaryArray) >>>
***********************************************************************
xml (BinaryArray)
(src)
Property Get BinaryArray::xml() as string
配列のすべての要素を文字列にします。
出力例:
FF FE 6F 30 80 30
***********************************************************************
<<< MD5 (BinaryArray) >>>
***********************************************************************
MD5 (BinaryArray)
Property Get BinaryArray::MD5() as string
Property Get BinaryArray::SHA1() as string
Property Get BinaryArray::SHA256() as string
Property Get BinaryArray::SHA384() as string
Property Get BinaryArray::SHA512() as string
Property Get BinaryArray::RIPEMD160() as string
バイナリー・データ(配列の全体)に対する ハッシュ値。
MD5 ハッシュ値は、0〜9, a〜f の文字が32文字の文字列になります。
SHA-1 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
SHA-256 ハッシュ値は、0〜9, a〜f の文字が64文字の文字列になります。
SHA-384 ハッシュ値は、0〜9, a〜f の文字が96文字の文字列になります。
SHA-512 ハッシュ値は、0〜9, a〜f の文字が128文字の文字列になります。
RIPEMD-160 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
SHA-256, SHA-384, SHA-512, RIPEMD-160 は、Windows Vista 以降で使えます。
サンプル
echo ReadBinaryFile( "Sample.zip" ).MD5
5c1d447971bc0c49f09b2e965ac4ed37
… 表示例
ソース
→ System.vbs
テスト
→ T_Binary.vbs
関連
→ MD5
→ ハッシュ値
→ GetHash コマンド
→ MD5 リスト
キーワード:
SHA1, SHA-1, SHA256, SHA-256, SHA384, SHA-384, SHA512, SHA-512,
RIPEMD160, RIPEMD-160
***********************************************************************
<<< GetVersionString サンプル >>>
***********************************************************************
GetVersionString サンプル
zip などのパッケージ・ファイルのバージョンを MD5 から判定するソース・コードのサンプル
を示します。
Sub Main()
Set c = g_VBS_Lib
path = InputPath( "zipファイルのパス >", c.CheckFileExists )
echo GetVersionString( path )
End Sub
Dim g_VersionDataBase : g_VersionDataBase = Array(_
"c28bae2972d4e9c9f90ed1861f0b8002", "vbslib, 4.00, 2012-07-02",_
"700af264a9f00733b4d26f0407625d5b", "vbslib, 4.01, 2013-02-14" )
Function GetVersionString( Path )
If IsArray( g_VersionDataBase ) Then _
Set g_VersionDataBase = Dict( g_VersionDataBase )
value_of_MD5 = ReadBinaryFile( Path ).MD5
If g_VersionDataBase.Exists( value_of_MD5 ) Then
GetVersionString = g_VersionDataBase( value_of_MD5 )
Else
GetVersionString = "Unknown"
End If
End Function
関連
→ MD5 (BinaryArray)
→ GetHash
***********************************************************************
<<< Base64 (BinaryArray) >>>
***********************************************************************
Base64 (BinaryArray)
Property Get BinaryArray::Base64() as string
バイナリー・データ(配列の全体)に対する Base64 でエンコードされた文字列。
ソース
→ System.vbs
テスト
→ T_Binary.vbs
Test_of_Base64
サンプル
Set bin = new_BinaryArrayFromBase64( "EjRWeA==" )
echo bin.Base64
参考
→ Base64
関連
→ new_BinaryArrayFromBase64
→ Base64 コマンド
***********************************************************************
<<< Text (BinaryArray) >>>
***********************************************************************
Text (BinaryArray)
Function BinaryArray::Text( CharacterSet as string ) as string
バイナリー・データを指定した文字コードセットの文字列とし、VBScript の文字列を返します。
サンプル
Set shift_JIS_bin = new_BinaryArray( Array( &h8A, &hBF, &h8E, &h9A ) )
Assert shift_JIS_bin.Text( "Shift-JIS" ) = "漢字"
ソース
→ System.vbs
テスト
→ T_Binary.vbs
T_Binary_TextCharacterSet
関連
→ new_BinaryArrayAsText
VBScript の文字列を指定した文字コードセットに変える
→ new_TextFileCharSetStack
文字コードセット一覧
***********************************************************************
<<< バイナリ混在テキスト生成 (txt2bintxt.exe) >>>
***********************************************************************
バイナリ混在テキスト生成 (txt2bintxt.exe)
txt2bintxt.exe は、VBScript で、一部がバイナリになっているテキストファイルを
作成できるようにする変換ツールです。
ダウンロード
→ txt2bintxt.zip
バイナリになっている行は、行頭に Chr(&hFF) を出力してください。
f.WriteLine "123"
f.WriteLine Chr(&hFF)+"EF BB BF 0D 0A"
f.WriteLine "123"
EF BB BF 0D 0A
EF BB BF は、UTF-8 の BOM です。
こうして出力したファイルを、in.txt として、
txt2bintxt.exe in.txt out.txt
を実行すると、out.txt は次のようになります。
123
・ソ
123
31 32 33 0D 0A
EF BB BF 0D 0A
31 32 33 0D 0A
・ソ
EF BB BF 0D 0A
out.txt (テキスト表現)
out.txt (バイナリ表現)
不要になった入力ファイル(in.txt) は、別途削除してください。
関連
→ new_TextFileCharSetStack
BOM 付きテキストファイル
→ BinaryArray クラス
バイナリ・ファイル・アクセス
***********************************************************************
<<< Txt2BinTxt >>>
***********************************************************************
Txt2BinTxt
(src)
Sub Txt2BinTxt( SrcPath as string, DstPath as string )
参考
→ バイナリ混在テキスト生成 (txt2bintxt.exe)
***********************************************************************
<<< get_ADODBConsts >>>
***********************************************************************
get_ADODBConsts
(src)
Function get_ADODBConsts() as ADODBConsts
ADODB モジュールの定数をメンバーに持つオブジェクトを返します。
ファイル:
System.vbs
サンプル
Dim c : Set c = get_ADODBConsts()
t = f.Read( c.adReadAll )
ADODBConsts が定義する定数
adReadAll, adTypeBinary, adTypeText
adModeRead, adModeWrite, adModeReadWrite
adSaveCreateOverWrite
adCRLF, adLF, Keep
バイト配列を作成する関数
ConvertToByteArray
ConvertToStructuredByteArray
バイト配列と整数の間で変換する関数
BytesToShortInt
BytesToUShortIntToLongInt
BytesToLongInt
ShortIntToBytes
LongIntToUShortIntToBytes
LongIntToBytes
関連
→ ADODB.Stream
***********************************************************************
<<< ConvertToByteArray (ADODBConsts) >>>
***********************************************************************
ConvertToByteArray (ADODBConsts)
(src)
Function ADODBConsts::ConvertToByteArray( ByteArray as variant,
Offset as integer, Size as integer ) as array of Byte
文字列や配列や数値を、バイト配列に変換します。
【引数】
ByteArray
文字列、または配列、または数値
Offset
返り値の先頭となる ByteArray の中の位置。先頭=0
Size
ByteArray の中から返り値にするサイズ(バイト)。最後まで=-1
返り値
Write (ADODB.Stream)
に渡せる
Byte 配列
ファイル:
System.vbs
サンプル
Dim binary, stream
Dim c : Set c = get_ADODBConsts()
binary = c.ConvertToByteArray( ChrB( &h42 ) + ChrB( &h4D ), 0, Empty )
stream.Write binary
binary = c.ConvertToByteArray( &h4D, 1, Empty )
参考
→ Write (BinaryArray)
テスト
→ T_Binary フォルダ
***********************************************************************
<<< ConvertToStructuredByteArray (ADODBConsts) >>>
***********************************************************************
ConvertToStructuredByteArray (ADODBConsts)
(src)
Function ADODBConsts::ConvertToStructuredByteArray( FormatAndDataArray as array ) as array of Byte
構造化した配列を、バイト配列に変換します。
【引数】
FormatAndDataArray
バイナリ配列へライトする部分の型とライトする値の集合
返り値
Write (ADODB.Stream)
に渡せる
Byte 配列
参考
→ WriteStruct (BinaryArray)
構造化した配列、FormatAndDataArray 引数の説明
テスト
→ T_Binary フォルダ
***********************************************************************
<<< BytesToShortInt >>>
***********************************************************************
BytesToShortInt
(src)
Function ADODBConsts::BytesToShortInt( b0, b1, b2, b3 as integer ) as integer
2バイトのバイナリ・データを、-32768(&h8000)〜32767(&h7FFF) の整数に変換します。
サンプル
c.BytesToShortInt( &hFE, &hFF ) = &hFFFE
***********************************************************************
<<< BytesToUShortIntToLongInt >>>
***********************************************************************
BytesToUShortIntToLongInt
(src)
Function ADODBConsts::BytesToUShortIntToLongInt( b0, b1, b2, b3 as integer ) as integer
2バイトのバイナリ・データを、0〜65535 の整数に変換します。
サンプル
c.BytesToUShortIntToLongInt( &hFE, &hFF ) = 65534
***********************************************************************
<<< BytesToLongInt >>>
***********************************************************************
BytesToLongInt
(src)
Function ADODBConsts::BytesToLongInt( b0, b1, b2, b3 as integer ) as integer
4バイトのバイナリ・データを、Long 型整数に変換します。
サンプル
c.BytesToLongInt( &h78, &h56, &h34, &h12 ) = &h12345678
***********************************************************************
<<< ShortIntToBytes >>>
***********************************************************************
ShortIntToBytes
(src)
Function ADODBConsts::ShortIntToBytes( Value as integer ) as array of integer
-32768(&h8000)〜32767(&h7FFF) の整数を、2バイトの配列に変換します。
&h0000〜&h7FFF(Integer型)、&h10000〜 &h7FFFFFFF(Long型) は、正の整数です。
&h8000〜&hFFFF(Integer型)、&h80000000〜(Long型) は、負の整数です。
サンプル
c.ShortIntToBytes( &hFEFF ) = Array( &hFF, &hFE )
***********************************************************************
<<< LongIntToUShortIntToBytes >>>
***********************************************************************
LongIntToUShortIntToBytes
(src)
Function ADODBConsts::LongIntToUShortIntToBytes( Value as integer ) as array of integer
0〜65535 の整数を、2バイトの配列に変換します。
サンプル
c.LongIntToUShortIntToBytes( 65534 ) = Array( &hFE, &hFF )
***********************************************************************
<<< LongIntToBytes >>>
***********************************************************************
LongIntToBytes
(src)
Function ADODBConsts::LongIntToBytes( Value as integer ) as array of integer
整数を、4バイトの配列に変換します。
サンプル
c.LongIntToBytes( &h12345678 ) = Array( &h78, &h56, &h34, &h12 )
***********************************************************************
<<< ADODB.Stream 関連 >>>
***********************************************************************
ADODB.Stream 関連
***********************************************************************
<<< ADODB_Stream_loadFromFile >>>
***********************************************************************
ADODB_Stream_loadFromFile
Sub ADODB_Stream_loadFromFile( Stream as ADODB.Stream, Path as string )
エラーメッセージを適切にした ADODB.Stream.LoadFromFile 。
参考
→ LoadFromFile (ADODB.Stream)
ソース
→ vbslib.vbs
テスト
→ T_fc.vbs
T_IsSameBinaryFile_ReadWriteLock
***********************************************************************
<<< (複数行) ArrayFromLines >>>
***********************************************************************
(複数行) ArrayFromLines
Function ArrayFromLines( lines as string ) as Array of string
複数行からなる文字列のうち、それぞれの行を要素とした配列を返します。
【引数】
lines
複数行からなる文字列
返り値
それぞれの行を要素とした配列
改行文字は、CR+LF でも LF でもどちらでも構いません。
サンプル
For Each line In ArrayFromLines( "ABC"+ vbCRLF +"DEF" )
Next
"ABC"+ vbCRLF +"DEF"
上記 ArrayFromLines の返り値は、Array( "ABC", "DEF" )
サンプル
VBScript
a_array = ArrayFromLines( Trim2( root.selectSingleNode( _
"./Lines/text()" ).nodeValue ) )
Trim2
selectSingleNode
Lines
nodeValue
a_array は、Array( "Line (1)", "Line (2)" ) になります。
XML
Line (1)
Line (2)
ソース
→ vbslib.vbs
テスト
→ T_Lines.vbs
関連
→ StringStream クラス
→ FindStringLines
→ SortStringLines
***********************************************************************
<<< セクション化されたテキスト >>>
***********************************************************************
セクション化されたテキスト
***********************************************************************
<<< OpenForWriteTextSection >>>
***********************************************************************
OpenForWriteTextSection
Function OpenForWriteTextSection( SourcePath as string, DestinationPath as string,
Option_ as Empty ) as WriteTextSectionClass
セクション化されたテキストの編集を開始します。
【引数】
SourcePath
編集前のセクション化されたテキスト・ファイルのパス
DestinationPath
編集した結果を出力するファイルのパス、または、Empty
Option_
Empty を指定してください
返り値
→ WriteTextSectionClass
返り値のオブジェクトの参照カウンターが 0 になったら、ファイルに出力されます。
サンプル
file.txt ファイルの中の、"Section1" を含むセクションを削除します。
Set file = OpenForWriteTextSection( "file.txt", Empty, Empty )
file.Cut "Section1"
file = Empty
WriteTextSectionClass
→ Cut (WriteTextSectionClass)
セクションを削除します。
→ PickUp (WriteTextSectionClass)
残すセクションを選択します。
ソース
→ ToolsLib.vbs
テスト
→ T_TextSection.vbs
関連
→ 構造化テキストフォーマット (Module Mixer)
セクション化されたテキスト
→ UsesSection (Mxp_Symbol)
***********************************************************************
<<< Cut (WriteTextSectionClass) >>>
***********************************************************************
Cut (WriteTextSectionClass)
Sub WriteTextSectionClass::Cut( Key as string )
セクションを削除します。
【引数】
Key
セクションの中に含まれる文字列
ソース
→ ToolsLib.vbs
***********************************************************************
<<< PickUp (WriteTextSectionClass) >>>
***********************************************************************
PickUp (WriteTextSectionClass)
Sub WriteTextSectionClass::PickUp( Key as string )
残すセクションを選択します。
【引数】
Key
セクションの中に含まれる文字列
本関数を1度でも呼び出すと、WriteTextSectionClass のオブジェクトの参照カウンターが 0
になったとき、選択されなかったセクションはすべて削除されます。
本関数を1度も呼び出さなかったときは、すべてのセクションが残ります。
ソース
→ ToolsLib.vbs
***********************************************************************
<<< .ini ファイル >>>
***********************************************************************
.ini ファイル
下記の形式のテキストファイルで記述された設定値を扱います。
[SectionX]
SettingA = abc
SettingB = 12
; comment
[SectionY]
SettingA = BC
セクション名は省略可能
空行も可能
行末までのコメント記号は、行頭のみ対応
→ GetIniFileTextValue
→ SetIniFileTextValue
→ RenumberIniFileData
関連
→ OpenForRegFile
***********************************************************************
<<< GetIniFileTextValue >>>
***********************************************************************
GetIniFileTextValue
[ 親: .ini ファイル ]
Function GetIniFileTextValue( IniText as string, SectionName as string,
VariableName as string, Option_ as Empty ) as string
.ini ファイルに書かれた設定値を参照します。
【引数】
IniText
変更前の .ini ファイルの内容
SectionName
セクション名、セクションがないファイルでは=Empty
VariableName
変数名
Option_
Empty を指定してください
返り値
変数の設定値
該当する変数が存在しないときは、Empty が返ります。
サンプル
Assert GetIniFileTextValue( text, Empty, "NameA", Empty ) = "Value"
ソース
→ vbslib.vbs
テスト
→ T_IniFile.vbs
T_GetIniFileTextValue
関連
→ SetIniFileTextValue
***********************************************************************
<<< SetIniFileTextValue >>>
***********************************************************************
SetIniFileTextValue
[ 親: .ini ファイル ]
Function SetIniFileTextValue( IniText as string, SectionName as string,
VariableName as string, Value as Variant, Option_ as Empty ) as string
.ini ファイルに書かれた設定値を変更します。
【引数】
IniText
変更前の .ini ファイルの内容
SectionName
セクション名、セクションがないファイルでは=Empty
VariableName
変数名
Value
変更後の変数の設定値
Option_
Empty を指定してください
返り値
変更後の .ini ファイルの内容
該当する変数が存在しないときは、エラーになります。
サンプル
after_text = SetIniFileTextValue( before_text, Empty, "NameA", "Value", Empty )
ソース
→ vbslib.vbs
テスト
→ T_IniFile.vbs
T_SetIniFileTextValue
関連
→ GetIniFileTextValue
***********************************************************************
<<< RenumberIniFileData >>>
***********************************************************************
RenumberIniFileData
[ 親: .ini ファイル ]
Sub RenumberIniFileData( ReadStream as TextStream, WriteStream as TextStream,
StartNumber as integer, IsPlusSpaceLineOnly as boolean )
.ini ファイルの内容のうち、= より左にある ( ) の中の番号を振り直します。
【引数】
ReadStream
入力ストリーム
→ StringStream クラス
WriteStream
出力ストリーム
→ StringStream クラス
StartNumber
開始番号
IsPlusSpaceLineOnly
空行があるときだけ番号を+1するかどうか
サンプル・データ
Data(2) = ABC
Data(5) = DEF
Data(6) = DEF
入力
出力
Data(1) = ABC
Data(2) = DEF
Data(3) = DEF
ソース
→ vbslib.vbs
関連
→ RenumberIniFileData コマンド
***********************************************************************
<<< ParseJSON >>>
***********************************************************************
ParseJSON
(src)
Function ParseJSON( JSON_String as string ) as JS_Object
JSON をパース(構文解析)します。
【引数】
JSON_String
JSON 形式の文字列データ
返り値
JSON のデータにアクセスできるオブジェクト
サンプル
Set json = ParseJSON( "{'attribute_1':'One', 'attr2':'Two'}" )
echo json.attribute_1 '// "One"
省略された属性に対して、返り値から参照しようとすると、エラー 438 になります。
参考
→ JSON (JavaScript Object Notation)
***********************************************************************
<<< (CSV) ArrayFromCSV, ArrayFromCSV_Int >>>
***********************************************************************
(CSV) ArrayFromCSV, ArrayFromCSV_Int
(src)
Function ArrayFromCSV( a_CSV as string ) as Array of string
Function ArrayFromCSV_Int( a_CSV as string ) as Array of integer
CSV 形式の1行を解析して、それぞれの項目を配列に格納します。
【引数】
a_CSV
CSV 形式の1行
返り値
(出力)CSV の項目が入った配列
サンプル
For Each column In ArrayFromCSV( "ABC , DEF" )
Next
ABC , DEF
上記 ArrayFromCSV の返り値は、Array( "ABC", "DEF" )
各項目の両端の空白が削除されたものが戻ります。
項目の端に空白文字がある場合と、項目の中にコンマやダブルクォーテーション(")が
あるときは、" " で囲んでください。 ただし、ダブルクォーテーション1文字あたり、
ダブルクォーテーションを2つ並べてください。
CSV:
A, " ""ABC,"" "
各項目:
A
"ABC,"
VBS:
ArrayFromCSV( "A, "" """"ABC,"""" """ )
CSV とは別に、VBS も同様に " 文字は " を2つ並べる
"A, ,C" の真ん中の要素のように、何も無いときは、配列の要素が Empty になります。
"A, " のように最後がコンマのときは、配列の最後の要素が Empty になります
ArrayFromCSV( "A,,C" ) = Array( "A", Empty, "C" )
ArrayFromCSV( "A," ) = Array( "A", Empty )
要素に "" (ダブルクオーテーション2つだけ)が指定されたときは、空文字列になります。
ArrayFromCSV( "A, """"" ) = Array( "A", "" )
" " のように、空白文字や空文字列のときは、配列要素数が 0 になります。
ArrayFromCSV( " " ) = Array( )
複数行の文字列を指定するときは、最後の行以外の行末を "," にしてください。
ArrayFromCSV( "A, B," +vbCRLF+ "C, D," +vbCRLF+ "E, F" )
= Array( "A","B","C","D","E","F" )
つまり
A, B,
C, D,
E, F
=
A, B, C, D, E, F
サンプル
複数行の文字列から、各行を配列にする
paths = ArrayFromCSV( Replace( Trim2( multi_line_string ), vbCRLF, "," ) )
性能について
本関数は処理が遅いです。
CSV ファイルのデータは、1行に対応するクラスの配列にキャッシュしておくと速くなります。
テスト
→ T_CSV.vbs # ArrayFromCSV
関連
→ CSV (ArrayClass)
→ Split
→ ArrayFromCmdLine
→ MeltCSV
→ AddCSV (ArrayClass)
***********************************************************************
<<< CSVFrom >>>
***********************************************************************
CSVFrom
Function CSVFrom( a_Array as array ) as string
配列を CSV 形式に変換します。
【引数】
a_Array
配列
返り値
CSV 形式文字列
ソース
→ vbslib.vbs
***********************************************************************
<<< CSVText >>>
***********************************************************************
CSVText
Function CSVText( s as string ) as string
CSV の1項目に変換します。
サンプル
s = CSVText( "a,b" )
s は、"""a,b""" という1つの値になります。
a と b という2つの値ではありません。
サンプル
CSV の1行を作成します
s = ""
For Each t In Array( "a", "b" )
If s <> "" Then s = s + ", "
s = s + CSVText( t )
Next
ソース
→ vbslib.vbs
テスト
→ T_CSV.vbs
***********************************************************************
<<< MeltCSV >>>
***********************************************************************
MeltCSV
(src)
Function MeltCSV( Line as string, in_out_Start as integer ) as string
CSV 形式の1項目を取り出し、通常の文字列に戻す。
【引数】
Line
CSV 形式の1行
in_out_Start
(入力) 取り出しを開始する文字の位置、(出力)次に取り出す〜
返り値
取り出した CSV 形式の1項目。Empty=項目に値が無い
各項目の両端の空白が削除されたものが戻ります。
次の項目が無いときは、i=0 になります。
i=0 を渡すと、Empty を返します。
サンプル
i = 1
Do
s = MeltCSV( line, i )
If not IsEmpty( s ) Then (s を使った処理)
If i = 0 Then Exit Do
Loop
関連
→ ArrayFromCSV
テスト
→ T_CSV.vbs # main
***********************************************************************
<<< CSV_insert >>>
***********************************************************************
CSV_insert
Function CSV_insert( CSV_Line as string, RightColumnNum0 as integer, Element as variant )
as string
CSV 形式の1行に、要素を挿入します。
【引数】
CSV_Line
CSV 形式の1行
RightColumnNum0
挿入する位置の右の要素の番号(0以上)
Element
挿入する要素
返り値
挿入した後の CSV 形式の1行
サンプル
Assert CSV_insert( "A,B,C", 1, "x" ) = "A,x,B,C"
Assert CSV_insert( "A,B,C", 4, "x" ) = "A,B,C,,x"
ソース
→ vbslib.vbs
テスト
→ T_CSV.vbs
***********************************************************************
<<< CSV_set >>>
***********************************************************************
CSV_set
Function CSV_set( CSV_Line as string, ColumnNum0 as integer, Element as variant )
as string
CSV 形式の1つの要素を上書きします。
【引数】
CSV_Line
CSV 形式の1行
ColumnNum0
上書きする要素の番号(0以上)
Element
上書きする要素
返り値
上書きした後の CSV 形式の1行
サンプル
Assert CSV_set( "A,B,C", 1, "x" ) = "A,x,C"
Assert CSV_set( "A,B,C", 4, "x" ) = "A,B,C,,x"
ソース
→ vbslib.vbs
テスト
→ T_CSV.vbs
***********************************************************************
<<< CSV_remove >>>
***********************************************************************
CSV_remove
Function CSV_remove( CSV_Line as string, ColumnNum0 as integer ) as string
CSV 形式の1つの要素を削除します。
【引数】
CSV_Line
CSV 形式の1行
ColumnNum0
削除する要素の番号(0以上)
返り値
削除した後の CSV 形式の1行
サンプル
Assert CSV_remove( "A,B,C", 1 ) = "A,C"
Assert CSV_remove( "A,B,C", 4 ) = "A,B,C,"
削除する要素より前の要素が無いときは、前に空の要素が追加されます
Assert CSV_remove( "A,B,C,", 3 ) = "A,B,C"
ソース
→ vbslib.vbs
テスト
→ T_CSV.vbs
***********************************************************************
<<< (XML) LoadXML >>>
***********************************************************************
(XML) LoadXML
(src)
Function LoadXML( PathOrStr as string, Opt as variant ) as IXMLDOMElement
IXMLDOMElement
XML ファイル、または XML 形式の文字列を読み込みます。
【引数】
PathOrStr
XML ファイルのパス、または XML 形式文字列
Opt
オプション(下記)
→ Opt 引数
返り値
XML のルート要素
日本語があるときは、Unicode にするか、XML宣言で Shift-JIS を指定してください。
参考
→ DOM サンプル
→ XML
→ XmlFilter ツール (.zip)
→ xml_sub 関数
サンプル : sample.xml ファイルをロードする
Dim root, elem, attr
Set root = LoadXML( "sample.xml", Empty )
'//=== read 1 attribute value
WScript.Echo root.selectSingleNode( "./Tests/Test" ).getAttribute( "result" )
'//=== read 1 text value
WScript.Echo root.selectSingleNode( "./Tests" ).text
WScript.Echo root.selectSingleNode( "./Tests/text()" ).nodeValue
'//=== loop each tags
For Each elem In root.selectNodes( "./Tests/Test" )
WScript.Echo "result, "+ elem.getAttribute( "result" )
Next
'//=== loop each attributes
For Each elem In root.selectNodes( ".//Test" )
WScript.Echo "<" + elem.tagName + ">"
For Each attr In elem.attributes
WScript.Echo attr.name + "=" + attr.value
Next
Next
LoadXML
"sample.xml"
→ XmlRead
selectSingleNode
"./Tests/Test"
getAttribute
"result"
→ XmlRead
./Tests/text()
selectNodes
"./Tests/Test"
result
"result"
".//Test"
サンプル: XML 形式文字列を展開する
Dim s : s = "ABC 123"
Dim root : Set root = LoadXML( s, F_NoRoot or F_Str )
Dim value : value = root.selectSingleNode( "./TAG1" ).getAttribute( "attr" )
'// value = "value1"
LoadXML
関連
→ XML 要素へアクセスするその他のサンプル
サンプル: XML を結合する
Dim f, root, elem, attr
Set f = OpenForWrite( "FileAB.xml", Empty )
f.WriteLine ""
Set root = LoadXML( "FileA.xml", Empty )
f.WriteLine XmlTags( root.selectSingleNode( "./TagB" ).xml, 1 )
Set root = LoadXML( "FileB.xml", Empty )
f.WriteLine XmlTags( root.selectSingleNode( "./TagB" ).xml, 1 )
f.WriteLine ""
Opt 引数
F_NoRoot フラグ
XML のルート要素が無い XML を読み込みます。 返り値は、内部で自動的に
加えられたルート要素 になります。
先頭が < でないときは、自動的にルート要素が加えられます。
F_Str フラグ
PathOrStr 引数を XML 形式文字列として処理します
テスト
→ T_XML フォルダ
関連
→ XmlRead
→ MultiTextXML_Class
→ LoadXML_Cached
***********************************************************************
<<< LoadXML_Cached >>>
***********************************************************************
LoadXML_Cached
Function LoadXML_Cached( PathOrStr as string, Opt as variant ) as IXMLDOMElement
IXMLDOMElement
XML を解析してできた DOM オブジェクトをキャッシュする
LoadXML
。
2回目以降の XML ファイルは、キャッシュによって XML を解析する処理がなくなり、高速に処理
します。
返り値がどの変数から参照されなくなっても、キャッシュのために、DOM オブジェクトはメモリー上に
残ります。 vbslib の内部に絶対パスをキー、DOM オブジェクトをアイテムとした辞書型のキャッシュ
があります。
ソース
→ vbslib.vbs
関連
→ XML_ReadCacheClass
***********************************************************************
<<< ObjToXML >>>
***********************************************************************
ObjToXML
(src)
Function ObjToXML( TagName as string, Objs as object or array, Opt as variant ) as string
オブジェクトの基本的なデータを XML 文字列に変換します。
【引数】
TagName
ルート・タグ名、Empty にすると、ルートタグを追加しません。
Objs
XML データの内容にするオブジェクト、またはその配列
Opt
Empty を指定してください
返り値
XML 文字列
サンプル:
s = ObjToXML( Empty, obj, Empty )
オブジェクトのクラス名と、Name プロパティ、DefinePath プロパティから XML データを作成します。
他のプロパティも含んだ XML データは、xml プロパティを作成してください。
関連
→ xml プロパティ (vbsool)
→ SetDefinePath
→ GetTab
***********************************************************************
<<< XmlAttr >>>
***********************************************************************
XmlAttr
(src)
Function XmlAttr( s as string ) as string
" " で囲む XML の属性値に(実体参照に)変換します。
サンプル:
s = XmlAttr( "<""'" )
s は、"<"'" になります
XmlAttrA
(src)
Function XmlAttrA( s as string ) as string
' ' で囲む XML の属性値に(実体参照に)変換します。
サンプル:
s = XmlAttrA( "<""'" )
s は、"<""'" になります
テスト
→ T_XML.vbs # [T_XmlText]
関連
→ xml プロパティ (vbsool)
→ StrT_changeToXmlAttr (clib)
***********************************************************************
<<< XmlText >>>
***********************************************************************
XmlText
(src)
Function XmlText( s as string ) as string
XML のテキスト(タグの外)に(実体参照に)変換します。
サンプル
Assert XmlText( "<""" ) = "<"""
テスト
→ T_XML.vbs # [T_XmlText]
関連
→ xml プロパティ (vbsool)
***********************************************************************
<<< OpenForReplaceXML >>>
***********************************************************************
OpenForReplaceXML
Function OpenForReplaceXML( SrcPath as string, DstPath as string ) as ReplaceXmlFile1
XMLファイルの内容の変更を開始します。
【引数】
SrcPath
変更前のテキストファイルのパス
DstPath
変更後のテキストファイルのパス。 SrcPath と同じ、または Empty 可。
返り値
→ ReplaceXmlFile1 クラス
ソース
→ vbslib.vbs
サンプル
Set xml = OpenForReplaceXML( "file1.xml", Empty )
xml.Write "/Root/Elem/@attr1", 11
xml.IsUserConfirm = True
xml = Empty '// デストラクタでユーザーの確認およびファイルの更新をする
file1.xml
Write
/Root/Elem/@attr1
11
IsUserConfirm
ReplaceXmlFile1 クラス
.Write
タグの間のテキスト、または XML 属性の値を変更します。
.IsUserConfirm
XML ファイルを変更する前に、ユーザーに確認をとるかどうか。
テスト
→ T_XML.vbs # [T_OpenForReplaceXML]
→ T_XML_Manually.vbs # [T_OpenForReplaceXML_Manually]
関連
→ SetXmlAttribute
→ OpenForReplace
→ ReplaceRange (ReplaceTextFile1)
***********************************************************************
<<< Write (ReplaceXmlFile1) >>>
***********************************************************************
Write (ReplaceXmlFile1)
→ OpenForReplaceXML
Sub ReplaceXmlFile1::Write( XPath as string, Value as string )
XML のタグの間のテキスト、または XML の属性の値を変更します。
【引数】
XPath
タグの間のテキスト、または XML の属性の位置を表す XPath
Value
変更後のテキストまたは XML 属性の値、""=値なし、Empty=削除する
返り値
変化があったかどうか
参考
→ XmlWrite
→ サンプル
***********************************************************************
<<< SetXmlAttribute (ReplaceXmlFile1) >>>
***********************************************************************
SetXmlAttribute (ReplaceXmlFile1)
→ OpenForReplaceXML
廃止されました。
→ Write (ReplaceXmlFile1)
Sub ReplaceXmlFile1::SetXmlAttribute( XPathForXmlElement as string, AttrName as string,
AttrValue as string );
XML 属性の値を変更します。
【引数】
XPathForXmlElement
属性を変更する XML 要素(タグ) への XPath。 フル・パス
AttrName
XML 属性の名前
AttrValue
変更後の XML 属性の値
→ サンプル
***********************************************************************
<<< IsUserConfirm (ReplaceXmlFile1) >>>
***********************************************************************
IsUserConfirm (ReplaceXmlFile1)
→ OpenForReplaceXML
Dim ReplaceXmlFile1::IsUserConfirm as boolean
XML ファイルを変更する前に、ユーザーに確認をとるかどうかの設定値。
デフォルトは、False です。
XML ファイルを更新する直前で、値が変わる属性とその値を表示します。
表示中に、ユーザーの確認入力があるまで待ちます。
→ サンプル
確認画面の例:
/Root/Tests/Test1@attr1="1"
/Root/Tests/Test3@attr1="3"
更新ファイル:out.xml
XML ファイルの上記属性を変更します。
続行するには Enter キーを押してください . . .
***********************************************************************
<<< OpenForAppendXml >>>
***********************************************************************
OpenForAppendXml
(src)
Function OpenForAppendXml( SrcPath as string, DstPath as string ) as AppendXmlFile
XMLファイルの内容の追加を開始します。
【引数】
SrcPath
変更前のテキストファイルのパス
DstPath
変更後のテキストファイルのパス。 SrcPath と同じ、または Empty 可。
返り値
TextStream + α のオブジェクト
追加する内容は、OpenForWrite と同様に WriteLine などのメソッドに XML の文字列を
指定します。 XPath ではありません。
クローズするときに、ルートの XML タグ(XML要素)を閉じるタグを出力します。
よって、追加する内容は、ルートの XML タグの直下の末尾に限定されます。
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じですが、
いくつかメソッドが追加されています。
→ WriteXml
サンプル
Set file = OpenForAppendXml( "Modify.xml", Empty )
file.WriteLine " "
file.WriteXml ReadFile( "Add.xml" )
file = Empty
Modify.xml (処理前)
Modify.xml (処理後)
Add.xml
テスト
→ T_XML.vbs # [T_OpenForAppendXml]
***********************************************************************
<<< WriteXml (AppendXmlFile) >>>
***********************************************************************
WriteXml (AppendXmlFile)
(src)
Sub AppendXmlFile::WriteXml( Xml as string )
指定した XML 文字列から、ルート XML タグを除いて追加します。
【引数】
Xml
追加する XML 文字列
サンプル
を追加します
file.WriteXml ""
サンプル
Modify.xml に Add.xml を追加します。
OpenForAppendXml( "Modify.xml", Empty ).WriteXml ReadFile( "Add.xml" )
Modify.xml (処理前)
Modify.xml (処理後)
Add.xml
***********************************************************************
<<< XmlWrite >>>
***********************************************************************
XmlWrite
(src)
Function XmlWrite( BaseXmlElement as IXMLDOMElement, XPath as string, Value as string ) as boolean
XML のタグの間のテキスト、または XML の属性の値を変更します。
【引数】
BaseXmlElement
XPath の基準となる XML要素(タグ)
XPath
タグの間のテキスト、または XML の属性の位置を表す XPath
Value
変更後のテキストまたは XML 属性の値、""=値なし、Empty=削除する
返り値
変化があったかどうか
タグの間のテキストは、厳密には XPath = "/Root/Elem/text()" ですが、XPath = "/Root/Elem" を指定
してください。
XPath に指定したタグ(XML要素)が存在しないときは、作成します。
XPath = "/Root/Elem" (XML要素へのパス)のとき、Value = "" なら、 となります。
XPath = "/Root/Elem" (XML要素へのパス)のとき、Value = Empty なら、 を削除します。
XPath = "/Root/Elem/@attr" (XML属性へのパス)のとき、Value = "" なら、 となります。
XPath = "/Root/Elem/@attr" (XML属性へのパス)のとき、Value = Empty なら、 となります。
サンプル
Dim b, is_change
Dim root : Set root = LoadXML( "in.xml", Empty ) '// as IXMLDOMElement
b= XmlWrite( root, "./Tag1/@attr1", 123 )
is_change = is_change or b
If is_change Then root.ownerDocument.save "out.xml"
XmlWrite
Tag1/@attr1
123
参考
→ setAttribute (IXMLDOMElement)
→ RegWrite
テスト
→ T_XML.vbs # T_XmlWrite
関連
→ OpenForReplaceXML
→ Write (ReplaceXmlFile1)
***********************************************************************
<<< SetXmlAttribute >>>
***********************************************************************
SetXmlAttribute
(src)
廃止されました。
→ XmlWrite
Function SetXmlAttribute( BaseXmlElement as IXMLDOMElement, XPathForXmlElement as string,
AttrName as string, AttrValue as string ) as boolean
XML 属性の値を変更します。
【引数】
BaseXmlElement
XPathForXmlElement の基準となる XML要素(タグ)
XPathForXmlElement
属性を変更する XML 要素(タグ) への XPath または Empty
AttrName
XML 属性の名前
AttrValue
変更後の XML 属性の値、""=値なし、Empty=属性を削除する
返り値
変化があったかどうか
XPathForXmlElement に該当する XML 要素が複数あったときは、すべての XML 要素の属性を変更
します。
XPathForXmlElement に該当する XML 要素が無かったときは、XML 要素を追加します。
サンプル:
Dim b, is_change
Dim root : Set root = LoadXML( "in.xml", Empty ) '// as IXMLDOMElement
b= SetXmlAttribute( root, "./Tag1", "attr1", "1234" )
is_change = is_change or b
If is_change Then root.ownerDocument.save "out.xml"
SetXmlAttribute
Tag1
attr1
1234
参考
→ setAttribute (IXMLDOMElement)
→ RegWrite
テスト
→ T_XML.vbs # T_SetXmlAttribute
***********************************************************************
<<< XmlRead >>>
***********************************************************************
XmlRead
(src)
Function XmlRead( BaseXmlElement as IXMLDOMElement, XPath as string ) as string
XML のタグの間のテキスト、または XML の属性の値を変更します。
【引数】
BaseXmlElement
XPath の基準となる XML要素(タグ)
XPath
タグの間のテキスト、または XML の属性の位置を表す XPath
返り値
テキストまたは XML 属性の値。文字列型
タグの間のテキストは、厳密には XPath = "/Root/Elem/text()" ですが、XPath = "/Root/Elem"
を指定してください。
XPath に指定したタグ(XML要素)やXML属性が存在しないときは、Empty を返します。
XPath が相対パスのときは、BaseXmlElement タグが基準になります。 XPath にフル・パスを
指定することもできます。
サンプル
Dim root : Set root = LoadXML( "in.xml", Empty ) '// as IXMLDOMElement
value = XmlRead( root, "./Tag1/@attr1" )
XmlRead
Tag1/@attr1
参考
→ getAttribute (IXMLDOMElement)
→ RegRead
テスト
→ T_XML.vbs # [T_XmlRead]
***********************************************************************
<<< GetXmlAttribute >>>
***********************************************************************
GetXmlAttribute
(src)
廃止されました。
→ XmlRead
Function GetXmlAttribute( BaseXmlElement, XPathForXmlElement, AttrName )
XML 属性の値を返します。
【引数】
BaseXmlElement
XPathForXmlElement の基準となる XML要素(タグ)
XPathForXmlElement
属性を変更する XML 要素(タグ) への XPath または Empty
AttrName
XML 属性の名前
返り値
XML 属性の値、文字列型のみ、Empty=属性なし
サンプル:
Dim root : Set root = LoadXML( "in.xml", Empty ) ' as IXMLDOMElement
value = GetXmlAttribute( root, "./Tag1", "attr1" )
GetXmlAttribute
Tag1
attr1
参考
→ getAttribute (IXMLDOMElement)
→ RegRead
テスト
→ T_XML.vbs # [T_GetXmlAttribute]
***********************************************************************
<<< XmlSelect >>>
***********************************************************************
XmlSelect
Function XmlSelect( BaseXmlElement as IXMLDOMElement, XPath as string ) as IXMLDOMElement
XML のタグのハンドルを返します。 もし、該当する XML のタグが無ければ生成して返します。
【引数】
BaseXmlElement
XPathForXmlElement の基準となる XML要素(タグ)
XPath
XML 要素(タグ)の位置を表す XPath
返り値
XML 要素(タグ)
テスト
→ T_XML.vbs # T_XmlSelect
書きかけ
***********************************************************************
<<< XmlWriteEncoding >>>
***********************************************************************
XmlWriteEncoding
(src)
Sub XmlWriteEncoding( RootXmlElement as IXMLDOMElement, CharSet as string )
XML ファイルの文字コードを指定します。
【引数】
BaseXmlElement
ルートの XML要素(タグ)
CharSet
文字コード
→ new_TextFileCharSetStack
テスト
→ T_XML.vbs # T_XmlWrite
***********************************************************************
<<< XmlAttrDic >>>
***********************************************************************
XmlAttrDic
Function XmlAttrDic( XmlElem as IXMLDOMElement ) as dictionary of string
XML 要素(タグ)の属性を、辞書にします。
【引数】
XmlElem
XML 要素
返り値
キーが属性名、アイテムが属性値の辞書
ソース
→ vbslib.vbs
テスト
→ T_XML.vbs # [T_XmlAttrDic]
***********************************************************************
<<< GetXPath >>>
***********************************************************************
GetXPath
(src)
Function GetXPath( DOMObject as IXMLDOMElement, ShowAttrs as string ) as string
XML の DOM オブジェクトがある場所を表す XPath を返します。
【引数】
DOMObject
IXMLDOMElement または IXMLDOMAttribute
ShowAttrs
Empty、または、XPath に含める XML 属性、またはその配列
返り値
XPath
DOMObject が IXMLDOMAttribute のときは、ルート XML 要素からのパスは含まれません。
サンプル
Dim node
Dim root : Set root = LoadXML( "sample.xml", Empty ) ' as IXMLDOMElement
'// GetXPath( root, Empty ) = "/Root"
node = root.selectNodes( "/Root/Test1", Empty )
'// GetXPath( node(0) ) = "/Root/Test1"
node = root.selectNodes( "/Root/Test2/@id", Empty )
'// GetXPath( node(0) ) = "@id"
node = root.selectNodes( "/Root/Test2[@id='1']/Sub", Array("id","attr") )
'// GetXPath( node(0) ) = "/Root/Test2[@id='1' and @attr='a']/Sub"
参考
→ XPath
テスト
→ T_XML.vbs # [T_XPath]
***********************************************************************
<<< ChangeToXml >>>
***********************************************************************
ChangeToXml
(src)
Function ChangeToXml( XML as string or object ) as IXMLDOMElement
IXMLDOMElement
XML 文字列などを、XML 要素オブジェクトに変換します。
参考
→ loadXML メソッド (vbsool)
引数に指定できるものは、次のものがあります。
・XML が記述された文字列
・
XML ファイルをロードする
LoadXML
などで取得した
IXMLDOMElement
・ParentProcess や ChildProcess
→ /ChildProcess オプション
***********************************************************************
<<< XML_ReadCacheClass >>>
***********************************************************************
XML_ReadCacheClass
XML ファイルの内容を内部でキャッシュします。
→ Item (XML_ReadCacheClass)
関連
→ LoadXML_Cached
***********************************************************************
<<< Item (XML_ReadCacheClass) >>>
***********************************************************************
Item (XML_ReadCacheClass)
<< XML_ReadCacheClass
Default Property Get XML_ReadCacheClass::Item( URL as string ) as string
XML のテキスト、または、属性値を返します。
【引数】
URL
XML ファイルのパス +"#"+ XPath
返り値
XML のテキスト、または、属性値
ソース
→ vbslib.vbs
テスト
→ T_XML.vbs # [T_XML_ReadCacheClass]
サンプル
VBScript
Set files = new XML_ReadCacheClass
tag_text = files( "Sample.xml#/Root/Tag" )
'// tag_text = "The text"
Sample.xml#/Root/Tag
Sample.xml
The text
***********************************************************************
<<< MultiTextXML_Class >>>
***********************************************************************
MultiTextXML_Class
マルチ・パート・テキストXML
ファイルの内容を内部でキャッシュします。
→ GetText (MultiTextXML_Class)
→ IsExist (MultiTextXML_Class)
マルチ・パート・テキストXML
複数のテキスト・ファイルを1つにまとめた XML ファイル。
Sample.xml
タグ名は、上記と異なるタグ名でも構いませんが、id 属性は必須です。
encoding 属性の設定値は、ファイルの文字コードの設定に合わせてください。
例: UTF-8、UTF-16、Shift_JIS など
参考
→ XML
ファイルのパス(アドレス)に "Sample.xml#1" を指定すると、下記の文字列が取得できます。
abc def
ファイルのパス(アドレス)に "Sample.xml#second" を指定すると、下記の文字列が取得できます。
abc
def
ファイルのパス(アドレス)に "Sample.xml" を指定すると、ファイルの全体の内容が取得できます。
ファイルに同じ id 属性が存在すると、上の方にある部分のみ有効になります。
先頭文字 (>>
***********************************************************************
GetText (MultiTextXML_Class)
Function MultiTextXML_Class::GetText( URL as string ) as string
マルチ・パート・テキストXML
ファイルを、リードします。
【引数】
URL
ファイルパス +"#"+ ID属性の値、または、ファイルパス
返り値
テキスト・ブロックの内容
サンプル
Set files = new MultiTextXML_Class
text = files.GetText( "Files\T_MultiTextXML_1.xml#1" )
ソース
→ vbslib.vbs
テスト
→ T_XML.vbs # [T_MultiTextXML]
***********************************************************************
<<< IsExist (MultiTextXML_Class) >>>
***********************************************************************
IsExist (MultiTextXML_Class)
Function MultiTextXML_Class::IsExist( URL as string ) as boolean
マルチ・パート・テキストXML
ファイルに、指定の id があるかどうかを返します。
【引数】
URL
ファイルパス +"#"+ ID属性の値、または、ファイルパス
返り値
指定の id があるかどうか
サンプル
Set files = new MultiTextXML_Class
If files.IsExist( "Files\T_MultiTextXML_1.xml#1" ) Then ...
ソース
→ vbslib.vbs
テスト
→ T_XML.vbs
T_MultiTextXML_IsExist
***********************************************************************
<<< GetHRefBase >>>
***********************************************************************
GetHRefBase
(src)
Function GetHRefBase( BasePath as string, TargetTagNames as array of string ) as HRefBase
HTML の A href のようなリンクを取得するためのオブジェクトを返します。
【引数】
BasePath
基準となる XML ファイルのパス
TargetTagNames
リンク先となる id, name 属性を持つタグの名前の配列
返り値
リンクを取得するためのオブジェクト
サンプル
Dim base, x
Set base = GetHRefBase( "sample.xml", Array("X") )
Set x = base.href( "target.xml#name1" )
Assert x.getAttribute( "name" ) = "name1"
"sample.xml"
"X"
href
"target.xml#name1"
sample.xml
target.xml
Link
"target.xml#name1"
テスト
→ T_XML.vbs # [T_HRefBase]
関連
→ href (HRefBase)
→ LinkedXMLs クラス
循環参照検出あり
***********************************************************************
<<< href (HRefBase) >>>
***********************************************************************
href (HRefBase)
(src)
Function HRefBase::href( URL as string ) as IXMLDOMElement
IXMLDOMElement
HTML の A href のようなリンクのリンク先となる XML タグを取得します。
【引数】
URL
リンク先のURL
返り値
リンク先の XML タグ
他の XML ファイルへのリンクがあるときは、内部で自動的に LoadXML が呼ばれます。
パスにピリオドを3つ並べる
こともできます。
リンク先が見つからないときはエラーになります。
参考
→ GetHRefBase
HRefBase オブジェクトの取得
→ GetLinkTargetNode (LinkedXMLs)
関連
→ getElementById (HTMLDocument)
***********************************************************************
<<< LinkedXMLs クラス >>>
***********************************************************************
LinkedXMLs クラス
(src)
HTML の A href のようなリンクの、リンク先となる XML タグを取得します。
他の XML ファイルへのリンクがあるときは、内部で自動的に LoadXML が呼ばれます。
リンク先のリンク先が、循環参照しているかどうかを検出することもできます。
sample.xml
target.xml
Link
スクリプト
Dim root, a, x
Set root = LoadXML( "sample.xml", Empty )
Set a = root.selectSingleNode( "./A" ) '// A タグ
Dim linker : Set linker = new LinkedXMLs
linker.XmlTagNamesHavingIdName = Array( "X" )
linker.StartNavigation "sample.xml", root
Set x = linker.GetLinkTargetNode( "target.xml#name1" ) '// X タグ
linker.EndNavigation
"sample.xml"
XmlTagNamesHavingIdName
"X"
StartNavigation
"sample.xml"
GetLinkTargetNode
"target.xml#name1"
EndNavigation
他の XML ファイルへのリンクがあるときは、内部で LoadXML が呼ばれ、返される XML
ルートタグは、内部にキャッシュされます。 最新の情報に更新するとき(キャッシュを
クリアするとき)は、LinkedXMLs オブジェクトを再生成してください。
データ構造
.XmlTagNamesHavingIdName as array of string
リンク先になれるタグ名の配列
.SourceXmlPath as string
リンク元の XML ファイルのパス
.SourceXmlRootElem as IXMLDOMElement
SourceXmlPath のルート XML タグ
.TargetXmlPath as string
リンク先の XML ファイルのパス
.TargetXmlRootElem as IXMLDOMElement
TargetXmlPath のルート XML タグ
***********************************************************************
<<< XmlTagNamesHavingIdName (LinkedXMLs) >>>
***********************************************************************
XmlTagNamesHavingIdName (LinkedXMLs)
Dim LinkedXMLs::XmlTagNamesHavingIdName as string
getLinkTargetNode メソッドでリンク先にできる XML のid 属性や name 属性を持つ XML タグ名の配列。
サンプル
Set linker = new LinkedXMLs
linker.XmlTagNamesHavingIdName = Array( "TestCases", "TestCase", "SubCase" )
"TestCases", "TestCase", "SubCase"
XmlTagNamesHavingIdName に指定した名前を持つタグにリンクすることができます。
下記の A href のうち、name1, name2 はリンク先が見つかりますが、name3 は見つかりません。
1 2 3
***********************************************************************
<<< StartNavigation (LinkedXMLs) >>>
***********************************************************************
StartNavigation (LinkedXMLs)
(src)
Sub LinkedXMLs::StartNavigation( SourceXmlPath as string, SourceXmlRootElem as IXMLDOMElement )
現在の XML ファイルの情報を指定します。
【引数】
SourceXmlPath
現在の XML ファイルのパス。相対パスでも可能
SourceXmlRootElem
SourceXmlPath のファイルのルート XML タグ (下記)
SourceXmlRootElem 引数
初めてリンク先を探すときは、LoadXML の返り値を指定します。
リンク先の更にリンク先を探すときは、LinkedXMLs::TargetXmlRootElem を指定します。
***********************************************************************
<<< EndNavigation (LinkedXMLs) >>>
***********************************************************************
EndNavigation (LinkedXMLs)
(src)
Sub LinkedXMLs::EndNavigation()
StartNavigation
で指定した現在の XML ファイルの終了を指定します。
***********************************************************************
<<< GetLinkTargetNode (LinkedXMLs) >>>
***********************************************************************
GetLinkTargetNode (LinkedXMLs)
(src)
Function LinkedXMLs::GetLinkTargetNode( TargetLocation as string ) as IXMLDOMElement
IXMLDOMElement
リンク先となる XML タグを取得します。
【引数】
TargetLocation
リンク先のパス。 target.xml#name 形式
返り値
リンク先のタグ
サンプル
linker.StartNavigation "sample.xml", root
Set x = linker.GetLinkTargetNode( "target.xml#name1" )
linker.EndNavigation
"target.xml#name1"
本関数が成功すると、Me.TargetXmlPath(リンク先の XML ファイルのパス)と、
Me.TargetXmlRootElem (TargetXmlPath のルート XML タグ)も更新されます。
参考
→ href (HRefBase)
循環参照エラーの検出
StartNavigation をネストしていくと、GetLinkTargetNode で、循環参照エラーを検出できます。
linker.StartNavigation "sample.xml", root
Set a = linker.GetLinkTargetNode( "#a" )
linker.StartNavigation linker.TargetXmlPath, linker.TargetXmlRootElem
Set b = linker.GetLinkTargetNode( "#b" )
linker.StartNavigation linker.TargetXmlPath, linker.TargetXmlRootElem
Set a2 = linker.GetLinkTargetNode( "#a" ) '// 循環参照エラー
linker.EndNavigation
linker.EndNavigation
linker.EndNavigation
linker.StartNavigation "sample.xml", root
Set b = linker.GetLinkTargetNode( "#b" ) '// 循環参照エラーにならない
linker.EndNavigation
***********************************************************************
<<< 関連 >>>
***********************************************************************
関連
→ new_LazyDictionaryClass
XML の Variable タグ
***********************************************************************
<<< 関連 >>>
***********************************************************************
関連
バイナリ・ファイル
→ BinaryArray クラス
レジストリ・ファイル
→ OpenForRegFile
文字列 TextStream
→ StringStream クラス
***********************************************************************
<<< プロセス制御と include >>>
***********************************************************************
[ テスト ]
プロセス制御と include
新プロセス
→ start
指定したコマンドラインを新プロセスで実行します。 終了を待ちません。
→ RunProg
指定したコマンドラインを新プロセスで実行します。 終了を待ちます。
→ sudo
管理者権限を持った新プロセスで実行します。 終了を待ちます。
→ env
環境変数を展開します
→ ArgumentExist
コマンドライン・オプションが指定されているかどうかを返す
現在のプロセスのまま
→ call_vbs
指定した VBScript ファイルの中の関数を呼び出し、終了するまで待ちます。
→ include
クラス定義や関数定義が入った VBSファイルをインクルードします。
→ IsDefined
指定したシンボルの関数が定義されているかどうかを返します。
待ち
→ Sleep
指定した時間だけ待ちます。
→ WaitForFile
指定したファイルが作られるまで待ちます。
関連
→ 正常終了時の動作
→ エラー発生時の動作
→ プログラム起動 (VBS)
→ バージョン判定、環境変数
→ g_debug_params
***********************************************************************
<<< start >>>
***********************************************************************
start
(src)
Sub start( cmdline as string )
指定したコマンドラインを新プロセスで実行します。 終了を待ちません。
CPU がマルチコアであれば、複数のプロセスによる並列処理になり高速になります。
サンプル:
start """%ProgramFiles%\Movie Maker\moviemk.exe"""
コマンドラインでは、パスをダブルクォーテーションで囲むこと
サンプル:
Dim cmd
cmd = Setting_getEditorCmdLine( 1 )
cmd = Replace( cmd, "%1", "C:\file.txt" )
start cmd
Setting_getEditorCmdLine
cmdline 引数にフォルダやデータファイルのパスを指定すると、そのフォルダや
ファイルをダブルクリックしたときと同じように開きます。
start の後にすぐに終了すると、開けないことがあります。
Sleep
で、すぐに終了しないようにしてください。
cmdline 引数に環境変数を含めることができます。 (%var% 形式)
ファイルが見つからないと、E_WIN32_FILE_NOT_FOUND エラーになります
start で実行した内容のログを取る
start "cmd.exe /C cscript //nologo sample.vbs | "+ g_vbslib_ver_folder +_
"safetee\safetee.exe -o Sample_out.txt & exit"
safetee
cmd.exe /C を経由して実行してください。 > でリダイレクトすると内容が表示されない
ので、パイプを経由して safetee(または tee)を実行してください。 また、パイプを
使う場合、実行後にウィンドウが残らないように、exit してください。
start 関数から別の関数を呼び出すとき
cmdline 引数に、\?InCurrentProcessFunc\(関数名) を指定すると、指定した関数を
呼び出します。 呼び出した関数から返ると、start 関数から戻ります。
キーワード:
InCurrentProcessFunc
テスト
→ T_Start_Manual.vbs # [T_StartErr]
関連
→ IShellDispatch2::ShellExecute
→ GetCScriptGUI_CommandLine
***********************************************************************
<<< RunProg >>>
***********************************************************************
RunProg
(src)
Function RunProg( cmdline as string, stdout_stderr_redirect as string ) as integer
指定したコマンドラインを新プロセスで実行します。 終了を待ちます。
【引数】
cmdline
コマンドライン(実行ファイルパス+パラメータ)
stdout_stderr_redirect
出力先のファイルパス(下記)
返り値
エラーレベル(main 関数の返り値)
プロセスが終了するまで、関数内部で待ちます。
新プロセスのカレントフォルダは、RunProg を呼び出す直前のカレントフォルダーになります。
cmdline 引数に指定した実行ファイルやスクリプトファイルがあるフォルダーではありません。
→ g_start_in_path
コマンドプロンプトから標準入力するプログラムは、停止してしまいます。
対策
→ Shell::Exec (VBS)
実証コード
→ T_Call\TryExec.vbs
→ input (vbslib)
関連
→ 正常終了時の動作
→ エラー発生時の動作
→ CheckTestErrLevel
→ sudo (管理者として起動)
stdout_stderr_redirect 引数
一般的なシェルと異なり、リダイレクトしても標準出力へも出力されます。
Empty や "" のときは、標準出力へ出力し、ファイルに保存しません。
"nul" のときは、標準出力へ出力せず、出力内容を破棄します。
EchoOff オブジェクト
を使っても出力しなくなりますが、ファイルに保存できます。
g_VBS_Lib.NotEchoStartCommand
を指定したときは、RunProg 自体の echo 出力は
しなくなりますが、RunProg から実行するプログラムは、echo 出力されます。
補足
VBScript を実行するときは、cscript を経由してください。
vbslib の input などを使っているときは、/GUI_input:1 または /set_input を指定してください。
RunProg "cscript //nologo sample.vbs /GUI_input:1", ""
VBScript をデバッガに接続するときは、下記のように //x を付けてください。
RunProg "cscript //x sample.vbs", ""
コマンド・プロンプトで使えるコマンドを実行するときは、次のようにしてください。
RunProg "cmd /c (dir > files.txt)", ""
複数のコマンドを実行するときは、& をつけてください。
RunProg "cmd /c (cd sub & dir > ..\files.txt)", ""
複数のコマンドをバッチファイルのように記述するときは
→ RunBat
バッチファイルを実行するときは、次のようにしてください。
(pause など、標準入力するコマンドを使わないようにしてください)
カレント・ディレクトリを調整してから RunProg を呼び出してください。
RunProg "batch1.bat", ""
RunProg "batch1.bat /close", ""
閉じないバッチファイルは、閉じるようにする
start "cmd.exe /C ""batch1.bat"""
参考
→ コマンドプロンプトを自動的に閉じないバッチファイル
RunProg したプロセスAが、子プロセスBを生成したとき、プロセスAが終了しても、プロセスB
が終了していなければ、RunProg から戻りません。
g_ChildHead
Dim g_ChildHead as string
新プロセスが標準出力へ出力する内容を表示するときに、行頭に追加する文字列。
デフォルトは、何も追加しません。
グローバル変数です。
関連
→ Run (Shell)
→ CheckTestErrLevel
→ 子プロセスへの受け渡し (/ChildProcess オプション)
→ RunProg (clib)
→ TempParams.txt - C言語のプログラムにデータを渡す
テスト
→ T_RunProg.vbs
→ T_DebugVBS_Manual.vbs
***********************************************************************
<<< RunBat >>>
***********************************************************************
RunBat
Function RunBat( CommandLines as string, Redirect as string ) as integer
指定したバッチを新プロセスで実行します。 終了を待ちます。
【引数】
CommandLines
バッチファイルに記述する内容
Redirect
出力先のファイルパス, "" または Empty で標準出力のみ
返り値
エラーレベル
バッチを終了するときは、goto :eof を使わずに、最後の行に到達するようにしてください。
ソース
→ vbslib.vbs
サンプル
r= RunBat( _
"nmake -f makefile" +vbCRLF+_
"@if errorlevel 1 goto fin" +vbCRLF+_
"del *.obj" +vbCRLF+_
":fin", _
Empty )
If r <> 0 Then Raise 1, ""
If not exist( "sample.dll" ) Then Fail
関連
→ バッチファイルを実行するとき
→ RunBatAsync
***********************************************************************
<<< RunBatAsync >>>
***********************************************************************
RunBatAsync
Function RunBatAsync( CommandLines as string ) as RunBatAsyncClass
指定したバッチを新プロセスで実行します。 終了を待ちません。
【引数】
CommandLines
バッチファイルに記述する内容
返り値
実行状況を確認するためのオブジェクト
返り値の .Status と .ExitCode は、
Exec (Shell)
の返り値と同じです。
バッチを終了するときは、goto :eof を使わずに、最後の行に到達するようにしてください。
RunBatAsync は、echo 出力されません。
デバッグ用に echo 出力を確認したいときは、一時的に RnuBat を使用してください。
ソース
→ vbslib.vbs
サンプル
Set exec = RunBatAsync(( _
"copy a.txt b.txt" +vbCRLF+_
"goto :fin" +vbCRLF+_
":fin" +vbCRLF+_
"" )
Do
If exec.Status = g_VBS_Lib.WshFinished Then
echo exec.ExitCode
Exit Do
End If
Loop
テスト
→ T_Download.vbs
T_SetVirtualFileServer_Files
VirtualServerAtLocal::DownloadAsyncExec の中で使用
***********************************************************************
<<< sudo >>>
***********************************************************************
sudo
(src)
Function sudo( CmdLine as string, OperationName as string,
StdoutStderrRedirect as string ) as integer
指定したコマンドラインを管理者権限を持った新プロセスで実行します。 終了を待ちます。
【引数】
CmdLine
コマンドライン(実行ファイルパス+パラメータ)
OperationName
ユーザーが行おうとしている処理の名前
StdoutStderrRedirect
"" を指定してください
返り値
エラーレベル(main 関数の返り値)
Windows XP の場合
Windows XP では、管理者へログインする設定にすると、起動時に管理者のパスワードを
入力するようになります。 自分が管理者であるときは、入力を求められません。
未対応
Windows Vista/7 の場合
Windows Vista/7 では、起動する直前に、下記のメッセージを出力します。 更にユーザー
アクセス制御(UAC)による管理者への昇格の許可も求められます。 ユーザーが心配
しないよう、OperationName 引数に、行おうとする処理の名前を的確に指定してください。
サンプルコード:
sudo "cscript CopyProgram.vbs", _
"Sample アプリケーションのインストール", ""
sudo が出すメッセージ (実行前)
-------------------------------------------------------------------------------
[ UAC(ユーザーアカウント制御)予告(詳細) ]
詳細情報1:
"C:\home\InstallSample.vbs"
詳細情報2:
C:\home>
cscript CopyProgram.vbs
-------------------------------------------------------------------------------
[ UAC(ユーザーアカウント制御)予告 ]
『Sample アプリケーションのインストール』という処理の続きを "管理者権限ランチャー
(sudo.exe)"から実行します。
これが、あなたがしようとしている処理と異なるときや、あいまいな処理名のときは、
終了してください。
続行するには Enter キーを押してください . . .
↓
Enter キーを押すと
↓
「はい」 をクリックすると
sudo に指定したプログラム、cscript CopyProgram.vbs を、新規プロセスで起動
↓
プログラムが終了したら
sudo が出すメッセージ (実行後)
管理者権限で行う処理が完了し、管理者権限は失効しました。
2秒間表示されます。
デバッガに接続するには
sudo で起動する .vbs スクリプトのプロセスをデバッグするときは、CmdLine 引数に、
cscript のオプション //x 、または /g_debug オプションを付けてください。
sudo "cscript //x CopyProgram.vbs", _
"Sample アプリケーションのインストール", ""
sudo "cscript CopyProgram.vbs /g_debug:1", _
"Sample アプリケーションのインストール", ""
内部コールツリー
通常時
T_sudo_c_Manual.vbs
親プロセス、一般ユーザー
sudo (vbs)
"cscript T_sudo_c_target.vbs"
sudo.exe
cmd /C "temporary.bat"
子プロセス、管理者
cmd /C
"temporary.bat"
孫プロセス、管理者
wscript
T_sudo_c_target.vbs
ひ孫プロセス、管理者
cscript
T_sudo_c_target.vbs
玄孫プロセス、管理者
if not ""%errorlevel%""==""21"" pause
エラー時に pause する
echo %errorlevel% > errorlevel.txt
デバッガ使用時
T_sudo_c_Manual.vbs
親プロセス、一般ユーザー
sudo (vbs)
"cscript //x T_sudo_c_target.vbs"
sudo.exe
cmd /C "cscript //x ***.vbs" /debug:1
子プロセス、管理者
cscript
***.vbs
孫プロセス、管理者、デバッガ接続
テスト
→ T_sudo フォルダ
If GetOSVersion() >= 6.0 Then
未対応
関連
→ g_admin
***********************************************************************
<<< env >>>
***********************************************************************
env
(src)
Function env( s as string ) as string
%〜% で囲まれた環境変数の名前を環境変数の値に展開します。
SetVar で設定した環境変数も展開します。
サンプル:
path = env( "%windir%" )
環境変数 windir を展開する
サンプル:
path = env( "%windir%\system32" )
環境変数以外も指定できます。
引数に Empty が指定されると Empty を返します。
指定した環境変数が定義されていないときは、エラー E_NotFoundSymbol = &h80041006 になり
ます。
引数に配列を指定すると、それぞれの配列要素にある環境変数を展開します。
paths = env( Array( "%windir%", "%windir%\system32" ) )
Assert IsSameArray( paths, Array( "C:\Windows", "C:\Windows\system32" ) )
ローカル環境変数の値が配列のとき、配列要素に環境変数があれば、それも展開します。
SetVar "VarA", 1
SetVar "VarB", 2
SetVar "VarC", Array( "X%VarA%X", "X%VarB%X" )
Assert IsSameArray( env("%VarC%"), Array( "X1X", "X2X" ) )
関連
→ SetVar
→ GetVar
→ SetVarBreak
→ LoadEnvVars
→ SaveEnvVars
→ VarStack
→ 環境変数を取得する (ExpandEnvironmentStrings)
→ Environment (Shell) (VBScript)
→ 環境変数を参照する (Excel)
テスト
→ T_Var.vbs # [T_Var1]
***********************************************************************
<<< ArrayFromCmdLine >>>
***********************************************************************
ArrayFromCmdLine
(src)
Function ArrayFromCmdLine( CmdLine as string ) as array of string
コマンドラインの1行を解析して、それぞれの項目を配列に格納する。
【引数】
CmdLine
コマンドラインの1行
返り値
(出力)それぞれの項目が入った配列
サンプル
For Each column In ArrayFromCmdLine( "Sample.exe ""file (1).txt"" /opt1:2" )
echo column
Next
上記 ArrayFromCmdLine の返り値は、Array( "Sample.exe", "file (1).txt", "/opt1:2" )
それぞれの項目は、空白文字によって分割されます。
abc def
abc
def
タブルクォートの中にある空白文字は、項目の分割になりません。
両端のダブルクォートは、項目に含まれません。
ダブルクォートは閉じてなくても構いません。
abc "def ghi" "j k
abc
def ghi
j k
タブルクォートで囲まれている部分の前または後が空白文字ではないときは、それらも
1つの項目の中に含まれます。 その際、ダブルクォート文字は含まれません。
abc"def" ab"c d"ef
abcdef
abc def
ダブルクォート文字を項目に含めるときは、\" と記述します。
" " で囲まれた中でも外でも同じです。
ab\"cd "12\"34"
ab"cd
12"34
\ の直後が " ではないときは、\ が連続していても、そのまま項目に入ります。
\\pc\n
\\pc\n
\ が n 文字あって直後に " があるときは、n が偶数なら、\ 文字が n/2 文字と " " の
囲みの開始になります。 n が奇数なら、\ 文字 (n-1)/2 文字と " 文字になります。
" " で囲まれた中でも外でも同じです。
\" \\\" \\\\\" \\"a b" \\\\"c d"
"
\"
\\"
\a b
\\c d
"\" \\\" \\\\\" \\"a b" \\\\"c d"
" \" \\" \a
b \\c
d
参考
→ cmd.exe のコマンドラインの仕様を解析してみた - 永遠に未完成 (Web)
→ コマンドラインの引数とエスケープ
テスト
→ T_CmdLine.vbs # [T_ArrayFromCmdLine]
関連
→ ArrayFromCSV
→ ParseCmdLine
→ Split
その他の形式から配列
→ ArgsLog
パラメーターを記録する
→ ArrayFromBashCmdLine
→ パラメータ (コマンドライン), Arguments, args
→ CmdLineFromStr
***********************************************************************
<<< ArrayFromCmdLineWithoutOpt >>>
***********************************************************************
ArrayFromCmdLineWithoutOpt
Function ArrayFromCmdLineWithoutOpt( CmdLine as string, OptionSigns as variant )
as array of string
コマンドラインの1行を解析して、オプション以外の項目を配列に格納する。
【引数】
CmdLine
コマンドラインの1行
OptionSigns
オプション記号の配列、または Empty(= "/", "-")
返り値
(出力)それぞれの項目が入った配列
サンプル
arr = ArrayFromCmdLineWithoutOpt( "Sample.exe ""file (1).txt"" /opt1:2 param2", Empty )
上記 ArrayFromCmdLineWithoutOpt の返り値は、Array( "Sample.exe", "file (1).txt", "param2" )
***********************************************************************
<<< DicFromCmdLineOpt >>>
***********************************************************************
DicFromCmdLineOpt
(src)
Function DicFromCmdLineOpt( CmdLine as string, OptionNames as array of string )
as dictionary of string or True
コマンドラインの1行を解析して、オプション名をキーとした辞書を返します。
【引数】
CmdLine
コマンドラインの1行
OptionNames
オプション名の配列
返り値
(出力)オプション名をキーとした辞書
オプションではないパラメーターは、キー "no name" の、配列型の値に格納されます。
オプションは、キーがオプション名、値が文字列型、True、Empty のいずれかになります。
サンプル
Dim params : Set params = DicFromCmdLineOpt( _
"Sample.exe /opt1:2 -flag param", Array( "/opt1", "-flag", "/no_opt" ) )
Assert IsSameArray( params( "no name" ), Array( "Sample.exe", "param" )
Assert params( "/opt1" ) = "2"
Assert params( "-flag" ) = True
Assert params( "-flag" )
Assert not params( "/no_opt" )
Assert IsEmpty( params( "/no_opt" ) )
オプション名と値の間に空白文字が含まれる場合は、OptionNames に指定する
オプション名の後に ":" (コロン)を付けてください。
Dim params : Set params = DicFromCmdLineOpt( _
"-o value1 value2", Array( "-o:" ) )
Assert params( "-o" ) = "value1"
Assert IsSameArray( params( "no name" ), Array( "value2" )
複数指定ができるオプションは、OptionNames に指定するオプション名の後に "::"
(コロン×2)を付けてください。 このとき、辞書の値は配列になります。
Dim params : Set params = DicFromCmdLineOpt( _
"-o value1 -ovalue2", Array( "-o::" ) )
Assert IsSameArray( params( "-o::" ), Array( "value1", "value2" ) )
テスト
→ T_CmdLine.vbs # [T_DicFromCmdLineOpt]
関連
→ GetCommandLineOptionValue
***********************************************************************
<<< MeltCmdLine >>>
***********************************************************************
MeltCmdLine
(src)
Function MeltCmdLine( Line as string, in_out_Start as integer ) as string
コマンドラインの1項目を取り出し、通常の文字列に戻す。
【引数】
CmdLine
コマンドラインの内容
in_out_Start
(入力) 取り出しを開始する文字の位置、(出力)次に取り出す〜
返り値
取り出したコマンドラインの1項目
次の項目が無いときは、in_out_Start=0 になります。
サンプル
サンプルデータ
i = 1
Do
s = MeltCmdLine( cmdline, i )
If i = 0 Then Exit Do
Loop
sample.exe param1 "param 2"
次の順番で返ります
sample.exe
param1
param 2
テスト
→ T_CmdLine.vbs # [T_MeltCmdLine]
関連
→ ArrayFromCSV
→ MeltQuot
→ Split
***********************************************************************
<<< ArrayFromBashCmdLine >>>
***********************************************************************
ArrayFromBashCmdLine
(src)
Function ArrayFromBashCmdLine( CmdLine as string ) as array of string
bash シェルのコマンドラインの1行を解析して、それぞれの項目を配列に格納する。
ArrayFromCmdLine
の bash 版です。
テスト
→ T_CmdLine.vbs # [T_ArrayFromBashCmdLine]
***********************************************************************
<<< MeltBashCmdLine >>>
***********************************************************************
MeltBashCmdLine
(src)
Function MeltBashCmdLine( Line as string, in_out_Start as integer ) as string
bash シェルのコマンドラインの1項目を取り出し、通常の文字列に戻す。
MeltCmdLine
の bash 版です。
テスト
→ T_CmdLine.vbs # [T_ArrayFromBashCmdLine]
***********************************************************************
<<< ParseCmdLine >>>
***********************************************************************
ParseCmdLine
未対応
Function ParseCmdLine( CmdLine as string ) as CmdLineArgs
コマンドラインが入った文字列を解析して、それぞれの引数を配列などに格納する。
【引数】
CmdLine
コマンドライン
返り値
引数にアクセスするオブジェクト
→ CmdLineArgs クラス
現在のスクリプトを起動したときのコマンドラインではない、コマンドラインの内容に
アクセスしやすくします。
サンプル
Set args = ParseCmdLine( line )
サンプルデータ
sample.exe param1 "param 2"
次のように分割されます
sample.exe
param1
param 2
関連
→ WScript.Arguments
→ GetCmdLine
→ MeltCmdLine
→ Split
→ ArrayFromCSV
***********************************************************************
<<< CmdLineArgs クラス >>>
***********************************************************************
CmdLineArgs クラス
未対応
取得
→ ParseCmdLine
メンバー
WScript.Arguments
に準拠
***********************************************************************
<<< CmdLineFromStr >>>
***********************************************************************
CmdLineFromStr
Function CmdLineFromStr( Str as string or array ) as string
文字列、または文字列の配列から、コマンドラインを作成します。
【引数】
Str
文字列、または文字列の配列
返り値
コマンドライン
ファイル:
vbslib.vbs
・
・
文字列に空白や >, <, ^, | 記号を含むときは、" " で囲みます。
文字列にダブル・クォーテーションや \ 記号があるときは、それらの文字が、これから
起動するプログラムに渡るように変換します。
サンプル
cmd = CmdLineFromStr( Array( "findstr", "/C:""quot and space""", "*" ) )
Assert cmd = "findstr ""/C:\""quot and space\"""" *"
ソース
→ vbslib.vbs
テスト
→ T_CmdLine.vbs # [T_CmdLineFromStr]
関連
→ ArgsLog
***********************************************************************
<<< GetCmdLine >>>
***********************************************************************
GetCmdLine
(src)
Function GetCmdLine() as string
現在のスクリプトを起動したときのコマンドラインを返します。
実行ファイル名と、パラメーターの両方を含みます。
関連
→ WScript.Arguments
→ ParseCmdLine
→ g_debug_params
***********************************************************************
<<< ArgumentExist >>>
***********************************************************************
ArgumentExist
(src)
Function ArgumentExist( Name as string ) as boolean
指定した名前のコマンドライン・オプションが指定されているかどうかを返します。
【引数】
Name
コマンドライン・オプション名
返り値
オプションが指定されているかどうか
サンプル:
If ArgumentExist( "Opt1" ) Then ...
パラメーターが必須のオプションには、ArgumentExist を呼ぶ必要はありません。
/Opt1:1 ではなく /Opt1 では、WScript.Arguments.Named.Item("Opt1") は
Empty を返し、/Opt1 を指定しなかったときと、区別ができません。
ArgumentExist は、区別ができます。
Name の大文字小文字は区別します。
関連
→ パラメータを取得する (VBS)
WScript.Arguments.Unnamed(0)
WScript.Arguments.Named.Item("Opt1")
→ GetCommandLineExist (clib)
→ GetArgvNamed (clib)
→ g_debug_params
***********************************************************************
<<< GetCommandLineOptionName >>>
***********************************************************************
GetCommandLineOptionName
(src)
Function GetCommandLineOptionName( OneParameter as string ) as string
オプション名+値から、オプション名を返します。
【引数】
OneParameter
オプション名+値
返り値
オプション名
サンプル:
name = GetCommandLineOptionName( "/OptionA:12" )
'// name = "OptionA"
テスト
→ T_CmdLine.vbs # [T_CommandLineOption]
***********************************************************************
<<< GetCommandLineOptionValue >>>
***********************************************************************
GetCommandLineOptionValue
(src)
Function GetCommandLineOptionValue( OneParameter as string ) as string
オプション名+値から、値を返します。
【引数】
OneParameter
オプション名+値
返り値
値
サンプル:
value = GetCommandLineOptionValue( "/OptionA:12" )
'// value = "12"
value = GetCommandLineOptionValue( "/OptionA:""C:\Program Files""" )
'// value = "C:\Program Files"
テスト
→ T_CmdLine.vbs # [T_CommandLineOption]
***********************************************************************
<<< ModifyCmdLineOpt >>>
***********************************************************************
ModifyCmdLineOpt
(src)
Function ModifyCmdLineOpt( CmdLine as string,
OptionName as string, NewOptionNameAndParam as string ) as string
コマンドラインの1行にある、オプションの値を変更します。
【引数】
CmdLine
コマンドラインの1行
OptionName
オプション名
NewOptionNameAndParam
オプション名と、変更後の値。 削除=Empty
返り値
(出力) 変更後のコマンドラインの1行
サンプル
-Opt2 オプションの値を変更する
new_cmdline = ModifyCmdLineOpt( "-Opt1 -Opt2:ValueA Value1", "-Opt2", "-Opt2:ValueB" )
Assert new_cmdline = "-Opt1 -Opt2:ValueB Value1"
-Opt2 オプションを無くす
new_cmdline = ModifyCmdLineOpt( "-Opt1 -Opt2:ValueA Value1", "-Opt2", Empty )
Assert new_cmdline = "-Opt1 Value1"
-Opt2 オプションがなければ追加する
new_cmdline = ModifyCmdLineOpt( "-Opt1 Value1", "-Opt2", "-Opt2:ValueB" )
Assert new_cmdline = "-Opt1 -Opt2:ValueB Value1"
-Opt2 オプションと、その値の間が空白のときは、OptionNmae 引数の末尾に ":"(コロン)を付ける
new_cmdline = ModifyCmdLineOpt( "-Opt1 -Opt2 ValueA Value1", "-Opt2:", "-Opt2 ValueB" )
Assert new_cmdline = "-Opt1 -Opt2 ValueB Value1"
複数指定できる -o オプションを追加するときは、OptionNmae 引数の末尾に "::"(コロン×2)を付ける
new_cmdline = ModifyCmdLineOpt( "-o ValueA -o ValueB Value1", "-o::", "-o NewValue" )
Assert new_cmdline="-o NewValue -o ValueA -o ValueB Value1"
複数指定できる -o オプションを修正/削除するときは、OptionNmae 引数の末尾に "::"(コロン×2)
と値を付ける
new_cmdline = ModifyCmdLineOpt( "-o ValueA -o ValueB Value1", "-o::ValueB", "-o NewValue" )
Assert new_cmdline = "-o ValueA -o NewValue Value1"
new_cmdline = ModifyCmdLineOpt( "-o ValueA -o ValueB Value1", "-o::ValueB", Empty )
Assert new_cmdline = "-o ValueA Value1"
テスト
→ T_CmdLine.vbs # [T_ModifyCmdLineOpt]
***********************************************************************
<<< オプション引数、ビットフラグ >>>
***********************************************************************
オプション引数、ビットフラグ
移植性を持たせつつ将来のバージョンで関数の引数を追加できるようにしたいときは、
下記の引数を検討するとよいでしょう。
ビットフラグ引数
→ IsBitSet
オプション引数(配列)
→ ParseOptionArguments
移植性を持たせつつ引数の数を変更したいときは、
新しく関数名を "<従来の関数名>Ex" にするか、
古い関数名を "<従来の関数名>_Old" にするとよいでしょう。
***********************************************************************
<<< IsBitSet >>>
***********************************************************************
IsBitSet
IsAnyBitsSet
IsAllBitsSet
IsBitNotSet
IsAnyBitsNotSet
IsAllBitsNotSet
Function IsBitSet( Variable as integer, ConstValue as integer ) as boolean
1つのビットが立っているかどうかを判定します。
Function IsAnyBitsSet( Variable as integer, OrConstValue as integer ) as boolean
複数のビットのうち1つ以上が立っているかどうかを判定します。
Function IsAllBitsSet( Variable as integer, OrConstValue as integer ) as boolean
複数のビットのすべてが立っているかどうかを判定します。
Function IsBitNotSet( Variable as integer, ConstValue as integer ) as boolean
1つのビットが立っていないかどうかを判定します。
Function IsAnyBitsNotSet( Variable as integer, OrConstValue as integer ) as boolean
複数のビットのうち1つ以上が立っていないかどうかを判定します。
Function IsAllBitsNotSet( Variable as integer, OrConstValue as integer ) as boolean
複数のビットのすべてが立っていないかどうかを判定します。
【引数】
Variable
調べる対象のビット・フィールド値
ConstValue
調べる位置のビットを1にしたビット・フィールド値
OrConstValue
調べる位置の複数のビットを1にしたビット・フィールド値
返り値
判定結果
ソース
→ vbslib.vbs
テスト
→ T_Var.vbs
T_IsBitSet
サンプル
Sub Main()
Set c = get_SampleConsts()
echo FuncA( c.Bit0 )
echo FuncA( c.Bit1 )
echo FuncA( c.Bit0 or c.Bit1 )
echo FuncA( 0 )
echo FuncA( Empty )
End Sub
Function FuncA( BitFlags )
Set c = get_SampleConsts()
s = ""
If IsBitSet( BitFlags, c.Bit0 ) Then s = s + "A"
If IsAnyBitsSet( BitFlags, c.Bit0 or c.Bit1 ) Then s = s + "B"
If IsAllBitsSet( BitFlags, c.Bit0 or c.Bit1 ) Then s = s + "C"
If IsBitNotSet( BitFlags, c.Bit0 ) Then s = s + "a"
If IsAnyBitsNotSet( BitFlags, c.Bit0 or c.Bit1 ) Then s = s + "b"
If IsAllBitsNotSet( BitFlags, c.Bit0 or c.Bit1 ) Then s = s + "c"
FuncA = s
End Function
'*************************************************************************
' <<< [get_SampleConsts] >>>
'*************************************************************************
Dim g_SampleConsts
Function get_SampleConsts()
If IsEmpty( g_SampleConsts ) Then _
Set g_SampleConsts = new SampleConsts
Set get_SampleConsts = g_SampleConsts
End Function
Class SampleConsts
Public Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Bit8, Bit9
Public Bit10, Bit11, Bit12, Bit13, Bit14, Bit15, Bit16, Bit17, Bit18, Bit19
Public Bit20, Bit21, Bit22, Bit23, Bit24, Bit25, Bit26, Bit27, Bit28, Bit29
Public Bit30, Bit31
Private Sub Class_Initialize()
Bit0 = &h0001
Bit1 = &h0002
Bit2 = &h0004
Bit3 = &h0008
Bit4 = &h0010
Bit5 = &h0020
Bit6 = &h0040
Bit7 = &h0080
Bit8 = &h0100
Bit9 = &h0200
Bit10 = &h0400
Bit11 = &h0800
Bit12 = &h1000
Bit13 = &h2000
Bit14 = &h4000
Bit15 = CLng("&h8000")
Bit16 = &h00010000
Bit17 = &h00020000
Bit18 = &h00040000
Bit19 = &h00080000
Bit20 = &h00100000
Bit21 = &h00200000
Bit22 = &h00400000
Bit23 = &h00800000
Bit24 = &h01000000
Bit25 = &h02000000
Bit26 = &h04000000
Bit27 = &h08000000
Bit28 = &h10000000
Bit29 = &h20000000
Bit30 = &h40000000
Bit31 = &h80000000
End Sub
Public Function ToStr( Number )
Select Case Number
Case Bit0 : ToStr = "Bit0"
Case Bit1 : ToStr = "Bit1"
'// ...
End Select
End Function
End Class
関連
→ Hex
***********************************************************************
<<< ParseOptionArguments >>>
***********************************************************************
ParseOptionArguments
Sub ParseOptionArguments( in_out_Options as variant )
引数に指定した配列型のオプション引数を辞書型に変換します。 キーは要素の型名です。
【引数】
in_out_Options
(入力) 任意の型の変数や配列や辞書やEmpty、(出力) 辞書
キーは、大文字小文字を区別しません。
整数型(integer, byte, long)のアイテムに対応するキーは、"integer" です。
浮動小数型(single, double)のアイテムに対応するキーは、"float" です。
その他の型は、
TypeName
の返り値がキーになります。
入力した配列に含まれない型をキーに指定した場合、アイテムは Empty になります。
ParseOptionArguments は、オプション引数(オプション的な引数)を扱いやすくします。
ユーザーは、オプションを指定しないときは Empty を渡します。
オプションを1つ以上指定するときは、配列形式にまとめて渡します。
オプションを1つ指定するときは、配列に入れなくても構いません。
処理が開始されると、本関数によって、オプション引数は型をキーとした辞書に変換されます。
in_out_Options 引数に辞書を指定したときは、何もしません。
オプション引数を直接 TypeName 関数などで判定しないでください。
オプション引数をそのまま関数呼び出しに渡しているときは、辞書型に置き換わって返ってくる
可能性があります。 そして、その変数が再びオプション引数に渡される可能性があります。
ですので、必ず ParseOptionArguments を呼び出した後で、辞書のキーの有無からオプション
の有無を判定してください。
サンプル
Set object = new SampleClass
FuncA Array( &h0001 or &h0002, "ABC", object )
Sub FuncA( in_out_Options )
ParseOptions in_out_Options
Assert in_out_Options("integer") = &h0001 or &h0002
Assert in_out_Options("string") = "ABC"
Assert in_out_Options("SampleClass") Is object
Assert not in_out_Options.Exists("NotPassedType")
option_flags = in_out_Options("integer")
If in_out_Options.Exists("SampleClass") Then
Set options = in_out_Options("SampleClass")
Else
Set options = new SampleClass
End If
End Sub
サンプル
FuncA 123
Sub FuncA( in_out_Options )
ParseOptions in_out_Options
Assert in_out_Options("integer") = 123
End Sub
ソース
→ vbslib.vbs
テスト
→ T_Var.vbs
T_ParseOptionArguments
***********************************************************************
<<< include >>>
***********************************************************************
include
(src)
Sub include( path as string )
関数定義やクラス定義が入った VBSファイルをインクルードします。
path に環境変数を含めることができます。 (%var% 形式)
クラス定義や関数定義が入った VBS ファイルのパスを指定します。
VBS ファイルで定義されたグローバル変数や関数は、include を呼び出した
関数の外から参照することはできません。
path に相対パスを指定するときは注意が必要です。
→ g_start_in_path
呼び出し先に関数を実行するときのカレントフォルダは、そのスクリプト
ファイルがあるフォルダになります。
サンプル:
include "%ProgramFiles%\Movie Maker\moviemk.vbs"
フォルダのパスを指定したり、ワイルドカードを指定すると、サブフォルダも
含めて include します。 ただし、フォルダのパスだけを指定した場合は、
*_obj.vbs ファイルだけ include します。
サンプル: objs フォルダのサブフォルダも含めて、*_obj.vbs を include します
include "objs"
二重定義エラーが出るときの対策
インクルードする vbs ファイルに、すでに定義されているクラスの
定義があると、エラーになります。クラスは、インスタンスに影響する
ため上書きできません。 (関数は上書きできます)
二重にインクルードしないようにするか、クラス定義だけ1回だけ
インクルードするファイルに分割してください。
サンプル: 1回だけインクルードする
Dim g_TestClass : If IsEmpty( g_TestClass ) Then _
include "TestClass.vbs" : g_TestClass = True
テスト
→ T_Include.vbs # [main2]
関連
→ include_objs
→ vbs_inc
→ g_SrcPath
→ FuncRedir_add
***********************************************************************
<<< SectionTree クラス >>>
***********************************************************************
SectionTree クラス
(src)
SectionTree オブジェクトを使って、全体の処理を複数のセクションに分割すると、途中のセクション
から実行することができるようになります。
たとえば、1つの関数の中で、複数のテストを連続して行っているとき、1つ1つのテストをセクションに
分けておくと、失敗したテストから実行させることができるようになります。
セクションの開始と終了で、現在のセクションの位置(親のツリーノードのセクション名から現在まで)
を表示します(下記、サンプル画面)。
サンプル
Sub Test_start( tests )
Set section = new SectionTree
'//SetStartSectionTree "T_Sample2" '// 一部のセクションだけ実行するときは有効にする
If section.Start( "T_Sample1" ) Then
'// ここは実行されません
End If : section.End_
'// section.Start 〜 End_ の外は、常に実行する
If section.Start( "T_Sample2" ) Then
'// ここから実行されます
End If : section.End_ '// ここで、「終了しました」と確認メッセージが表示される
If section.Start( "T_Sample2" ) Then
'// ここも実行されます
End If : section.End_
Pass
End Sub
SetStartSectionTree
T_Sample2
Start
End_
サンプル画面
Section> T_Sample2
サンプル
ネストしているとき
Sub Test_start( tests )
SetStartSectionTree "Sec1, SubSec2"
Dim section : Set section = new SectionTree
If section.Start( "Sec1" ) Then
If section.Start( "SubSec2" ) Then
'// ここは実行されます
End If : section.End_
End If : section.End_
Pass
End Sub
サンプル画面
Section> Sec1
テスト
(各メソッドを参照)
***********************************************************************
<<< Start (SectionTree) >>>
***********************************************************************
[ 親: SectionTree クラス ]
Start (SectionTree)
(src)
Function SectionTree::Start( SectionName as string ) as boolean
セクションの開始を指定します。
【引数】
SectionName
セクション名
返り値
セクションを実行するかどうか
ファイル:
vbslib.vbs
デバッグ用に、本関数の中から呼び出すコールバック関数を登録できます。
→ OnStart (SkipSectionGlobal)
テスト
→ T_SectionTree.vbs # [T_SectionTree_1]
→ T_SectionTree.vbs # [T_SectionTree_2]
→ T_SectionTree.vbs # [T_SectionTree_0]
→ T_SectionTree.vbs # [T_SectionTree_Err]
***********************************************************************
<<< End_ (SectionTree) >>>
***********************************************************************
[ 親: SectionTree クラス ]
End_ (SectionTree)
(src)
Sub SectionTree::End_()
セクションの終了を指定します。
ファイル:
vbslib.vbs
テスト
→ Start (SectionTree)
***********************************************************************
<<< xml (SectionTree) >>>
***********************************************************************
[ 親: SectionTree クラス ]
xml (SectionTree)
(src)
Function SectionTree::xml() as string
現在のセクションを返します。
ファイル:
vbslib.vbs
サンプル
現在のセクションを表示します。 なお、echo に指定するときは xml を省略できます。
Dim section : Set section = new SectionTree
If section.Start( "Sec1" ) Then
echo section
End If : section.End_
出力例:
テスト
→ T_SectionTree.vbs # [T_SectionTree_1]
→ T_SectionTree.vbs # [T_SectionTree_2]
***********************************************************************
<<< 旧仕様 >>>
***********************************************************************
旧仕様
***********************************************************************
<<< EchoTestStart >>>
***********************************************************************
EchoTestStart
(src)
廃止予定です。
代用
→ SectionTree クラス
Sub EchoTestStart( TestSymbol as string )
テストシンボルをエコー出力します。
サンプル1
EchoTestStart "T_Samp1"
サンプルの出力
((( [T_Samp1] )))
サンプル2
EchoTestStart tests.Symbol
Test.vbs
や
InputCommand
を実行するときは、EchoTestStart 関数を呼ばなくても、自動
的にシンボルがエコー出力されます。
Test_start 関数の中で複数のテストをするときに、EchoTestStart 関数を使うと、テストのログ
が見やすくなります。
***********************************************************************
<<< SkipToSection >>>
***********************************************************************
SkipToSection
(src)
Sub SkipToSection( Num as integer )
指定した番号のセクションより前のセクションをスキップするように設定します。
【引数】
Num
次に実行するセクション番号
通常、メイン関数から呼び出します。
はじめは 0 を指定して、セクション番号を echo 出力させます。
次に、スキップしたいセクションを調べて、次に実行したいセクション番号を指定します。
サンプル: セクション番号 5 から実行する( 5 より前は実行をスキップする。)
SkipToSection 5
サンプル: セクション番号 5,2 から実行する( 5,1 より前は実行をスキップする。)
SkipToSection Array( 5, 2 )
サンプル: セクション番号を表示させない、かつ、実行のスキップをしない。
SkipToSection Empty
セクション番号は、下記のように echo 出力されます。 SkipToSection を一度も呼んで
いないときや、スキップ中は出力されません。
一度も SkipToSection が呼ばれていないときは、グローバル変数 g_SkipSection が
Empty になっています。
NotSkipSection にブレークポイントを張ると、セクションごとにブレークします。
関連
→ SetBreakAtSection
→ SkipSection::Start
→ SkipSection::End_
テスト
→ T_SkipToSection フォルダ
***********************************************************************
<<< SkipSection::Start >>>
***********************************************************************
SkipSection::Start
(src)
Function SkipSection::Start() as boolean
本関数を呼び出した場所をセクションの開始場所とします。
サンプル:
Dim section : Set section = new SkipSection
If section.Start() Then '// section 1
:
section.End_
End If
If section.Start() Then '// section 2
If exist( "out.txt" ) Then '// 条件によって、しないことがある処理は、section の中へ
:
End If
section.End_
End If
テスト
→ T_SkipToSection フォルダ
***********************************************************************
<<< SkipSection::End_ >>>
***********************************************************************
SkipSection::End_
Sub SkipSection::End_()
参考
→ SkipSection::Start
***********************************************************************
<<< NotSkipSection >>>
***********************************************************************
NotSkipSection
(src)
Function NotSkipSection() as boolean
廃止予定です。 SkipSection::Start 〜 End_ を使ってください
→ SkipSection::Start
本関数を呼び出した場所をセクションの開始場所とします。
【引数】
返り値
SkipToSection で設定されたセクション以降かどうか
本関数を呼び出すとセクション番号を+1します。
SkipToSection が呼ばれていたら、セクション番号を echo 出力します。
サンプル:
For Each i As arr
If NotSkipSection() Then
DoTest
End If
Next
echo 出力の例:
***********************************************************************
<<< SetBreakAtSection >>>
***********************************************************************
SetBreakAtSection
(src)
Sub SetBreakAtSection( Num )
指定のセクションでブレークするようにします。
***********************************************************************
<<< GetSkipSectionGlobal >>>
***********************************************************************
GetSkipSectionGlobal
Function GetSkipSectionGlobal() as SkipSectionGlobal
セクションを管理するオブジェクトを返します。
【引数】
返り値
セクションを管理するオブジェクト
ソース
→ vbslib.vbs
GetSkipSectionGlobal 関数
→ vbslib.vbs
SkipSectionGlobal クラス
SkipSectionGlobal クラス
→ OnStart
セクションを開始する直前でコールバックする関数。
***********************************************************************
<<< OnStart (SkipSectionGlobal) >>>
***********************************************************************
OnStart (SkipSectionGlobal)
Sub SkipSectionGlobal::OnStart( CallbackObject as variant )
セクションを開始する直前でコールバックする関数。
【引数】
CallbackObject
GetSkipSectionGlobal().CallbackObject
サンプル
Sub Main( Opt, AppKey )
Set ss = GetSkipSectionGlobal()
Set ss.OnStart = GetRef("CheckOnCallback")
Set ss.CallbackObject = Nothing
RunTestPrompt AppKey.NewWritable( "." )
End Sub
Sub CheckOnCallback( Argument1 )
echo "CheckOnCallback"
End Sub
関連
→ Start (SectionTree)
セクションの開始を指定します。
***********************************************************************
<<< call_vbs >>>
***********************************************************************
call_vbs
(src)
(src)
Function call_vbs( path as string, func as string, param as variant )
指定した VBScript ファイルの中の関数を呼び出し、終了するまで待ちます。
【引数】
path
VBScript ファイルのパス
func
呼び出す関数の名前
param
関数に渡すパラメータ
返り値
関数の返り値
現在のプロセスのまま、別の .vbs ファイルを呼び出します。
サンプル:
call_vbs "%ProgramFiles%\Movie Maker\moviemk.vbs", "FuncA", ""
呼び出し先の関数は、次の型にしてください。
Function FuncA( Param )
path に環境変数を含めることができます。 (%var% 形式)
path に相対パスを指定するときは注意が必要です。
→ g_start_in_path
呼び出し先に関数を実行するときのカレントフォルダは、そのスクリプト
ファイルがあるフォルダになります。
グローバル変数は、呼び出し先で宣言したものが、使えるようになります。
g_SrcPath
は、で、グローバル領域を実行しているときだけでなく、呼び出す
関数を実行しているときも、path 引数に指定したパスのフル・パスが入ります。
***********************************************************************
<<< FuncRedir_add >>>
***********************************************************************
FuncRedir_add
(src)
Sub FuncRedir_add( out_Redir as FuncRedir, Name as string )
関数コールをリダイレクト(横取り)します。
【引数】
out_Redir
(出力)
FuncRedir オブジェクト
Name
リダイレクトされる関数の名前
上書きする前の関数を呼び出さないときは、FuncRedir_add を呼び出す必要はありません。
FuncRedir_add の第1引数に指定して取得したオブジェクト使って、上書きする前の関数を
呼び出します。
リダイレクト先の関数が定義してあるスクリプト・ファイルと、別のファイルから FuncRedir_add
を呼び出してください。
たとえば、下記の ModuleC.vbs と ModuleC_pre.vbs のように分けてください。
そうしないと、リダイレクトする前の関数が上書きされた後で、FuncRedir_add が呼ばれる
ことになり、終わりのない再帰呼び出しになり、メモリ不足(スタック不足)のエラーになる
でしょう。
サンプル
FuncA 関数の定義をリダイレクトし、環境変数 FuncA_Redir の値によって、リダイレクト元か
リダイレクト先かのどちらかの FuncA 関数を呼び出すかを選べるようにします。
Main.vbs
include "ModuleC_pre.vbs"
include "ModuleC.vbs"
ModuleC_pre.vbs
FuncRedir_add を呼び出すためのファイル
Dim g_FuncA : FuncRedir_add g_FuncA, "FuncA"
FuncA
FuncA
FuncA
ModuleC.vbs
リダイレクト先
ModuleX.vbs
FuncA の呼び出し元
Sub FuncA( Param1 )
If GetVar( "FuncA_Redir" ) = "Over" Then
echo "overrided"
Else
g_FuncA.CallSub1 Param1
End If
End Sub
FuncA
Sub FuncX()
Dim v_:Set v_= new VarStack
SetVar "FuncA_Redir", "Over"
FuncA
End Sub
FuncA
参考
→ T_NameAdd_vbslib フォルダ
→ バージョン判定、環境変数
FuncRedir オブジェクトのメソッド一覧
上書きする前の関数を呼び出します。
Sub FuncRedir::CallSub0()
Sub FuncRedir::CallSub1( Param1 )
Sub FuncRedir::CallSub2( Param1, Param2 )
Sub FuncRedir::CallSub3( Param1, Param2, Param3 )
Sub FuncRedir::CallSub4( Param1, Param2, Param3, Param4 )
Function FuncRedir::CallFunction0()
Function FuncRedir::CallFunction1( Param1 )
Function FuncRedir::CallFunction2( Param1, Param2 )
Function FuncRedir::CallFunction3( Param1, Param2, Param3 )
Function FuncRedir::CallFunction4( Param1, Param2, Param3, Param4 )
テスト
→ T_FuncRedir.vbs
関連
→ バージョン判定、環境変数
→ マクロ・リダイレクト
***********************************************************************
<<< CallForEach >>>
***********************************************************************
CallForEach
(src)
Function CallForEach0( Func as Function, Collection as array or variant )
Function CallForEach1( Func, Collection, Param1 as variant )
Function CallForEach2( Func, Collection, Param1 as variant, Param2 as variant )
Collection のそれぞれの要素を引数に渡して、関数 Func を複数回呼び出します。
【引数】
Func
呼び出す関数(GetRef使用)
Collection
配列、または単純変数、または Empty
Param1
関数に渡すパラメータ
返り値
関数 Func の返り値(Collection が単純変数のときのみ)
なるべく、CallForEach を使わずに、For ループを使って、それぞれの要素に対して
処理してください。
サンプル:
CallForEach2 GetRef("CallForEach_copy"), Array( "a.txt", "b.txt" ), "src", "dst"
上記コードは下記コードと同じ処理内容です。
CallForEach_copy "a.txt", "src", "dst"
CallForEach_copy "b.txt", "src", "dst"
キーワード:
CallForEach0, CallForEach1, CallForEach2, CallForEach3, CallForEach4
関連
→ EventResponders : イベント応答 (vbsool)
***********************************************************************
<<< CallForEach_copy >>>
***********************************************************************
CallForEach_copy
(src)
Sub CallForEach_copy( StepPath as string, FromFolderPath as string, ToFolderPath as string )
CallForEach
に使えるファイルコピーです。
【引数】
StepPath
ファイルへの相対パス。 基準は FromFolderPath と ToFolderPath
FromFolderPath
コピー元のフォルダ
ToFolderPath
コピー先のフォルダ
サンプル
CallForEach2 GetRef("CallForEach_copy"), Array( "a.txt", "folder\*" ), "src", "dst"
上記コードは下記コードと同じ処理内容です。
copy "src\a.txt", "dst"
copy "src\folder\*", "dst\folder" '// copy "src\folder", "dst" と同じ
フォルダーをコピーするとき、パスの末尾に "\*" があってもなくても構いません。
ワイルドカードを使っても、サブ・フォルダーはコピーしません。
ExpandWildcard
と組み合わせて
ください。
Set c = g_VBS_Lib
ExpandWildcard "src\*.doc", c.File or c.SubFolder, folder, step_paths
CallForEach2 GetRef("CallForEach_copy"), step_paths, "src", "dst"
テスト
→ T_EachCopy.vbs # [T_EachCopy1]
***********************************************************************
<<< CallForEach_move >>>
***********************************************************************
CallForEach_move
(src)
Sub CallForEach_move( FilePath, FromFolderPath, ToFolderPath )
CallForEach
に使えるファイルの移動です。
参考
→ CallForEach_copy
***********************************************************************
<<< CallForEach_del >>>
***********************************************************************
CallForEach_del
(src)
Sub CallForEach_del( FilePath, FolderPath )
CallForEach
に使えるファイルまたはフォルダの削除です。
サンプル
CallForEach1 GetRef("CallForEach_del"), Array( "a.txt", "folder\*" ), "folder"
上記コードは下記コードと同じ処理内容です。
del "folder\a.txt"
del "folder\folder\*"
***********************************************************************
<<< SetTaskStartTime >>>
***********************************************************************
SetTaskStartTime
(src)
Sub SetTaskStartTime( TaskName as string, StartTime as string )
タスク・スケジューラーに登録済みの、指定のタスクを開始する時刻を変更します。
StartTime の先頭を + にすると、現在の時刻からの差分を指定できます。
例) +1:30 … 1時間半後
サンプル
→ samples/TaskScheduler フォルダ
echo "タスクの開始時間を再設定します。"
Dim name : name = input( "タスク名>" )
echo "例: 13:00 ... 今が午前10時なら、今日の午後1時に実行する"
echo "例: 1:00 ... 今が午前10時なら、明日の午前1時に実行する"
echo "例: +1:00 ... 今から1時間後に実行する"
Dim after : after = input( "いつ実行を開始しますか>" )
SetTaskStartTime name, after
SetTaskStartTime
関連
→ GetTaskList
→ schtasks /Create
***********************************************************************
<<< GetTaskList >>>
***********************************************************************
GetTaskList
(src)
Function GetTaskList( EmptyParam as Empty )
タスク・スケジューラーに登録済みの、タスクを一覧します。
返り値は、タスクの集合である辞書型です。
タスクの集合の Key は タスク名、Item は1つのタスクを表す辞書型です。
1つのタスクを表す辞書型の Key は タスクの属性名、Item は属性の値です。
サンプル
Set tasks = GetTaskList( Empty )
Set task = tasks.Item( "\Task1" )
start task.Item( "実行するタスク" )
参考
→ schtasks /Query
***********************************************************************
<<< MakeFileClass (メイクファイル) >>>
***********************************************************************
MakeFileClass (メイクファイル)
(src)
make コマンドのように、ファイルのタイムスタンプを比較して、必要ならコマンドを実行します。
一般的なメイクファイルと、MakeFileClass との対応関係を示します。
一般的なメイクファイル (vbslibではない)
Target.txt : Source1.txt Source2.txt
command
Target.txt が無いときか、Source1.txt または Source2.txt より古いときに、
command を実行します。 ただし、Source1.txt および Source2.txt に対する
ルールのコマンドを実行した後で実行します。
参考
→ Makefile
→ ロールバック
MakeFileClass では、次のように記述します。
Sub Main()
Set mk = new MakeFileClass
mk.AddRule new_Target_txt_Rule()
mk.Make
End Sub
Function new_Target_txt_Rule()
Set o = new MakeRule
o.Sources = Array( "Source1.txt", "Source2.txt" )
o.Target = "Target.txt"
Set o.Command = GetRef("Target_txt_Command")
Set new_Target_txt_Rule = o
End Function
Sub Target_txt_Command( Param, Rule )
copy_ren Rule.Sources(0), Rule.Target
End Sub
MakeFileClass
Target_txt
Target_txt
MakeRule
Source1.txt
Source2.txt
Target.txt
Target_txt
Target_txt
Target_txt
メイクファイルの図の記法 (参考)
ここでは、メイクファイルで指定された「構成」を図に表すときの記法を示します。
サンプル
Target.txt
source.txt
new_Target_txt_Rule
生成する
凡例
MakeRule を返す関数名
MakeRule の source と target の関係
MakeRule で実行するコマンド
と
の対応関係
最初に更新するファイル
File
テスト
→ T_MakeRule フォルダ
***********************************************************************
<<< MakeFileClass >>>
***********************************************************************
MakeFileClass
(src)
サンプル
→ メイクファイル
.AddRule
メイクファイルのルールを登録します。
.Make
メイクを実行します。
.Name
メイクファイルの名前。
.Delegate
ユーザー定義の委譲先オブジェクト。
.DebugMode
デバッグモード
.DebugMode_Param1
デバッグモードのパラメーター
.c
定数の集まり
***********************************************************************
<<< AddRule (MakeFileClass) >>>
***********************************************************************
AddRule (MakeFileClass)
Sub MakeFileClass::AddRule( a_MakeRule as MakeRule )
MakeRule
メイクファイルのルールを登録します。
***********************************************************************
<<< Make (MakeFileClass) >>>
***********************************************************************
Make (MakeFileClass)
Sub MakeFileClass::Make()
登録されているメイクファイルのルールに従って、メイクを実行します。
***********************************************************************
<<< Name (MakeFileClass) >>>
***********************************************************************
Name (MakeFileClass)
Dim MakeFileClass::Name as string
メイクファイルの名前。
MakeFileClass::DebugMode に MakeFileClass::c.OutDebugXML を設定するときに
表示されます。
***********************************************************************
<<< Delegate (MakeFileClass) >>>
***********************************************************************
Delegate (MakeFileClass)
Dim MakeFileClass::Delegate as variant
委譲先となるユーザー定義オブジェクト。
MakeFileClass クラスのオブジェクトを生成するときにユーザ定義オブジェクトを Delegate に格納しておくと、
MakeRule::Command で呼ばれる関数の中で、第1引数である MakeFileClass オブジェクトの
Delegate からユーザ定義オブジェクトを、参照することができるようになります。
Sub main()
Dim mk : Set mk = new MakeFileClass
mk.AddRule new_Target_txt_Rule()
mk.Delegate = "ABC"
mk.Make
End Sub
Sub Target_txt_Command( a_MakeFile, a_MakeRule )
echo a_MakeFile.Delegate
End Sub
Delegate
Delegate
***********************************************************************
<<< DebugMode (MakeFileClass) >>>
***********************************************************************
DebugMode (MakeFileClass)
Dim MakeFileClass::DebugMode as integer
Dim MakeFileClass::DebugMode_Param1 as variant
デバッグモード
DebugMode = c.OutDebugXML のとき
メイクを実行する直前に、どのコマンドがあって、どのコマンドを実行するのかを
XML で表示します。 スクリプトは、pause によって一時停止します。
DebugMode = c.BreakBeforeCommand のとき
指定の MakeRule のコマンドを実行する直前で Stop します。
DebugMode_Param1 as string
ブレークする MakeRule::Target の一部
Empty = すべて Stop する
DebugMode = c.Watch のとき
それぞれの MakeRule のコマンドを実行する前と後で、指定の関数を呼び出します。
DebugMode_Param1 as Sub
呼び出す関数。GetRef を使ってください
呼び出す関数のパラメーターは、MakeRule::Command と同じです。
Sub ( Delegate as variant, Rule as MakeRule )
c は、MakeFileClass::c で参照できる MakeFileClassConst オブジェクトです。
***********************************************************************
<<< MakeRule >>>
***********************************************************************
MakeRule
(src)
サンプル
→ メイクファイル
.Target
.Command によって作られるファイルのパス。
.Sources
.Command を実行するのに必要となるファイルのパスの配列。
.Command
Target のタイムスタンプが、Sources より新しいときに実行する関数。
.CurrentDirectory
MakeRule オブジェクトを生成したときのカレント・フォルダ。
.Delegate
委譲先となるユーザー定義オブジェクト。
.Type_
メイクルールの種類。
.c
定数の集まり
.Priority
優先度。 大きいほど優先する。
.NewestSource
最もタイムスタンプが新しい Sources のファイルパス。
.AllNewSource
ターゲットよりタイムスタンプが新しいファイルパスの配列。
***********************************************************************
<<< Target (MakeRule) >>>
***********************************************************************
Target (MakeRule)
(src)
Dim MakeRule::Target as string
.Command によって作られるファイルのパス。
または、Command が最後まで完了したら更新するファイルのパス。
相対パスをしていするとき、基準フォルダは .CurrentDirectory。
***********************************************************************
<<< Sources (MakeRule) >>>
***********************************************************************
Sources (MakeRule)
(src)
Dim MakeRule::Sources as Array of string
.Command を実行するのに必要となるファイルのパスの配列。
または、Command を起動するときに更新するファイルのパス。
相対パスをしていするとき、基準フォルダは .CurrentDirectory。
***********************************************************************
<<< Command (MakeRule) >>>
***********************************************************************
Command (MakeRule)
(src)
Dim MakeRule::Command as Sub( Delegate as variant, Rule as MakeRule )
Target のタイムスタンプが、Sources より新しいときに実行する関数。
GetRef で代入してください。
Delegate 引数は、MakeFileClass::Delegate
***********************************************************************
<<< CurrentDirectory (MakeRule) >>>
***********************************************************************
CurrentDirectory (MakeRule)
(src)
Dim MakeRule::CurrentDirectory as string
MakeRule オブジェクトを生成したときのカレント・フォルダ。
MakeRule::Target や MakeRule::Sources に格納されている相対パスの基準パス。
MakeRule::Command の関数が呼ばれる直前で、カレント・フォルダがこの値になります。
***********************************************************************
<<< Delegate (MakeRule) >>>
***********************************************************************
Delegate (MakeRule)
(src)
Dim MakeRule::Delegate as variant
委譲先となるユーザー定義オブジェクト。
MakeRule クラスのオブジェクトを生成するときにユーザー定義オブジェクトを Delegate に格納しておくと、
MakeRule::Command で呼ばれる関数の中で、第2引数である MakeRule オブジェクトの
Delegate からユーザー定義オブジェクトを、参照することができるようになります。
Function new_Target_txt_Rule()
Set new_Target_txt_Rule = new MakeRule : With new_Target_txt_Rule
.Sources = Array( "Source1.txt", "Source2.txt" )
.Target = "Target.txt"
.Delegate = "ABC"
Set .Command = GetRef("Target_txt_Command")
End With
End Function
Sub Target_txt_Command( a_MakeFile, a_MakeRule )
echo a_MakeRule.Delegate
End Sub
Delegate
Delegate
***********************************************************************
<<< Type_ (MakeRule) >>>
***********************************************************************
Type_ (MakeRule)
(src)
Dim MakeRule::Type_ as integer
メイクルールの種類。
Empty
普通のメイクルール
c.Splitter
ターゲットが存在しないときでも、コマンドを実行しないメイクルール
参考
→ オーダー調整用更新分離パス
c は、MakeRule::c で参照できる MakeFileClassConst オブジェクトです。
***********************************************************************
<<< Priority (MakeRule) >>>
***********************************************************************
Priority (MakeRule)
(src)
Dim MakeRule::Priority as integer
優先度。 大きいほど優先する。
同じ MakeRule::Target の値を持つ MakeRule が複数あるときは、その複数の中で、
MakeRule::Priority が最も大きい MakeRule::Command の関数だけが呼ばれます。
***********************************************************************
<<< NewestSource (MakeRule) >>>
***********************************************************************
NewestSource (MakeRule)
(src)
Property Get MakeRule::NewestSource() as string
最もタイムスタンプが新しい MakeRule::Sources 配列の要素。ファイルパス。
タイムスタンプを比較するタイミングは、この NewestSource プロパティを参照したときです。
***********************************************************************
<<< AllNewSource (MakeRule) >>>
***********************************************************************
AllNewSource (MakeRule)
(src)
Property Get MakeRule::AllNewSource() as Array of string
MakeRule::Sources の中で、ターゲットよりタイムスタンプが新しいファイルパスの配列。
タイムスタンプを比較するタイミングは、この AllNewSource プロパティを参照したときです。
***********************************************************************
<<< MakeRule_compare >>>
***********************************************************************
MakeRule_compare
(src)
Function MakeRule_compare( TargetPath, SourcePath ) as boolean
タイムスタンプを比較して、メイク・コマンドを実行する状況かどうかを返す。
【引数】
TargetPath
ターゲット・ファイルのパス。 メイクルールの : より左側
SourcePath
ソース・ファイルのパス。 メイクルールの : より右側
返り値
メイク・コマンドを実行する状況かどうか
サンプル
If MakeRule_compare( "dst.txt", "src.txt" ) Then
copy_ren "src.txt", "dst.txt"
End If
参考
→ タイムスタンプのテストの注意
関連
→ File::DateLastModified
→ FileSystemObject::FileExists
→ DateAddStr
***********************************************************************
<<< MakeFileClassConst >>>
***********************************************************************
MakeFileClassConst
メイクファイルに関する定数
get_MakeFileClassConst 関数、MakeFileClass::c、MakeRule::c
取得
メンバー
.Splitter (=1)
→ Type_ (MakeRule)
.OutDebugXML (=1)
.BreakBeforeCommand (=2)
→ DebugMode (MakeFileClass)
.Watch (=4)
***********************************************************************
<<< 子プロセスへの受け渡し (/ChildProcess オプション) >>>
***********************************************************************
子プロセスへの受け渡し (/ChildProcess オプション)
(src)
メイン・プロセスから、任意のデータ(例:
Err2::ErrID
)を渡し、子プロセスが終了したら
メイン・プロセスに更新された データを返す、といったようなことができます。 このような
データの受け渡しができるようにするのが、/ChildProcess オプションによる子プロセス
の機能です。 OS が定義している子プロセスとは異なります。
XMLファイル
メイン・プロセス vbslib (WSH)
子プロセス vbslib (WSH)
XMLファイル
→ メイン・プロセス側が使う ParentProcess オブジェクト、new_ParentProcess
→ 子プロセス側が使う ChildProcess オブジェクト、get_ChildProcess
→ InterProcessData インターフェース(ライブラリ用)
→ 処理フロー
→ 困ったときは (/ChildProcess)
vbslib の RunProg 関数で、vbs ファイルを起動すると、自動的に VBScript を起動するときの
コマンドライン・パラメーター
に、/ChildProcess オプションを付け、XML ファイルによるデータ
の送受信ができるようになっています。 Shell::Run などで起動すると、/ChildProcess オプション
が自動的に付かないので、明示的に指定しない限り送受信できません。
cscript sample.vbs
→
cscript sample.vbs /ChildProcess:090401,1
/ChildProcess の右の値は、テンポラリ・フォルダにできるフォルダ名の数値の部分です。
テンポラリ・ファイル名は、下記のとおりです。 %Temp% は、C:\Document 〜 に変わります。
%Temp%\Report\090401\ChildProcess_1\In.xml
%Temp%\Report\090401\ChildProcess_1\Out.xml
vbslib では、エラー処理やデバッグ用に Err2 オブジェクトの送受信を自動的に必ず行います。
/ChildProcess オプションが(自動的にでも)付くと、エラーレベル(プロセスの返り値)の値が 21
でないとエラーとみなし、メイン・プロセス側でもエラーを発生させます。
参考
→ 正常終了時の動作
VBScript でエラーを発生させるテストをするときに、/ChildProcess オプションが付くと、
Err2::ErrID (エラーが発生した番号) などの値がメイン・プロセスから継承された値となり、
Err2::ErrID の値が正しいかどうかのチェックができなくなってしまいます。 それを回避するには、
エラーを発生させるテスト・スクリプトでは、/ChildProcess:0 オプションを付けてください。(下記)
自動的に /ChildProcess オプションを付けないようにするには、/ChildProcess:0 を明示的に
指定します。
r= RunProg( "cscript sample.vbs /ChildProcess:0", "" )
参考
→ テンポラリ・フォルダ
→ テスト情報 I/F
テスト
→ [T_ChildProcess]
→ T_ChildProcess1.vbs
関連
→ TempParams.txt - C言語のプログラムにデータを渡す
***********************************************************************
<<< メイン・プロセス側が使う ParentProcess オブジェクト、new_ParentProcess >>>
***********************************************************************
メイン・プロセス側が使う ParentProcess オブジェクト、new_ParentProcess
(src)
子プロセスに、データを受け渡しするときは、new_ParentProcess_Object で生成した
ParentProcess オブジェクトを RunProg に渡します。
new_ParentProcess で生成した ParentProcess オブジェクトには、他の子プロセスと受け渡し
するファイルの名前が重複しない番号が m_FileID に入っています。 複数の子プロセスを
平行して同時に動かすときは、ParentProcess オブジェクトをもう1つ生成してください。
前の子プロセスが終わってから次の子プロセスを動かすときは、同じ ParentProcess
オブジェクトが使えます。
使用サンプル:
sample.Name = "A" : sample.Value = 1
'// 子プロセス起動前に、送るオブジェクトをXMLファイルに変換する
Dim pr : new_ParentProcess_Object pr, Empty '//[out] pr as ParentChildProcess
pr.m_OutFile.WriteLine sample.xml
'// 子プロセスを起動する
Dim r : r= RunProg( "cscript.exe T_ChildProcess1_Sub.vbs", pr )
CheckTestErrLevel r
'// 子プロセス終了後に、戻されたXMLファイルをオブジェクトに戻す
sample.loadXML pr.m_InXML.selectSingleNode( _
TypeName( sample ) +"[@name='"+ sample.Name +"']" )
xml
pr
ParentProcess オブジェクトのメンバー
Class ParentChildProcess
Public m_OutFile 'as TextStream (Write) ... 子プロセスへ渡す XML ファイル
Public m_InXML 'as IXMLDOMElement ... メイン・プロセスに戻される ルートXML要素
Public m_TempPath ' as string. 送受信ファイルができるフォルダのパス
Public m_DateID ' as string. 例:"090401". /ChildProcess オプションに渡す値
Public m_FileID ' as string. 例:"1". /ChildProcess オプションに渡す値
End Class
***********************************************************************
<<< 子プロセス側が使う ChildProcess オブジェクト、get_ChildProcess >>>
***********************************************************************
子プロセス側が使う ChildProcess オブジェクト、get_ChildProcess
(src)
vbs_inc モジュールは、vbslib をインクルードする前に自動的に /ChildProcess オプションがあるかどうかを
判定し、あれば ChildProcess オブジェクトを生成します。 ChildProcess オブジェクトは、get_ChildProcess
関数で取得できる
静的オブジェクト
であり、メインプロセスからの情報を m_InXML から入力し、
メインプロセスへ戻す情報を、m_OutFile に出力することができます。
/ChildProcess オプションがないときは、get_ChildProcess 関数が、Nothing オブジェクトを返します。
使用サンプル:
Dim pr, sample
'// プログラム開始時に、送られてきたXMLファイルをオブジェクトに戻す
Set pr = get_ChildProcess() ' as ParentChildProcess
new_ObjectFromStream sample, "SampleClass", pr
'// main
If not IsEmpty( sample ) Then
sample.Value = 2
End If
'// プログラム終了時に、戻すオブジェクトをXMLファイルに変換する
If not pr is Nothing Then
If not IsEmpty( sample ) Then pr.m_OutFile.WriteLine sample.xml
End If
xml
ChildProcess オブジェクトのメンバー
Class ParentChildProcess
Public m_InXML 'as IXMLDOMElement ... メイン・プロセスから渡される ルートXML要素
Public m_OutFile 'as TextStream (Write) ... メイン・プロセスへ戻す XML ファイル
Public m_TempPath ' as string. 送受信ファイルができるフォルダのパス
Public m_DateID ' as string. 例:"090401". ファイル名の一部
Public m_FileID ' as string. 例:"1". ファイル名の一部
End Class
参考
→ XPath
→ xml プロパティ
***********************************************************************
<<< InterProcessData インターフェース(ライブラリ用) >>>
***********************************************************************
InterProcessData インターフェース(ライブラリ用)
ライブラリが自動的に子プロセスに受け渡しをするオブジェクトに必要なインターフェースです。
Class InterProcessData '// defined_as_interface
Public Sub OnCallInParent( a_ParentProcess as ParentChildProcess ) : End Sub
Public Sub loadXML( XmlObject as IXMLDOMElement ) : End Sub
Public Sub OnReturnInChild( a_ChildProcess as ParentChildProcess ) : End Sub
Public Sub OnReturnInParent( a_ParentProcess as ParentChildProcess ) : End Sub
End Class
Function new_InterProcessData()
Set new_InterProcessData = new InterProcessData
End Function
参考
→ T_ChildProcess2_include.vbs
子プロセスに渡すオブジェクトは、g_InterProcess.m_Data as ArrayClass に登録してください。
'// 子プロセスと送受信するオブジェクトを登録する
Dim sample : Set sample = new SampleClass '// has_interface_of InterProcessData
g_InterProcess.m_Data.Add sample
参考
→ T_ChildProcess2.vbs
子プロセスのライブラリの初期化(vbslib モジュールのグローバル・初期化関数)で、
get_ChildProcess as ParentChildProcess から、new_ObjectFromStream などを使って、
オブジェクトを受け取ってください。 メイン・プロセスに渡すオブジェクトは、
g_InterProcess.m_Data as ArrayClass に登録してください。
Dim g_Sample
Sub InitializeModule_Sample '// vbslib モジュールのグローバル・初期化関数
'// NewChildProcessOnStart の後で
new_ObjectFromStream g_Sample, "SampleClass", get_ChildProcess()
If not IsEmpty( g_Sample ) Then g_InterProcess.m_Data.Add g_Sample
End Sub
参考
→ T_ChildProcess2_Sub.vbs
→ グローバル変数の初期化、後始末、g_InitializeModule、g_FinalizeModule
テスト
→ T_ChildProcess2.vbs
***********************************************************************
<<< g_InterProcess オブジェクト >>>
***********************************************************************
g_InterProcess オブジェクト
(src)
メイン・プロセスと子プロセスで共有する変数です。
Dim g_InterProcess ' as InterProcess
Class InterProcess
Public Property Get ProcessCallID '// as ArrayClass of integer
Public InterProcessUserData '// as string
End Class
.ProcessCallID ' as ArrayClass of integer
ProcessCallID(0) = メイン・プロセスが子プロセスを起動した回数。
ProcessCallID(1) = 子プロセスが孫プロセスを起動した回数。
ライブラリのデータを格納後、g_InterProcess のデータを格納直前に、
+1されます。
→ 処理フロー (/ChildProcess オプション)
.InterProcessUserData as string
アプリケーション・ユーザーがデバッグ用に使えます
テスト
→ [T_ChildProcessID] ProcessCallID や InterProcessUserData
***********************************************************************
<<< 処理フロー (/ChildProcess オプション) >>>
***********************************************************************
処理フロー (/ChildProcess オプション)
メイン・プロセス起動
InitializeModule (vbslib.vbs)
Set g_InterProcess = new InterProcess
InitializeModule (vbslib.vbs または 任意の.vbs)
g_InterProcess.InterProcessDataArray.Add
LibData
プロセスが変わるときにコールバック
するように登録する
main
new_ParentProcess
アプリケーションがやり取りするときのみ呼び出す
ParentProcess.m_OutFile.WriteLine
AppData.xml
アプリケーションからの出力
ParentProcess
(src)
RunProg
If TypeName( ParentProcess ) <> "ParentChildProcess" Then new_ParentProcess
ParentProcess.OnCallInParent
(src)
g_InterProcess.OnCallInParent
(src)
InterProcessData.OnCallInParent
ParentProcess.m_OutFile.WriteLine
LibData
ライブラリからの出力
InterProcessData.ProcessCallID + 1
ProcessCallID を+1する
ParentProcess.m_OutFile.WriteLine
g_InterProcessからの出力
Shell::Exec
In.xml
子プロセス起動
(VBScript global code)
参考
→ 処理フロー (vbs_inc/setting)
InitializeModule (vbslib.vbs)
new_ChildProcess_ifChildProcess
(src)
If WScript.Arguments.Named.Item("ChildProcess") Then
Set g_ChildProcess = m
Set m_InXML = LoadXML( "In.xml" )
InterProcess.OnCallInSub
g_InterProcessへの入力
InitializeModule (vbslib または 任意の.vbs)
new_ObjectFromStream
ライブラリへの入力
g_InterProcess.m_Data.Add
LibData
プロセスが変わるときにコールバックするように登録する
main
get_ChildProcess
new_ObjectFromStream
AppData, ChildProcess
アプリケーションへの入力
:
子プロセスのメイン処理
:
ChildProcess.m_OutFile.WriteLine
AppData
アプリケーションからの出力
ResumePop or FinalizeInModulesCaller::Class_Terminate
CallFinalizeInModules
FinalizeModule [vbslib.vbs]
Err2.OnSuccessFinish
エラー関係の調整
ChildProcess.Finish
(src)
(src)
InterProcess.OnReturnInChild
ChildProcess.m_OutFile.WriteLine
g_InterProcessからの出力
InterProcessData.OnReturnInChild
ChildProcess.m_OutFile.WriteLine
ライブラリからの出力
Err2 はここ
子プロセス終了
Out.xml
ParentProcess.OnReturnInParent
(src)
Set m_InXML = LoadXML( "Out.xml" )
InterProcess.OnReturnInParent
(src)
InterProcess.loadXML
g_InterProcessへの入力
InterProcessData.OnReturnInParent
new_ObjectFromStream
ライブラリへの入力
AppData.loadXML
アプリケーションへの入力
ParentProcess.Class_Terminate
(src)
受け渡しに使った XML ファイルを削除する
***********************************************************************
<<< 困ったときは (/ChildProcess) >>>
***********************************************************************
困ったときは (/ChildProcess)
受け渡しの内容を確認するには
下記の XML ファイルを確認してください。
ただし、ParentProcess オブジェクトが削除されたら、XML ファイルも削除されるので注意してください。
%Temp%\Report\090401\ChildProcess_1\In.xml
%Temp%\Report\090401\ChildProcess_1\Out.xml
参考
→ 子プロセスへの受け渡し (/ChildProcess オプション)
アプリケーションからデータが送れない
RunProg の第2引数に、ParentProcess オブジェクトを指定しているか確認してください。
***********************************************************************
<<< GetCScriptGUI_CommandLine >>>
***********************************************************************
GetCScriptGUI_CommandLine
(src)
Function GetCScriptGUI_CommandLine( Parameters as string ) as string
ダブルクリックしたときに、vbslib のコマンド・プロンプトを開くコマンドラインを返します。
【引数】
Parameters
cscript.exe に渡すパラメーター
返り値
コマンドライン
Windows のバージョンによって、返り値の内容は変わります。
サンプル
command_line = GetCScriptGUI_CommandLine( "sample.vbs" )
Assert command_line = _
"""%windir%\System32\cmd.exe"" /K (""%windir%\SysWOW64\cscript.exe"" sample.vbs)"
環境変数を展開するときは、
→ env
***********************************************************************
<<< GetEditorCmdLine >>>
***********************************************************************
GetEditorCmdLine
(src)
GetSearchOpenCmdLine
(廃止予定)
Function GetEditorCmdLine( PathAndFragment as string ) as string
Function GetSearchOpenCmdLine( PathAndFragment as string ) as string
(廃止予定)
テキスト・エディターを起動するコマンドラインを返します。
【引数】
PathAndFragment
テキストファイルへのパスと行番号またはキーワード
返り値
コマンドライン
Setting_getEditorCmdLine
の設定が反映されます。
PathAndFragment には、タグジャンプ形式の文字列(パス+行番号、または、パス+行内容)
を指定できます。 形式については下記のサンプルを参照してください。
返り値に含まれるファイル・パスは、フル・パスになります。
サンプル:
File1.txt を開きます
start GetEditorCmdLine( "File1.txt" )
サンプル:
File1.txt の10行目を開きます
start GetEditorCmdLine( "File1.txt(10)" )
start GetEditorCmdLine( "File1.txt:10" )
サンプル:
File1.txt を開いて "[Func1]" を含む行にジャンプします
start GetEditorCmdLine( "File1.txt#[Func1]" )
start GetEditorCmdLine( "File1.txt:[Func1]" )
キーワードの直前の文字がコロン ( : ) のときは、数字のみのキーワードを指定できません。
テキストファイルを開くエディタは、
Setting_getEditorCmdLine
関数を定義することで変更でき
ます。 Setting_getEditorCmdLine の i=2、i=3 のどちらかに対応すれば、指定の行へジャンプ
できます。 i=0、i=1 のどちらかに対応していれば、ファイルを開くことだけはできます。
GetSearchOpenCmdLine は廃止予定です。 GetEditorCmdLine を使ってください。
参考
→ タグジャンプ - テキストエディタ Apsaly (Web)
関連
→ GetTagJumpParams
タグジャンプ形式のパスの解析
→ Setting_openFolder
フォルダーを開く
***********************************************************************
<<< GetDiffCmdLine, GetDiffCmdLine3 >>>
***********************************************************************
GetDiffCmdLine, GetDiffCmdLine3
(src)
Function GetDiffCmdLine( PathA as string, PathB as string ) as string
Function GetDiffCmdLine3( PathA as string, PathB as string, PathC as string ) as string
Diff ツールを起動するコマンドラインを返します。
Setting_getDiffCmdLine
の設定が反映されます。
サンプル
start GetDiffCmdLine( "file1.txt", "file2.txt" )
サンプル
file1.txt、file2.txt、file3.txt を表示する
start GetDiffCmdLine3( "file1.txt", "file2.txt", "file3.txt" )
設定されている Diff ツールが3つのファイルを同時に比較することができないときは、
3つのファイルのうち、比較する2つのファイルを選択するスクリプト diff3to2.vbs を
起動するコマンドラインを返します。
サンプル
file1.txt の 5行目と、それに対応する file2.txt を表示する
start GetDiffCmdLine( "file1.txt(5)", "file2.txt" )
設定されている Diff ツールが行番号指定に対応していないときは、5行目ではなく先頭の
行を表示します。
返り値の例:
"C:\Program Files\Diff.exe" "C:\FileA.txt" "C:\FileB.txt"
サンプル
相対パスを1つ入力して、Diff を開くプロンプト
Dim folder_a, folder_b, step_path
folder_a = "C:\folder_a\"
folder_b = "C:\folder_b\"
Do
echo ""
echo "2つのフォルダーの中にあるテキストファイルを Diff で表示します"
echo folder_a
echo folder_b
echo ""
echo "Enter のみ : 終了"
step_path = input( "共通の相対パス >" )
If step_path = "" Then Exit Do
start GetDiffCmdLine( GetFullPath( step_path, folder_a ), _
GetFullPath( step_path, folder_b ) )
Loop
参考
→ DiffCUI
***********************************************************************
<<< DiffCUI >>>
***********************************************************************
DiffCUI
Sub DiffCUI( FilePaths as array of string, FileLabels as array of string )
Diff ツールがないときに、コマンドラインだけで使える比較ツール。
【引数】
FilePaths
比較するファイル パスの配列
FileLabels
比較するファイルの役割名の配列
Diff ツールで開くファイルのパスをテストでチェックするとき
DiffCUI は、比較しているそれぞれのファイルを開くメニューがあり、
テキストエディターで開くファイルのパスをテストでチェックする
方法と組み合わせれば、Diff ツールで開くファイルのパスをチェックできます。
参考
→ _src\Test\tools\T_SyncFiles\SettingForTest.vbs
ソース
→ vbslib.vbs
テスト
→ T_SyncFiles.vbs
関連
→ GetDiffCmdLine, GetDiffCmdLine3
→ DiffCUI_InCurrentProcess
***********************************************************************
<<< DiffCUI_InCurrentProcess >>>
***********************************************************************
DiffCUI_InCurrentProcess
Function DiffCUI_InCurrentProcess( CommandLine as string )
start
に
InCurrentProcessFunc
を指定して、
DiffCUI
を呼び出すために経由する関数。
ソース
→ PC_setting_default.vbs
***********************************************************************
<<< Sleep >>>
***********************************************************************
Sleep
(src)
Sub Sleep( msec as integer )
指定した時間だけ待ちます。
【引数】
msec
待つ時間(ミリ秒)
サンプル:
Sleep 1000
サンプル:
Dim n : For n = 5 To 1 Step -1 : echo n : Sleep 1000 : Next : echo 0
5秒のカウントダウン
関連
→ timeout (バッチファイル)
***********************************************************************
<<< WaitForFile >>>
***********************************************************************
WaitForFile
(src)
Function WaitForFile( Path as string ) as string
指定したファイルが作られるまで待ちます。
【引数】
Path
待つファイルのパス
返り値
ファイルの1行目の内容(末尾に改行文字なし)
サンプル:
WaitForFile "Result.txt"
何かの処理(前処理)が終わってから行う処理があるときに使います。
前処理が終わるときに、終わったことを示すファイルを作るようにすれば、
本関数が使えるようになります。
本関数から抜ける直前で、対象のファイルを削除します。
エラーを発生させるファイルを作る
WaitForFile で待っているファイルが、XML 形式のテキストで、ルートのタグが
のときは、WaitForFile の内部からエラーを発生させます。
作成するファイルの例
上記の場合、Err オブジェクトの内容は、次のようになります。
Assert Err.Number = 3
Assert Err.Description = ""
通信の注意
同期に使うファイルは、2つのスレッド(クライアントとサーバー)で別のファイル名にしてください。
そうしないと、自分が作成(送信)したファイルを待つ(受信する)形になり、待たないことに
なってしまうからです。
送信ファイルを作成する前に、受信したファイルを削除してください。
そうしないと、相手が次の受信ファイルを先に作ってしまい、そのファイルを削除してしまう
からです。 また、前の通信の残りがあるときでも正しく動くように、クライアントは、前の受信
ファイルを削除してから、送信ファイルを作成してください。
複数のプロセスで通信をするときは、同期に使用するファイルを最終的に
削除する責任を持つ
形にしてください。 そうしないと、同期に使用するファイルを相手に通知する
前に削除してしまう可能性が生まれて、サブ・スレッドが永遠に待ち続ける
ことになってしまいます。
ホスト側が WaitForFile で待って通信を終える
メイン・スレッド (クライアント)
サブ・スレッド (サーバー)
起動
WaitForFile
CreateFile
CreateFile で終えると
(busy)
delete
終了
WaitForFile
待ち続ける...
テスト
→ T_Call_Target.vbs # [T_WaitForFile]
関連
→ CreateFile
→ FileT_wait (clib)
→ OnTime (Excel)
***********************************************************************
<<< WaitForProcess >>>
***********************************************************************
WaitForProcess
(src)
Sub WaitForProcess( ProcessName as string )
指定したプロセスが終了するまで待ちます。
【引数】
ProcessName
実行ファイル名
ファイル:
System.vbs
サンプル
WaitForProcess "notepad.exe"
テスト
→ T_Process.vbs # [T_WaitForProcess]
***********************************************************************
<<< EnumProcesses >>>
***********************************************************************
EnumProcesses
(src)
Function EnumProcesses() as dictionary of ArrayClass of integer
プロセスを一覧します。
【引数】
返り値
プロセスの一覧。 実行ファイル名をキーとする PID の配列の辞書
ファイル:
System.vbs
サンプル
Dim ps : Set ps = EnumProcesses()
echo ps.Item( "notepad.exe" ) '// ArrayClass of PID
If not ps.Exists( "notepad.exe" ) Then '// ps.Item( "notepad.exe" ).Count = 0 は不可
start "notepad.exe"
ElseIf ps.Item( "notepad.exe" ).Count >= 2 Then
echo "There are 2 processes."
End If
参考
→ tasklist (バッチファイル)
テスト
→ T_Process.vbs # [T_Processes]
***********************************************************************
<<< KillProcess >>>
***********************************************************************
KillProcess
(src)
Sub KillProcess( Process as integer or string )
プロセスを強制終了します。
【引数】
Process
プロセスの PID、または、実行ファイル名
ファイル:
System.vbs
実行ファイル名を指定した場合、その実行ファイルから作られたすべての
インスタンスが強制終了します。
サンプル
KillProcess "notepad.exe"
参考
→ taskkill (バッチファイル)
テスト
→ T_Process.vbs # [T_Processes]
***********************************************************************
<<< その他 >>>
***********************************************************************
その他
→ IsDefined
指定したシンボルの関数が定義されているかどうかを返します。
***********************************************************************
<<< 自動テスト、開発環境 >>>
***********************************************************************
自動テスト、開発環境
プログラムが大きくなるほど、テスト(回帰テスト)の自動化が重要になります。
→ テスト・プロンプト (Test.vbs)
→ テスト支援機能 (関数)
→ 開発環境操作
関連
→ エラー処理 (Err2)
→ FCBat テストツール
→ テストツール
→ テストツールの接続場所
→ テスト駆動開発(TDD)を学ぶ (Web)
→ vbslib のテスト仕様
***********************************************************************
<<< テスト・プロンプト (Test.vbs) >>>
***********************************************************************
テスト・プロンプト (Test.vbs)
(src: TestPrompt)
(src: Tests)
Test.vbs ファイルに記述されたコールバック関数(Test_build, Test_setup, Test_start,
Test_check, Test_clean)を呼び出すプロンプトです。 サブ・フォルダーにある Test.vbs
ファイルに記述されたコールバック関数も呼び出します。
Test.vbs をダブルクリックして起動します。
Test Prompt [ALL]
test vbs = Test.vbs
base folder = C:\home\vbslib
1. Select the Test (current test = ALL)
2. Do ALL Test
3. | call each "Test_build" in sub folders
4. | call each "Test_setup" in sub folders
5. | call each "Test_start" in sub folders
6. | call each "Test_check" in sub folders
7. | call each "Test_clean" in sub folders
8. Change the Debug Mode (debug script=False, target=False)
88.Open Fail Folder
89.Next Fail
9. Quit
→ メニュー項目
Change the Debug Mode
テスト・プロンプトのトップメニュー
Test.vbs
→ メニュー項目の動作
→ テスト・フォルダーの構成
→ Test.vbs
単体のテスト・スクリプト
→ TestCommon.vbs
→ TestCommon_Data.xml
→ Test.vbs のコマンドライン・オプション
→ Fail したとき
→ サブフォルダの関数の呼び出し順序
→ 処理フロー
→ データ構造
→ TestPrompt_Setting.vbs
プロンプトの設定
テスト
→ テスト・プロンプトのテスト
関連
→ 処理フロー (Test.vbs)
→ データ構造 (Test.vbs)
→ テスト・スクリプト ver2
***********************************************************************
<<< メニュー項目の動作 >>>
***********************************************************************
メニュー項目の動作
[ 親: テスト・プロンプト Test.vbs ]
テストプロンプトのメニューから選んだときのデフォルトの動作を説明します。
1. Select the Test
実行するテスト項目(
Test.vbs
、または、Test.vbs があるフォルダー)を選択します。
ALL を選択すると、すべてのテスト項目(すべてのサブ・フォルダー)を実行します。
「order」 と入力すると、
サブフォルダの関数の呼び出し順序
と
CurrentTestPriority
が表示されます。
2. Do ALL Test
Test.vbs
の Test_build, Test_setup, Test_start, Test_check, Test_clean を呼び出します。
Test_current は、Test_build などそれぞれを呼び出す前に呼び出します。
→ サブフォルダの関数の呼び出し順序
→ Tests::DoAllTest
3. call each "Test_build" in sub folders
Test.vbs
の Test_current と Test_build を呼び出します。
→ Tests::DoTest
4. call each "Test_setup" in sub folders
Test.vbs の Test_current と Test_setup を呼び出します。
5. call each "Test_start" in sub folders
Test.vbs の Test_current と Test_start を呼び出します。
6. call each "Test_check" in sub folders
Test.vbs の Test_current と Test_check を呼び出します。
7. call each "Test_clean" in sub folders
Test.vbs の Test_current と Test_clean を呼び出します。
8. Change the Debug Mode
→ デバッグモード
88. Open Fail Folder
エラーがあった Test.vbs があるフォルダーを開きます
89. Next Fail
次にエラーがあった Test.vbs があるフォルダーを開きます
***********************************************************************
<<< デバッグモード >>>
***********************************************************************
[ マップ ]
デバッグモード
テスト・プロンプトのトップメニューで、Change the Debug Mode を選ぶと次のメニューが出ます。
1) Reload Test Script
2) ChgDebugMode Test Script
3) ChgDebugMode Test Target
4) Echo On/Off (current=on)
5) AutoDiff (current=on)
Reload Test Script
ChgDebugMode Test Script
ChgDebugMode Test Target
Echo On/Off
AutoDiff
1) Reload Test Script
Reload Test Script は、TestPrompt.vbs や、TestPrompt_Setting.vbs を変更したときに
選択します。 選択すると再読み込みします。
Test.vbs は、トップメニューから Test.vbs を呼び出すときに、毎回再読み込みするので、
Test.vbs を変更したときは、このメニュー(Reload Test Script)を選ぶ必要はありません。
2) ChgDebugMode Test Script
ChgDebugMode Test Script は、TestPrompt.vbs と Test.vbs をデバッガに接続します。
Test.vbs の先頭で下記のように記述すると、このメニューを選ばなくても、自動的にこの
モードで実行を開始し、5番のメニューを自動的に実行します。
'--- start of parameters for starting main script
g_debug = 1
:
Sub main2( Opt, AppKey ):set_input "5." ....
1
5.
Test.vbs をデバッグするときは、更に Test.vbs の中に Stop 文を入れてください。
Sub Test_start( tests )
Stop
If ... Then Fail
Pass
End Sub
Stop
3) ChgDebugMode Test Target
ChgDebugMode Test Target は、テスト対象をデバッガに接続します。
Test.vbs の先頭で次のように記述すると、自動的にこのモードで実行を開始し、
5番のメニューを自動的に実行します。
'--- start of parameters for starting main script
g_option = "/target_debug:1 /set_input:5."
ただし、Test.vbs の関数の引数 tests の bTargetDebug メンバ変数が True に
変わるだけなので、Test.vbs の中で対応する必要があります。
If tests.bTargetDebug Then
'// デバッガに接続するコマンド
Else
'// 通常のコマンド
End If
VBScript の呼び出しを、デバッガ接続に対応した例:
If tests.bTargetDebug Then dbg = "//x " Else dbg = ""
r = RunProg( "cscript "+dbg+target+" /Test:"+tname, "" )
4) エラー・ブレークを有効にする
テスト・スクリプトでも通常の方法でエラーが発生した場所でブレークできます。
参考
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
エラーが発生する場所が安定しないときは、エラー・ブレークを有効にしてください。
エラーが発生してもテストの続きを実行しなくなりますが、エラーが発生したところで
ブレークします。
注意: Pass 関数を呼び出したときもブレークしてしまいます。
5) AutoDiff
→ AutoDiff モード
関連
→ g_debug 変数
→ input
… /set_input オプションが使われる関数
***********************************************************************
<<< テスト・フォルダーの構成 >>>
***********************************************************************
テスト・フォルダーの構成
[ 親: テスト・プロンプト Test.vbs ]
テスト・スクリプトは、scriptlib フォルダを含むルートフォルダのサブフォルダなら、
どのフォルダにでも置くことができます。
テスト・スクリプトのファイル名は、Test.vbs にしてください。
Test.vbs をダブルクリックすると、テスト・プロンプトが開きます。
→ Test.vbs
Test
Test.vbs
… ユニット・テスト 全体
TestCommon.vbs
… 全ユニット・テストに共通のスクリプト
TestCommon_Data.xml
… 全ユニット・テストに共通の設定データ
T_UnitTest1
… テストシンボル名と同じ名前のフォルダ
Test.vbs
… "T_UnitTest1" のユニット・テスト
scriptlib
vbslib
TestPrompt.vbs
… テスト・プロンプト・モジュール
TestScript.vbs
… テスト・スクリプト・モジュール
setting_default
TestPrompt_Setting.vbs
… テスト・プロンプトの設定
Test.vbs をダブルクリックすると、サブフォルダの Test.vbs も、テスト・プロンプトに
登録されます。 カレント・テストが ALL なら、サブフォルダも含めて Test_setup などが
呼ばれます。 デバッグ・モードのときは、デバッグ・モードになっている Test.vbs を
サブフォルダも含めて呼ばれます。
→ サブフォルダの関数の呼び出し順序
***********************************************************************
<<< Test.vbs >>>
***********************************************************************
[ マップ ]
[ 親: テスト・プロンプト Test.vbs ]
Test.vbs
(src)
単体テストを実行するスクリプトです。
ダブルクリックすると、
テスト・プロンプト
が開きます。
用意された関数
の内容を記述することで作成します。
テスト・プロンプトから、サブ・フォルダーにある大量の Test.vbs を自動的に実行することが
できます。 ファイル名を TestSample.vbs に変えたら、サブ・フォルダーにある TestSample.vbs
を自動的に実行します。
RunTestPromptConfigClass
::ExpectedPassConutに予想される Pass の数を設定しておくと
よいでしょう。
Test.vbs のテンプレート
vbslib_pack\sample\TestPrompt
T_Run
汎用のサンプル
T_RunFCVbs
FCVbs
を経由するテストのサンプル
T_RunPrompt
テストプロンプトをテストするサンプル
T_RunVBS
VBS をテストするサンプル
Test.vbs に記述する関数
Main
RunTestPrompt
を呼び出してください。
Test_current
Test_build などをコールバックする前にコールバックされる関数。
Test_build
テスト対象をビルドします。
Test_setup
テストデータを作成します。
Test_start
テストを実行します。 複数の項目を実行するときはチェックもします。
Test_check
Test_start がすべて完了後、テストの出力が正しいかチェックします。
エラー処理のテストは、Test_start で行います。
Test_clean
テストで出力されたファイルを削除します。
引数は、
Tests クラス
です。(上記の関数はどれも引数は同じ)
Sub Test_start( tests as Tests )
上記の関数は、
TestScript::Do_
から呼ばれます。 Fail したときの動きは、
Do_ の仕様に従います。
Test.vbs の Test_current には、デバッグを行う1つのサブテストケースを
tests.SetCur で指定します。
Test.vbs
サンプル
→ Test.vbs
Option Explicit
Sub Main( Opt, AppKey ):RunTestPrompt AppKey.NewWritable( "." ):End Sub
Sub Test_current( tests )
tests.SetCur "Sub1"
End Sub
Sub Test_build( tests )
If tests.IsCur("Sub1") Then echo tests.Symbol+" - Test_build Sub1"
If tests.IsCur("Sub2") Then echo tests.Symbol+" - Test_build Sub2"
Pass
End Sub
Sub Test_setup( tests )
Pass
End Sub
Sub Test_start( tests )
RunProg "target.exe", "Sample_log.txt"
Pass
End Sub
Sub Test_check( tests )
Fail
End Sub
Sub Test_clean( tests )
Skip "test skip"
End Sub
テスト
→ T_TestScName フォルダ
Test.vbs から改名するテスト
関連
→ GetMainSetting 関数 (vbsool)
→ アプリケーション (vbslib付属)
***********************************************************************
<<< Test_current >>>
***********************************************************************
Test_current
Sub Test_current( tests as Tests )
Test_build などをコールバックする前にコールバックされる関数。
下記のようなことができます。
・Tests.vbs のグローバル変数(の代わり)を初期化します。
→ UnitTest::Delegate
・他の Tests.vbs と、コールバックされる順番を調整します。
Sub Test_current( tests )
tests.CurrentTestPriority = 500
End Sub
CurrentTestPriority
・テスト・シンボルを設定します。
Sub Test_current( tests )
tests.Symbol = "T_SubTest"
End Sub
Symbol
"Already defined test symbol" エラー
が出るときは、
上記のように Symbol 変数の値を変更してください。
・デバッグするサブテストケースを選択します。
Sub Test_current( tests )
tests.SetCur "Sub1"
End Sub
SetCur
***********************************************************************
<<< UnitTest::Delegate >>>
***********************************************************************
UnitTest::Delegate
Dim UnitTest::Delegate as variant
UnitTest
ユーザ向けの、任意の値やオブジェクトを格納する変数。
Tests.vbs のグローバル変数の代わりです。
(Tests.vbs は、ExecuteGlobal を何度も行われるため、グローバル変数を置くことができません。)
サンプル in Test.vbs:
RunTestPrompt を実行する場合は、Delegate を使う
Sub Main( Opt, AppKey )
'// Set g = GetTemporaryTestsObject().CurrentTest.Delegate
RunTestPrompt AppKey.NewWritable( "." )
End Sub
Sub Test_current( tests )
If IsEmpty( tests.CurrentTest.Delegate ) Then
Set g = CreateObject( "Scripting.Dictionary" ) : Set tests.CurrentTest.Delegate = g
'// call_vbs SearchParent("TestCommon.vbs"), "TestCommon_setVariables", g
'[Setting]
'==============================================================================
g("ExeName") = "Sample"
If IsEmpty( g("Config") ) Then g("Config") = "Release"
'==============================================================================
x = WScript.Arguments.Named( "Config" ) : If not IsEmpty( x ) Then g("Config") = x
End If
End Sub
Sub Test_build( tests )
Set g = tests.CurrentTest.Delegate
devenv_rebuild g("ExeName")+".sln", g("Config")
End Sub
Delegate
TestCommon.vbs
TestCommon_setVariables
ExeName
Sample
Delegate
ExeName
サンプル in TestTarget.vbs:
RunTestPrompt を実行しない場合は、Delegate を使わない
Dim g_g : Sub GetMainSetting( g ) : If not IsEmpty(g_g) Then Set g=g_g : Exit Sub
Set g=CreateObject("Scripting.Dictionary") : Set g_g=g
TestCommon_setVariables g '// g("Config")
'[Setting]
'==============================================================================
g("ExeName") = "Sample"
'==============================================================================
End Sub
Sub Main()
include SearchParent("TestCommon.vbs") '// TestCommon_setVariables
Dim g : GetMainSetting g
devenv_rebuild g("ExeName")+".sln", g("Config")
End Sub
TestCommon_setVariables
ExeName
Sample
TestCommon.vbs
TestCommon_setVariables
ExeName
TestCommon.vbs
の中の TestCommon_setVariables 関数 のサンプル:
'********************************************************************************
' <<< [TestCommon_setVariables] >>>
'********************************************************************************
Dim g_TestCommon_ConfigInited
Sub TestCommon_setVariables( g )
AssertExist env("%SAMPLEROOT%") '// 環境変数をチェックする
g("LocalConfig") = "Debug" '// g はテスト(Test.vbs)ごとに存在する UnitTest::Delegate
If IsEmpty( g_TestCommon_ConfigInited ) Then '// プロセスごとの設定
Dim xx : Set xx = ReadTestCase( SearchParent("TestCommon_Data.xml"), Empty )
set_ "Config", xx("Config")
g_TestCommon_ConfigInited= True
End If
End Sub
AssertExist
g("LocalConfig") = "Debug"
ReadTestCase
TestCommon_Data.xml
"Config", xx("Config")
コールツリー (Test.vbs)
RunTestPrompt
Tests::DoAllTest
Test_current
// テストごとに異なる UnitTest::Delegate
TestCommon_setVariables
// 全テストに共通の UnitTest::Delegate など
コールツリー (一般スクリプト)
main
GetMainSetting
// スクリプト・ファイルごとに異なる UnitTest::Delegate
TestCommon_setVariables
// 全スクリプト共通の UnitTest::Delegate など
テスト
→ Test_template1.vbs # Delegate
関連
→ GetMainSetting 関数 (vbsool)
→ TestCommon.vbs
***********************************************************************
<<< TestCommon.vbs >>>
***********************************************************************
[ 親: テスト・プロンプト Test.vbs ]
TestCommon.vbs
サブ・フォルダーにある Test.vbs に共通するスクリプトを記述します。
ライブラリにするほど汎用的ではないが、複数のテストで使われる関数などを記述します。
Test.vbs
Sub main2( Opt, AppKey )
RunTestPrompt AppKey.NewWritable( "." )
End Sub
Sub Test_current( tests )
If IsEmpty( tests.CurrentTest.Delegate ) Then
Dim g : Set g = CreateObject( "Scripting.Dictionary" ) : Set tests.CurrentTest.Delegate = g
call_vbs SearchParent("TestCommon.vbs"), "TestCommon_setVariables", g
End If
End Sub
Sub Test_start( tests ) : TestCommon_test_start tests : Pass : End Sub
TestCommon.vbs
Sub TestCommon_setVariables( g )
Set g("GlobalTestObject") = new SampleTest
End Sub
Sub TestCommon_test_start( tests )
'// 複数のテストで行う処理
End Sub
TestCommon_setVariables
関連
→ GetMainSetting 関数 (vbsool)
***********************************************************************
<<< グローバル・テスト・オブジェクト, SampleTest >>>
***********************************************************************
グローバル・テスト・オブジェクト, SampleTest
TestCommon.vbs
で定義する TestCommon_setVariables 関数で、グローバル・テスト・
オブジェクトを生成し、
UnitTest::Delegate
から参照します。
Sub Test_build( tests )
Dim g : Set g = tests.CurrentTest.Delegate
RunProg """"+ g("GlobalTestObject").ExePath +"""", ""
End Sub
Sub TestCommon_setVariables( g )
Set g("GlobalTestObject") = new SampleTest
End Sub
***********************************************************************
<<< TestCommon_Data.xml >>>
***********************************************************************
[ 親: テスト・プロンプト Test.vbs ]
TestCommon_Data.xml
テストに関する情報をまとめたデータ・ファイルです。
ダブルクリックする Test.vbs と同じフォルダーに TestCommon_Data.xml を作成してください。
TestSymbols 属性
Test.vbs の
2. Do ALL Test
を選んだときに実施するテストを選択します。
実施するテストのシンボルを CSV 形式で指定してください。
Test.vbs の
シンボルが多いときは、改行を入れることができます。
1. Select the Test
を選ぶと、シンボルを一覧できます。
この属性が無いときは、サブ・フォルダーにある全てのテストを実施します。
参考
→ Tests::LoadTestSet
TestScriptFileName 属性
TestScriptFileName 属性に、Test.vbs のファイル名を指定すると、そのファイル名から
起動した場合のみ、有効になります。
TestScriptFileNameExcepted 属性
TestScriptFileNameExcepted 属性に、Test.vbs のファイル名を指定すると、その
ファイル名「以外」から起動した場合のみ、有効になります。
その他、オリジナル属性
テスト固有のオリジナル属性を、TestCommon_Data.xml に含めることができます。
参考
→ TestCommon.vbs の中の TestCommon_setVariables 関数 のサンプル
***********************************************************************
<<< Test.vbs のコマンドライン・オプション >>>
***********************************************************************
Test.vbs のコマンドライン・オプション
コマンドライン・オプションを指定して起動すると、メニューから選択することなく、自動的に
テストの実施などを行うことができます。
サンプル: BuildTest.bat
@echo off
echo テストのビルド・ステップを実行します。
pause
cscript Test.vbs /Build
次のオプションがあります。
/Case:TestSymbol
TestSymbol に指定したテスト・シンボルの Test.vbs を選択します。
/Case オプションが無いときは、すべての Test.vbs を選択します。
/All
Test.vbs の Test_build, Test_setup, Test_start, Test_check, Test_clean を
呼び出します。 呼び出したら、プロセスを終了します。
/Build
Test_build 関数を呼び出します。 呼び出したら、プロセスを終了します。
/Setup
Test_setup 関数を呼び出します。 呼び出したら、プロセスを終了します。
/Start
Test_start 関数を呼び出します。 呼び出したら、プロセスを終了します。
/Check
Test_check 関数を呼び出します。 呼び出したら、プロセスを終了します。
/Clean
Test_clean 関数を呼び出します。 呼び出したら、プロセスを終了します。
/log
テストのログのファイル名。 デフォルトは、"Test_logs.txt"
テスト
→ T_Prpt フォルダ
関連
→ テスト・スクリプト ver2
VBS から Test.vbs を呼び出す
***********************************************************************
<<< Fail したとき >>>
***********************************************************************
Fail したとき
[ 親: テスト・プロンプト ]
テストに Fail したときの対応のヒントを説明します。
関連
FCBat を使っているときは、
→ Fail したテスト項目を特定する (FCBat)
1.エラー状況を確認する
Test_start などでエラーが発生しても、エラーがあったことを表示して、Test_logs.txt に記録
するだけで、次のテスト関数を呼び出しに行きます。
Test_logs.txt, Test_log.txt
Test_logs.txt には、エラーが発生した Test.vbs のフル・パスと、テスト関数が記録されて
います。
RunTestPrompt
で、テストを1つだけ指定したときは、Test_log.txt に記録されます。
[FAIL] Fail the Test
in "Test_start" function in "C:\home\vbslib_pack\_src\T_Priority\Test.vbs"
Test_logs.txt を「書き込みできない」とき、テスト・プロンプトが二重に起動して同じファイルを
開こうとしているときがあります。 そのときは、下記の /log オプションを指定して Test.vbs を
起動するか、Main 関数の先頭で、m_DefLogFName にログ・ファイルの名前を設定してください。
cscript Test.vbs /log:TestTarget_logs.txt
Sub Main( Opt, AppKey )
g_Test.m_DefLogFName = "TestTarget_logs.txt"
RunTestPrompt AppKey.NewWritable( "." )
End Sub
旧 AutoDiff モード
廃止されました。
AssertFC
を使ってください。
ver4 では、m_bAutoDiff_ に変えると動きますが、今後は無くなります。
AutoDiff モードを有効にすると、テストが失敗したとき、テスト・ログの中にコマンドプロンプトの
fc コマンド
の出力(テキストの差分表示)があれば、Diff ツールを起動します。
Sub Main( Opt, AppKey )
g_Test.m_bAutoDiff = True
RunTestPrompt AppKey.NewWritable( "." )
End Sub
m_bAutoDiff
Diff ツールの設定
→ Setting_getDiffCmdLine
テスト
→ [T_AutoDiff] 自動的に Diff ツールを開く
2.繰り返し実行する環境を作る
テスト・プロンプトへの入力を自動化することで、繰り返しテストを実行することを簡単にします。
Tests.vbs
Sub main2( Opt, AppKey ):set_input "5." :RunTestPrompt AppKey.NewWritable( "." ):End Sub
5.
3.デバッガに接続して、問題のある場所で止める
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
→ エラー・ブレークを有効にする
(旧版)
Test_logs.txt に記録されている Test.vbs を
デバッグモード(Script)
で実行すると、問題がある
場所でブレークします。
多くの場合、テスト対象のプログラムの出力値チェックでエラーになっているので、Test.vbs を
デバッグモード(Target)
で実行します。
テスト・プロンプト自体をデバッグするときは、デバッグモード(Script) で実行してブレークする
場所に、Stop 命令を記述し、cscript.exe //x で、Test.vbs を実行してください。
***********************************************************************
<<< サブフォルダの関数の呼び出し順序 >>>
***********************************************************************
サブフォルダの関数の呼び出し順序
テスト・プロンプトは、サブフォルダにある Test.vbs (起動時のファイル名と同じ名前の
ファイル)も呼び出します。 (TestCommon_Data.xml の
によって実施するテストは制限できます。) その呼び出す順序を説明します。
/TestCases/@TestSymbols
AddTestScriptAuto
追加順序
Test_current
Test_start
Test_build
Test_check
Test_setup
Test_clean
T_SomeTests
Test.vbs
1
1
4
7
10
15
18
T_UnitTest1
Test.vbs
2
2
5
8
11
14
17
T_UnitTest2
Test.vbs
3
3
6
9
12
13
16
数字に書いてある順番に Test_current 関数などがコールバックされます。
ただし、同じ深さの T_UnitTest1 と T_UnitTest2 の順番は変わることがあります。
ALL テストを行うと、すべての Test.vbs ファイル(起動時のファイル名と同じ名前の
ファイル)の Test_current を読んだ後に、すべての Test.vbsファイルの Test_build を
呼び出す…、と繰り返していきます。
Test_current, Test_build, Test_setup, Test_start は、Tests::AddTestScript した順に、
Test_check, Test_clean は、Tests::AddTestScript した順と逆に呼ばれます。
Tests::AddTestScriptAuto は、親フォルダから追加していくので、
Test_current, Test_build, Test_setup, Test_start は、親フォルダから、
Test_check, Test_clean は、子フォルダから呼ばれます。
Tests::CurrentTestPriority を設定することで、テストの順番を変えることができます。
(ver4) テストに失敗したら、そのテストの続きの関数はコールバックされません。
たとえば、T_UnitTest1 の Test_start 関数内でエラーが発生したら、T_UnitTest1
の Test_check, Test_clean 関数はコールバックされません。
(ver4) テストをスキップしたら、そのテストの続きの関数はコールバックされませんが、
Test_clean 関数はコールバックされます。 たとえば、T_UnitTest1 の Test_start 関数
内で Skip 関数を呼び出したら、T_UnitTest1 の Test_check 関数はコールバックされ
ませんが、T_UnitTest1 の Test_clean 関数はコールバックされます。
(ver4) Test_build 関数と Test_setup 関数と Test_start 関数は、親フォルダーの
テストに失敗があれば、子フォルダーの同じ名前の関数はコールバックされません。
Test_check 関数と Test_clean 関数は、子フォルダーのテストに失敗があれば、
親フォルダーの関数はコールバックされません。
テスト
→ [T_SomeTests] 複数のテストスクリプト
関連
→ Tests::CurrentTestPriority
→ Tests::SetCur
→ Select the Test メニュー
呼び出し順序を確認する
***********************************************************************
<<< テストプログラム作成のヒント >>>
***********************************************************************
テストプログラム作成のヒント
→ 手動テストは、ユーザーをガイドするスクリプトを作成すること
→ テストケースの組み合わせ
→ ファイルを生成したり、更新したりするテスト
→ 他のプログラムを起動する機能のテスト
→ エラーメッセージをチェックするテスト
手動テストは、ユーザーをガイドするスクリプトを作成すること
実際にテストを実行する前に、スクリプトで、自動的に行われる動作の説明と、手動で操作する内容と
確認する内容を表示して、pause 関数を呼び出してください。
echo_line
EchoTestStart "T_Sample"
echo "〜されるので、〜してください。"
echo "〜であること。"
pause
echo_line
(手動テストの自動部分の処理)
参考
→ samples/Test/T_TestByManual フォルダ
手動テストが存在することを知らせるために、Test_start 関数で、ManualTest 関数を呼び出してください。
テストケースの組み合わせ
テストケースの組み合わせは多重ループで記述します。 ただし、組み合わせは必要最低限にして
ください。 テストのパラメーターは、
記述しやすくなります。
実際にテストを行うコードは、ループの最後の方にあります。
DicTable 関数
JoinDicTable 関数
Dic_add 関数
を使うと
Dim t, t2
For Each t In DicTable(Array( _
"Case", "SrcPath", "AnsPath", Empty, _
"Default", "sample1.xml", "sample1_replaced.xml", _
"UTF8_BOM", "sample6_utf8bom.xml", "sample6_utf8bom_replaced.xml", _
"Unicode", "sample3_unicode.xml", "sample3_unicode_replaced.xml" ))
For Each t2 In DicTable(Array( _
"Case2", "DstPath", "OutPath", Empty, _
"DstNormal", "out.xml", "out.xml", _
"DstEmpty", Empty, "out.xml", _
"DstOverWrite", "out.xml", "out.xml" ))
Dic_add t, t2 : t2.RemoveAll '// cross join
'//=== setup files
...
'//=== Do test '//##################################### Test Point
Assert Convert( t("SrcPath"), t("DstPath") ) = t("AnsPath")
Next
Next
DicTable
DicTable
Dic_add
関連
→ TestNums
→ SQL JOIN
ファイルを生成したり、更新したりするテスト
各テスト項目の最初で、存在する可能性のあるすべてのファイルを削除する関数を呼ぶ。
よくある、すでに存在するファイルがあるときは、そのテンプレートからコピーする
他のプログラムを起動する機能のテスト
Setting_getEditorCmdLine などを、プログラムを起動しないようにする
WaitForFile で待つ
エラーメッセージをチェックするテスト
Dim e, e2 ' as Err2
'// Error Handling Test
echo vbCRLF+"Next is Error Test"
If TryStart(e) Then On Error Resume Next
...
If TryEnd Then On Error GoTo 0
e.CopyAndClear e2 '//[out] e2
echo e2.desc
Assert InStr( e2.desc, "SomeError" ) > 0
Assert e2.num <> 0
CopyAndClear
エラーの情報を Err2::CopyAndClear でコピーしてから、チェックしてください。
g_debug を設定したときに、Fail したところで正しくブレークするようになります。
***********************************************************************
<<< 処理フロー (Test.vbs) >>>
***********************************************************************
処理フロー (Test.vbs)
[ 親: テスト・プロンプト ]
テストスクリプトを起動すると、テストプロンプトが起動します。
ユーザがメニューから選択すると、テスト・プロンプトからコールバック
されるので、テストの実施などを行います。
インクルード
テスト
プロンプト
(TestPrompt.vbs)
コールバック
テスト
スクリプト
(Test.vbs)
テスト実施
テスト対象
プロセス
チェック
出力データ
出力
各テスト項目
テスト・プロンプト・エンジン
Test.vbs
TestPrompt.vbs
ターゲットプログラム
RunTestPrompt
(src)
TestPrompt_Setting.vbs
をロード&SetTest をコール
→ Setting_buildTestPrompt
メニューを表示
(src)
(UnitTest).vbs
を再ロード
Tests::DoAllTest
Test_start
などをコールバック
→ 呼び出し順序
起動
テストを実行
結果を報告
(src)
TestScript::Finish
メニューを表示
同一プロセス内
***********************************************************************
<<< データ構造 (Test.vbs) >>>
***********************************************************************
データ構造 (Test.vbs)
TestPrompt
in RunTestPrompt()
(src)
MenuItem
.m_Menu()
Tests
(src)
.m_Tests
Dic< UnitTest >
.Sets
UnitTest
.CurrentTest
TestScript
g_Test
Tests::DoAllTest
(src)
SectionTree
section
***********************************************************************
<<< テスト・スクリプト ver2 >>>
***********************************************************************
テスト・スクリプト ver2
別の VBS ファイルを呼び出したり、ログをとったりします。
全テストのとき、ユニットテストのとき、デバッグのとき、という状況に応じて、
テストスケジューラは、臨機応変にテストスクリプトを呼び出します。
テスト処理が失敗したら、テストスクリプトからテストスケジューラに return 的に戻り、
テストスケジューラは、次のテストスクリプトを実行します。
cscript.exe など
テスト
スケジューラ
テスト
スクリプト
Do_
プロセス起動
→ TestPrompt クラス
Tests クラスをユーザから使うためのコマンドプロンプトです。
→ Tests クラス
テストをスケジューリングするクラスです。
→ TestScript クラス
テストスクリプトを呼び出すクラスです。
→ その他の関数
サンプル
Dim ts : Set ts = new Tests
ts.AddTestScriptAuto ".", "Test.vbs"
ts.DoAllTest
参考
→ テストツールの接続場所
テスト
→ TestsClass フォルダ
***********************************************************************
<<< 設定ファイル TestPrompt_Setting.vbs >>>
***********************************************************************
設定ファイル TestPrompt_Setting.vbs
テスト・プロンプトに関する設定を記述したファイルです。
通常、編集しなくてもそのまま使えます。
Setting_buildTestPrompt 関数
に設定を記述してください。
テスト・プロンプトのメニュー項目を記述します。
prompt.m_Menu(1).m_Caption = "1. Do ALL Test"
prompt.m_Menu(1).m_OpType = prompt.Op_AllTest
テストシンボルと、ユニット・テスト・プロンプトの VBS ファイルのあるパスの
対応関係を記述します。
tests.AddTestScriptAuto tests.BaseFolderPath, "Test.vbs"
または
fo = "test\"
Set t= tests.AddTestScript( "T_Fold1", fo+"T_Fold1.vbs" )
サンプル
→ TestPrompt_Setting_default.vbs # Setting_buildTestPrompt
***********************************************************************
<<< RunTestPrompt >>>
***********************************************************************
RunTestPrompt
(src)
Sub RunTestPrompt( Opt )
テスト・プロンプトを開きます。
【引数】
Opt
Empty または、Test.vbs のパス、または Writables オブジェクト
サンプル
Sub main2( Opt, AppKey )
RunTestPrompt AppKey.NewWritable( "." )
End Sub
テスト・プロンプトで選択したメニュー項目によって、
Test.vbs に記述する関数
(Test_build など) を呼び出します。
Opt に Writables オブジェクトを指定すると、その設定を使い、、サブフォルダに
ある Test.vbs もテストします。
Opt に Empty を指定すると、サブフォルダにある Test.vbs もテストします。
Opt に
Test.vbs
のパスを指定すると、そのテストだけをテストします。
Opt に Test.vbs のパスを指定しなかったときのログのファイル名は、Test_logs.txt、
指定したときのログのファイル名は、Test_log.txt になります。
Opt に
RunTestPromptConfigClass
のオブジェクトを指定できます。
コールツリー
main2
RunTestPrompt
TestPrompt::DoPrompt
TestPrompt::DoTest
関連
→ GetTemporaryTestsObject
***********************************************************************
<<< RunTestPromptConfigClass >>>
***********************************************************************
RunTestPromptConfigClass
RunTestPrompt
の設定。
RunTestPrompt
に指定します。
Writables
.Writable
→ NewWritable (AppKeyClass)
integer
.ExpectedPassConut
→ ExpectedPassConut (TestScript)
string
.TestTargetVBS_Path
テスト対象の Test.vbs のパス
ソース
→ TestPrompt.vbs
***********************************************************************
<<< TestPrompt クラス >>>
***********************************************************************
TestPrompt クラス
(src)
Tests クラス
をユーザから使うためのコマンドプロンプトです。
.DoPrompt
(src)
***********************************************************************
<<< Tests クラス >>>
***********************************************************************
Tests クラス
(src)
テストをスケジューリングするクラスです。
Test.vbs に記述するコールバック関数
の引数です。
.AddTestScriptAuto
フォルダに含まれるすべての Test.vbs をロードします。
.BaseFolderPath
as string
テストツリーのベース(ルート)フォルダのパス
.LoadTestSet
実施を行うテスト・シンボルを読み込む
テスト
→ [T_LoadTestSet]
→ T_TestSet フォルダ
.CurrentSymbol
as string
現在設定されているテストシンボル、 "T_ALL"など
.Symbol
as string
現在実行しているテストのテストシンボル
.CurrentTest
as
UnitTest
現在実行しているテストの情報、
Delegate はココ
.CurrentTestPriority
テストの優先度
AutoDiff モード
を有効にするかどうか
.m_bAutoDiff
***********************************************************************
<<< AddTestScriptAuto (Tests) >>>
***********************************************************************
AddTestScriptAuto (Tests)
(src)
Function Tests::AddTestScriptAuto( BasePath, FName )
フォルダに含まれるすべてのテスト項目スクリプト(Test.vbs)が呼び出せるようにします。
【引数】
BasePath
検索するフォルダ
FName
テスト項目スクリプトのファイル名(通常 Test.vbs)
返り値
なし
テスト
→ ○ [T_AddAuto] テスト項目の自動追加
***********************************************************************
<<< AddTestScript (Tests) >>>
***********************************************************************
AddTestScript (Tests)
(src)
Function Tests::AddTestScript( Symbol, FileName )
テスト項目スクリプト(Test.vbs)が呼び出せるようにします。
【引数】
Symbol
テストシンボル
FileName
テスト項目スクリプトのファイル名(通常 Test.vbs)
返り値
なし
***********************************************************************
<<< CurrentTestPriority (Tests) >>>
***********************************************************************
CurrentTestPriority (Tests)
(src)
Dim Tests::CurrentTestPriority as integer
呼び出し順序を決めるための、現在のテストの優先度
デフォルトは 1000 です。
サンプル
Sub Test_current( tests )
tests.CurrentTestPriority = 850
End Sub
値の例:
・ソースをビルドする = 700番台
・テスト・ライブラリをビルドする = 800番台
・テスト・プログラムをビルド&実行する = 900番台
・サンプル・プログラムをビルド&実行する = 1000番台
参考
→ Test_current
→ サブフォルダの関数の呼び出し順序
***********************************************************************
<<< Symbol (Tests) >>>
***********************************************************************
Symbol (Tests)
Dim Tests::Symbol as string
現在のテストの識別子(テスト・シンボル)
デフォルトは、Test.vbs があるフォルダーの名前です。
参考
→ Test_current
***********************************************************************
<<< SetCurrentSymbol (Tests) >>>
***********************************************************************
SetCurrentSymbol (Tests)
Function Tests::SetCurrentSymbol( Symbol as string ) as integer
現在のテストの識別子(テスト・シンボル)を選択します。
全てのテストを選択するときは、"ALL" を指定してください。
返り値は、0=成功、1=失敗
***********************************************************************
<<< GetCallingOrder (Tests) >>>
***********************************************************************
GetCallingOrder (Tests)
(src)
Sub Tests::GetCallingOrder( out_UnitTests as UnitTest )
サブフォルダの関数の呼び出し順序
を取得します。
***********************************************************************
<<< DoAllTest (Tests) >>>
***********************************************************************
DoAllTest (Tests)
Sub Tests::DoAllTest()
すべてのテストを実施します。
参考
→ 2. Do ALL Test
コールツリー
TestPrompt::DoPrompt
Tests::DoAllTest
(src)
ShakerSort_fromDic
テストする順番を整列する
TestScript::Start
TestScript::m_nPass = 0
テストの集計をリセットする
For Each CurrentTest '// as UnitTest
テストのループ
Tests::OnTestFunctionSetup
m_Symbol = Me.CurrentTest.Symbol
TestScript::Do_
(src)
( CurrentTest.ScriptPath, "Test_current", Me as Tests )
TestScript::Do_
( CurrentTest.ScriptPath, "Test_start", Me as Tests )
echo
'//=== Echo the Test title
call_vbs_t
(src)
g_fs.OpenTextFile
ExecuteGlobal
Test_start など
テスト・スクリプトへコールバックする
If en <> 0 Then Err.Raise en,, ed
If en = E_TestPass Then
TestScript::m_nPass = m_nPass + 1
テストの結果をまとめる
Tests::OnTestFunctionFinish
m_Symbol = Me.CurrentTest.Symbol
TestScript::Finish
参考
→ 処理フロー (テスト・プロンプト)
関連
→ Tests::DoTest
***********************************************************************
<<< DoTest (Tests) >>>
***********************************************************************
DoTest (Tests)
(src)
Sub Tests::DoTest( Func as string, bReverse as Boolean )
3. call each "Test_build" in sub folders
など、テスト関数の1つを実行します。
【引数】
Func
呼び出す関数の名前
bReverse
複数の Test.vbs の関数を逆順に呼び出します。(*1)
(*1)
True にすると、Test_clean と同じ順序に呼び出します。
→ サブフォルダの関数の呼び出し順序
サブフォルダーにあるテスト・スクリプトで定義されている、Func に指定した名前の
関数もコールバックされます。
関連
→ Tests::DoAllTest
***********************************************************************
<<< SetCur (Tests) >>>
***********************************************************************
SetCur (Tests)
(src)
Sub Tests::SetCur( SubSymbol )
デバッグを行うサブテストシンボルを設定します。
Test_current の中から呼び出してください。
指定したサブテストシンボルのテスト項目だけ実施するようになります。
デバッグが済んだら、"" を設定してください。
→ Tests::IsCur
Sub Test_current( tests )
tests.SetCur "SubTestA"
End Sub
Sub Test_start( tests )
If tests.IsCur( "SubTestA" ) Then
'// Do SubTestA
End If
If tests.IsCur( "SubTestB" ) Then
'// Do SubTestB
End If
Pass
End Sub
テスト
→ T_SubTest\Test_target.vbs#SetCur
***********************************************************************
<<< IsCur (Tests) >>>
***********************************************************************
IsCur (Tests)
(src)
Function Tests::IsCur( SubSymbol )
指定のサブテストシンボル、または "" が設定されているか判定します。
Test_start など(Test_current 以外)の中から呼び出します。
テスト
→ T_SubTest\Test_target.vbs#IsCur
関連
→ Tests::SetCur
***********************************************************************
<<< SaveTestResultHtml (Tests) >>>
***********************************************************************
未対応
SaveTestResultHtml (Tests)
(src)
Sub Tests::SaveTestResultHtml( SavePath as string )
テストの結果を HTML 形式で出力します。
【引数】
SavePath
出力ファイルパス。 Empty のとき "TestResult.html"
ファイル:
TestScript.vbs
出力サンプル:
書きかけ
テスト
→ T_SomeTests.vbs # T_TestReport
***********************************************************************
<<< SaveTestResultCSV (Tests) >>>
***********************************************************************
SaveTestResultCSV (Tests)
(src)
Sub Tests::SaveTestResultCSV( SavePath as string )
テストの結果を CSV 形式で出力します。
【引数】
SavePath
出力ファイルパス。 Empty のとき "TestResult.csv"
ファイル:
TestScript.vbs
出力サンプル:
Test symbol,result,step,path,priority
T_SomeTests,Pass,,TestOfTest2.vbs,1000
T_SampA,Pass,,T_SampA\TestOfTest2.vbs,1000
T_SampB,Fail,Test_check,T_SampB\TestOfTest2.vbs,1000
T_SampC,Skip,Test_setup,T_SampC\TestOfTest2.vbs,1000
テスト
→ T_SomeTests.vbs # T_TestReport
***********************************************************************
<<< LoadTestResultCSV (Tests) >>>
***********************************************************************
LoadTestResultCSV (Tests)
(src)
Sub Tests::LoadTestResultCSV( LoadPath as string )
テストの結果を CSV 形式で出力します。
【引数】
LoadPath
出力ファイルパス。 Empty のとき "TestResult.csv"
ファイル:
TestScript.vbs
***********************************************************************
<<< TestScript クラス、g_Test 変数 >>>
***********************************************************************
TestScript クラス、g_Test 変数
(src)
テストスクリプトを呼び出すクラスです。
グローバル変数 g_Test は、TestScript クラスのオブジェクトを参照しています。
→ TestScript::Start
テストを開始します。 ログ取りを開始します。
→ TestScript::Do_
テスト関数を呼び出します。(同じプロセス)
→ TestScript::Finish
テストを終了します。 ログ取りを終了して集計します。
→ テスト・スクリプトのテスト
***********************************************************************
<<< Start (TestScript) >>>
***********************************************************************
Start (TestScript)
(src)
Sub TestScript::Start
テストを開始します。 ログ取りを開始します。
カレントテストのスクリプトがあるフォルダに、TestScript_log.txt
ができます。
***********************************************************************
<<< Do_ (TestScript) >>>
***********************************************************************
Do_ (TestScript)
(src)
Sub TestScript::Do_( vbs_path as string, func as string, param as variant )
テスト関数を呼び出します。(同じプロセス)
【引数】
vbs_path
テスト・スクリプトが書かれた VBScript ファイルのパス
func
呼び出す関数の名前(文字列)
param
関数に渡すパラメータ
Do の後に、アンダーラインがあるので注意してください。(無いとエラーになるため)
***********************************************************************
<<< Finish (TestScript) >>>
***********************************************************************
Finish (TestScript)
(src)
Sub TestScript::Finish
テストを終了します。 ログ取りを終了して集計します。
TestScript クラスのデストラクタによってテストが終了しますが、
明示的にこの Finish を呼び出して終了させることもできます。
***********************************************************************
<<< ExpectedPassConut (TestScript) >>>
***********************************************************************
ExpectedPassConut (TestScript)
Dim TestScript::ExpectedPassConut as integer
予想される Pass の数。
サンプル
一致した時の表示例
==========================================================
Test Finish (Pass=155, Manual=6, Skip=0, Fail=0)
ExpectedPassConut = 155 [OK]
一致しなかったら、[FAIL] と表示されます。
ExpectedPassConut が設定されていないときは、ExpectedPassConut の行を表示しません。
ソース
→ TestScript.vbs
テスト
→ T_Prpt フォルダー
関連
→ RunTestPromptConfigClass
::ExpectedPassConut
Test.vbs を使うとき
***********************************************************************
<<< UnitTest クラス >>>
***********************************************************************
UnitTest クラス
(src)
Class UnitTest
Public Symbol ' as string
Public ScriptPath ' as string
Public Priority ' as integer
Public Delegate ' as variant
End Class
Delegate
***********************************************************************
<<< その他の関数 >>>
***********************************************************************
その他の関数
***********************************************************************
<<< GetTemporaryTestsObject >>>
***********************************************************************
GetTemporaryTestsObject
Function GetTemporaryTestsObject() as Tests
一時的な Tests オブジェクトを生成し、Test_current を呼び出します。
【引数】
返り値
テスト・オブジェクト
ファイル:
TestScript.vbs
主に、Test_current で取得できるデータを、RunTestPrompt を呼び出す前に参照するときに使います。
GetTemporaryTestsObject().CurrentTest は、同じファイルの中にある Test_current 関数などの引数
に渡るオブジェクトを指しています。
サンプル
Sub Main( Opt, AppKey )
Dim g : Set g = GetTemporaryTestsObject().CurrentTest.Delegate
RunTestPrompt AppKey.NewWritable( Array( ".", g("PublicFolder") ) )
End Sub
Sub Test_current( tests )
If IsEmpty( tests.CurrentTest.Delegate ) Then
Dim g : Set g = CreateObject( "Scripting.Dictionary" ) : Set tests.CurrentTest.Delegate = g
'[Setting]
'==============================================================================
g("PublicFolder") = "..\Public\FromPackage"
'==============================================================================
End If
End Sub
テスト
→ T_TempTests フォルダ
***********************************************************************
<<< CheckTestErrLevel >>>
***********************************************************************
CheckTestErrLevel
(src)
Sub CheckTestErrLevel( errorlevel as integer )
VBS プログラムの終了コード(エラーレベル)に問題があったらエラーを発生させる。
【引数】
errorlevel
エラーレベル(WScript.Quit の引数)
内部で、Pass, Fail, Skip のいずれかを呼び出します。
VBS プログラムは、wscript ではなく cscript で呼び出さないと、正しいエラーレベル
を取得できません。
RunProg
から VBScript のスクリプトを呼び出して、子プロセスでエラーが発生すると、
親プロセスの RunProg の中からエラーが発生してしまうため、終了コードを取得できません。
Run (Shell)
を使ってください。
サンプル
r = g_sh.Run( "cscript sample.vbs",, True )
CheckTestErrLevel r
参考
→ エラー発生時の動作
→ 正常終了時の動作
関連
→ RunProg
***********************************************************************
<<< g_IsAutoTest >>>
***********************************************************************
g_IsAutoTest
Dim g_IsAutoTest as boolean
自動テストを実行中かどうか。
g_IsAutoTest = True にすると、
Pause
しなくなることがあります。
***********************************************************************
<<< テスト支援機能 (関数) >>>
***********************************************************************
テスト支援機能 (関数)
テスト対象となるスクリプトが使うもの
***********************************************************************
<<< ReadTestCase >>>
***********************************************************************
ReadTestCase
(src)
Function ReadTestCase( XmlPath as string, TestCaseID as string )
as ArrayClass of Dictionary
ArrayClass
Dictionary
Function ReadTestCase( XmlPath as string, Empty ) as Dictionary
Dictionary
→ 複数ケースで共通のデータ
テストケースが書かれた XML ファイルのデータにアクセスするオブジェクトを返します。
【引数】
XmlPath
テストケースが書かれた XML ファイルのパス
TestCaseID
XML ファイルの中の タグの id 属性の値、または Empty
返り値
テストケースのデータ(の配列)
ファイル:
TestScript.vbs
サンプル・コード:
Sub T_Test1( Opt, AppKey )
Dim x
Dim cases : Set cases = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
For Each x In cases.Items
T_Test1_main Opt, AppKey, x '// Test.vbs の中では、パラメーターは ( tests, x )
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせなくて済むように、テストの実施は *_main 関数にする
Sub T_Test1_main( Opt, AppKey, x )
Dim w_:Set w_=AppKey.NewWritable( "out" ).Enable()
EchoTestStart "T_Test1"
echo x '// 全てのデータを表示する
FuncA CInt( x("InputData") )
FuncB Replace( x("Answer"), "%Num%", CStr( 12 ) )
End Sub
T_Test1
T_Test1_Data.xml
TestCase_for_T_Test1
T_Test1
T_Test1
InputData
Answer
属性値の扱い方
返り値は、辞書型を要素に持つ配列(ArrayClass)です。 辞書のキーは、XML 属性の名前です。
データの具体的な値は、下記のサンプル XML ファイルを参照してください。
・得られるデータはすべて文字列型です。
・数値を使うときは、CInt 関数などを使います。
・辞書のキーに指定した名前に対応する XML 属性が存在しないときは、Empty を返します。
・複数のデータをコンマで区切って記述したときは、
・動的に変化するデータを XML ファイルに記述するときは、%Num% のように変数を記述します。
ただし、テスト・スクリプトで Replace 関数や
・#name (HTML の href 属性)のリンク先を得るには、
ArrayFromCSV
などを使います。
DicItemOfItem
などを使って値を設定してください。
GetHRefBase
を使ってください。
テストケースが書かれた XML ファイルの書式
テストケースのデータの多くは構造体の配列であるため、XML ファイルの書式は、それを想定
して、ある程度決めています。 この標準化により、XML ファイルを見たときにテストケースが
把握しやすくなりますし、テスト・スクリプトのコードも DOM より簡単になります。 書式の詳細は、
下記の DTD を参照してください。
もし、複雑なデータを記述したいときは、一般的な XML ファイルをアクセスする DOM を使って
ください。 参考
→ LoadXML
サンプル XML ファイル: T_Test1_Data.xml
TestCases
TestCase
TestCase_for_T_Test1
#common
SubCase
InputData
Answer
SubCase
TestCase
TestCase
TestCase_for_T_Test1_sub
SubCase
SubCase
TestCase
TestCases
TestCases、TestCase、SubCase のタグ名を変えることはできません。
XML タグの中(例:SubCase タグの中) に 形式のコメントは入れたいときは、
XMLの仕様上できないので、ダミーとなる _comment1 などの属性を使って、コメントを
記述します。
テスト
→ T_TestCaseData.vbs # T_TestCaseData
関連
→ 複数のケースで共通のデータ
→ 特殊な XML 属性 (ReadTestCase)
→ クロス・ケース
→ テスト・ケースの選択
→ スクリプトからテストケースを指定する
→ SetReadTestCase
デバッグ用に、テストケースを指定します
→ GetMainSetting 関数 (vbsool)
スクリプト・ファイル内のデータ
→ DicTable
辞書を使ったテストデータ
→ TestNums (clib)
C言語のテスト番号
***********************************************************************
<<< 複数のケースで共通のデータ >>>
***********************************************************************
複数のケースで共通のデータ
[ 親: ReadTestCase ]
複数のテストケースで共通のデータは、
特殊な XML 属性
を指定するか、
TestCase タグの属性に記述できます。
サンプル XML ファイル: T_Test1_Data.xml
ExeName
common
CommonData1
#common
上のファイルと下のファイルは、同じテスト・データになります。
CommonData1
ExeName
CommonData1
ExeName
タグの内容をリードするときは、下記のようにします。
Dim test_common_data : Set test_common_data = ReadTestCase( SearchParent(_
"TestCommon_Data.xml" ), Empty ) '// test_common_data as
start test_common_data( "ExeName" )
***********************************************************************
<<< (旧版) 複数のケースで共通のデータ >>>
***********************************************************************
(旧版) 複数のケースで共通のデータ
[ 親: ReadTestCase ]
複数のテストケースで共通のデータを、XML ファイルの TestCases タグの属性からリードするときは、
ReadTestCase の第2引数を Empty に指定してください。
Sub T_Test1( Opt, AppKey )
Dim x
Dim xx : Set xx = ReadTestCase( "T_Test1_Data.xml", Empty ) '// xx as
Dim cases : Set cases = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
For Each x In cases.Items
Dic_add x, xx
T_Test1_main Opt, AppKey, x
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせないため、テストの実施は *_main 関数にする
Sub T_Test1_main( Opt, AppKey, x )
echo x
FuncA CInt( x("InputData") )
FuncB x("CommonData1")
End Sub
T_Test1
T_Test1_Data.xml
Empty
T_Test1
T_Test1
CommonData1
サンプル XML ファイル: T_Test1_Data.xml
TestCases
CommonData1
複数のテスト・プログラムで共通のデータは、親フォルダーにある共通の XML ファイルからリードして
ください。
Set xx = ReadTestCase( SearchParent("TestCommon_Data.xml"), Empty ) '// xx as
SearchParent
***********************************************************************
<<< 特殊な XML 属性 (ReadTestCase) >>>
***********************************************************************
特殊な XML 属性 (ReadTestCase)
[ 親: ReadTestCase ]
ReadTestCase がリードする XML ファイルは、データの記述が冗長にならないように、データの継承や集約
ができる特殊な XML が使えます。
→ base_data 属性
XML 属性を継承します
→ plus_attr 属性
継承した XML 属性は CSV 形式で追加します
→ aggregate 属性
子の XML 要素を集約します
テストデータを記述する XML ファイルの DTD
***********************************************************************
<<< base_data 属性 >>>
***********************************************************************
base_data 属性
[ 親: ReadTestCase ]
データの多くは共通で、一部のデータだけ変えるときは、base_data 属性を使って属性を継承することが
できます。 base_data 属性は、A タグの href 属性と同じ記述形式です。 別のファイルから継承する
こともできます。
ファイルパスに、ピリオドを3つ並べると、親フォルダー、親の親フォルダー … と探していきます。
参考
→ パスにピリオドを3つ並べた場合
サンプル XML ファイル: T_Test1_Data.xml
T_Test1_Common
T_Test1_Common
T_Test1_Common
上のファイルと下のファイルは、同じデータになります。
Answer="ans1.txt"
Answer="ans1.txt"
テスト
→ T_TestCaseData.vbs # [T_BaseTestCaseData]
→ T_TestCaseData.xml # T_BaseTestCaseData_1 など
***********************************************************************
<<< plus_attr 属性 >>>
***********************************************************************
plus_attr 属性
[ 親: ReadTestCase ]
CSV 形式のデータを、別のタグから追加するときは、plus_attr 属性を使います。
plus_attr 属性の値は、属性の値を CSV 形式で並べます。
サンプル XML ファイル: T_Test1_Data.xml
InputDataA
InputDataA
上のファイルと下のファイルは、同じデータになります。
InputDataA
テスト
→ T_TestCaseData.vbs # [T_BaseTestCaseData]
→ T_TestCaseData2.xml # T_BaseTestCaseData_22 など
***********************************************************************
<<< aggregate 属性 >>>
***********************************************************************
aggregate 属性
[ 親: ReadTestCase ]
TestCase タグの子の SubCase タグに、別の TestCase タグの子を追加するときは、
aggregate 属性を使います。
サンプル XML ファイル: T_Test1_Data.xml
TestCase_Common
TestCase_Common
TestCase_Common
SubCase
上のファイルと下のファイルは、同じデータになります。
SubCase
SubCase
テスト
→ T_TestCaseData.vbs # [T_BaseTestCaseData]
→ T_TestCaseData.xml # T_AggregateTestCaseData_1 など
***********************************************************************
<<< クロス・ケース >>>
***********************************************************************
クロス・ケース
[ 親: ReadTestCase ]
テストケースの値が、表の縦軸と横軸にあり、表の全てをテストする場合は、下記のように二重ループに
して、Dic_add を使ってテストデータを結合します。
Sub T_Test1( Opt, AppKey )
Dim x, y, mix
Dim cases_x : Set cases_x = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1_x" )
Dim cases_y : Set cases_y = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1_y" )
Set mix = CreateObject( "Scripting.Dictionary" )
For Each y In cases_y.Items
For Each x In cases_x.Items
mix.RemoveAll : Dic_add mix, x : Dic_add mix, y
T_Test1_main Opt, AppKey, mix
Next
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせないため、テストの実施は *_main 関数にする
Sub T_Test1_main( Opt, AppKey, x )
echo x
FuncA x("InputData"), ReadFile( x("CurrentFolder") +"\file.txt" )
End Sub
T_Test1
T_Test1
T_Test1
InputData
CurrentFolder
サンプル XML ファイル: T_Test1_Data.xml
XML ファイルを使わない、クロス・ケースのサンプル
Sub T_Test1( Opt, AppKey )
Set t = CreateObject( "Scripting.Dictionary" )
For Each endian In Array( "LittleEndian", "BigEndian" )
For Each language In Array( "VBScript", "C" )
t("Endian") = endian
t("Language") = language
T_Test1_Main t
Next
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせないため、テストの実施は *_Main 関数にする
Sub T_Test1_Main( Opt, AppKey, x )
echo x
FuncA x("Endian"), x("Language")
End Sub
***********************************************************************
<<< テスト・ケースの選択 >>>
***********************************************************************
テスト・ケースの選択
[ 親: ReadTestCase ]
SubCase タグの中から、特定のタグだけ選択するときは、ArrayClass の LookUpDic を使ってください。
Sub T_Test1( Opt, AppKey )
Dim x
Dim cases : Set cases = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
Set x = cases.LookUpDic( "name", "Alphabet" )
T_Test1_main Opt, AppKey, x
Pass
End Sub
"name", "Alphabet"
サンプル XML ファイル: T_Test1_Data.xml
***********************************************************************
<<< スクリプトからテストケースを指定する >>>
***********************************************************************
スクリプトからテストケースを指定する
[ 親: ReadTestCase ]
テストケースの値を XML ファイルではなく、スクリプトに埋め込む場合は、下記のように代入します。
Sub T_Test1( Opt, AppKey )
Dim x, y
Dim cases : Set cases_x = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
For Each x In cases_x.Items
For Each y In Array( 2, 3 )
x("y") = y
T_Test1_main Opt, AppKey, x
x.Remove "y"
Next
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせないため、テストの実施は *_main 関数にする
Sub T_Test1_main( Opt, AppKey, x )
echo x
FuncA x("InputData"), ReadFile( x("y") +"\file.txt" )
End Sub
T_Test1
( 2, 3 )
x("y") = y
T_Test1
x.Remove "y"
T_Test1
x("y")
***********************************************************************
<<< TempParams.txt - C言語のプログラムにデータを渡す >>>
***********************************************************************
TempParams.txt - C言語のプログラムにデータを渡す
C言語の標準ライブラリだけを使うときは、fgets を使った1行ずつ読み込むような単純なファイル・リード
しかできませんが、VBScript で XML などのデータを整理することで、C言語のプログラムに複雑な
動きをさせることができるようになります。
T_Test1.xml
Test.vbs
TempParams.txt
C言語のプログラム
vbs スクリプトのサンプル (Test.vbs)
Sub T_Test1_main( tests, x ) // x is from ReadTestCase
Dim f : Set f = OpenForWrite( "TempParams.txt", Empty )
f.WriteLine x("Param1") & " // Param1"
f = Empty
r= RunProg( "CLangProg.exe /TempParams:TempParams.txt", "" )
del "TempParams.txt"
ReadTestCase
C言語のテスト・プログラムのサンプル (CLangProg.exe)
int Params_read( Params* m, FILE* f );
int T_Sample()
{
int e;
errno_t et;
FILE* f = NULL;
TCHAR s[256];
TCHAR path[256];
//=== ReadTestCase
e= GetCommandLineNamed( _T("TempParams"), false, s, sizeof(s) ); IF(e)goto fin;
e= StrT_getFullPath( path, sizeof(path), s, NULL );
et= _tfopen_s( &f, path, _T("rt") ); IF(et)goto err_no;
e= Params_read( ¶ms, f ); IF(e)goto fin;
//=== Test Main
// Write here ...
e=0;
fin:
if(f!=NULL){ee= fclose( f ); IF(ee&&!e)e=E_Errno;}
}
int Params_read( Params* m, FILE* f )
{
int e;
int i;
TCHAR line[256];
line[0] = '\0';
_fgetts( line, _countof(line), f );
e= StrT_cutLineComment( line, sizeof(line), line, _T("//") ); IF(e)goto fin;
m->BufferSize = _ttoi( line );
_fgetts( line, _countof(line), f ); // skip space line
e=0;
fin:
return e;
}
StrT_cutLineComment
TempParams.txt ファイルの基本形
多くの場合、テスト・データを単純に並べていくだけで、テストを実施することはできるでしょう。
テスト・ケースが複数あるときは、空行で区切るとよいでしょう。
clib の StrT_cutLineComment 関数を使えば、コメントを入れることができます。
下記は、struct { int a; int b; } TestData[2]; という構造になります。
TempParams.txt
100 // 1つ目のテスト・ケースの1つ目のデータ
200 // 1つ目のテスト・ケースの2つ目のデータ
110 // 2つ目のテスト・ケースの1つ目のデータ
210 // 2つ目のテスト・ケースの2つ目のデータ
TempParams.txt ファイルの フラグド構造体パラメーター
1つのテスト・ケースにおいて、それぞれのデータを使うかどうかを表すには、1つ目のデータを
ビットフィールドの数値として使い、ビットが1であれば対応するデータが記述されているように
します。
TempParams.txt
0x07 // ビットフィールド。 ビット0、1、2が1
100 // 1つ目のデータ
200 // 2つ目のデータ
300 // 3つ目のデータ
0x02 // ビットフィールド。 ビット1のみが1
200 // 2つ目のデータ
参考
→ フラグド構造体パラメーター
TempParams.txt ファイルの データ型の名前
テスト・データが複数のデータ構造を持つときは、データ構造を識別するシンボルを
TempParams.txt ファイルに記述する必要があります。
TempParams.txt
DataTypeA // データ型の名前
100 // DataTypeA の1つ目のデータ
200 // DataTypeA の2つ目のデータ
DataTypeB // データ型の名前
100 // DataTypeB の1つ目のデータ
200 // DataTypeB の2つ目のデータ
300 // DataTypeB の3つ目のデータ
***********************************************************************
<<< ReadTestCase 内部のデバッグ >>>
***********************************************************************
ReadTestCase 内部のデバッグ
下記のように IsVerbose を True にすると、XML をリードする処理のステップを表示します。
If IsEmpty( g_ReadTestCase ) Then Set g_ReadTestCase = new XmlObjReader
g_ReadTestCase.IsVerbose = True
Skipped
***********************************************************************
<<< SetReadTestCase >>>
***********************************************************************
SetReadTestCase
(src)
Sub SetReadTestCase( XmlPath as string, TestCaseID as string, Condition as string )
デバッグ用に、テストケースを指定します。
【引数】
XmlPath
テストケースが書かれた XML ファイルのパス
TestCaseID
XML ファイルの中の タグの id 属性の値
Condition
テストケースを指定する条件文
ファイル:
TestScript.vbs
ReadTestCase
を呼び出す前に、SetReadTestCase を呼び出すコードを追加すると、
ReadTestCase の返り値が、SetReadTestCase で指定した1つのケースだけになります。
サンプル・コード:
Sub T_Test1( Opt, AppKey )
Dim testcases, x
SetReadTestCase "T_Test1_Data.xml", "TestCase_for_T_Test1", "name='Alphabet'" : Skipped
Set x = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
For Each x In testcases.Items '// x は、InputData="ABC" の1回ループのみになる
T_Test1_main Opt, AppKey, x
Next
Pass
End Sub
SetReadTestCase
Skipped
サンプル XML ファイル: T_Test1_Data.xml
テスト
→ T_TestCaseData.vbs # [T_SetReadTestCase]
***********************************************************************
<<< SetStartSectionTree >>>
***********************************************************************
[ 親: SectionTree クラス ]
SetStartSectionTree
(src)
Sub SetStartSectionTree( SectionNames as string )
実行するセクションを設定します。
【引数】
SectionNames
セクション名。 CSV形式
ファイル:
vbslib.vbs
サンプル
Sec1 セクションから実行します。
SetStartSectionTree "Sec1"
サンプル
Sec1 セクションの中の SubSec2 セクションから実行します。
SetStartSectionTree "Sec1, SubSec2"
テスト
→ T_SectionTree.vbs # [T_SectionTree_SetStart]
→ T_SectionTree.vbs # [T_SectionTree_SetStart2]
→ T_SectionTree.vbs # [T_SectionTree_SetStart3]
→ T_SectionTree.vbs # [T_SectionTree_SetStartMiss]
関連
→ SectionTree クラス
***********************************************************************
<<< Pass >>>
***********************************************************************
Pass
(src)
Sub Pass
テストがパスしたことを、テストスクリプトに知らせて、プログラムを終了します。
内部的には、エラー 21 が発生します。
参考
→ 正常終了時の動作
テスト
→ T_SomeTests.vbs # T_TestReport
の T_SampA
***********************************************************************
<<< Fail >>>
***********************************************************************
Fail
(src)
Sub Fail
テストが失敗したことを、ユーザーやテストスクリプトに知らせて、プログラムを終了します。
エラーが発生したときと同じ動きをします。つまり、Fail の後は実行しません。
テスト
→ T_SomeTests.vbs # T_TestReport
の T_SampB
***********************************************************************
<<< Skip >>>
***********************************************************************
Skip
(src)
Sub Skip
テストが実行できる状況ではないことを、テストスクリプトに知らせて、プログラムを終了します。
エラーが発生したときと同じ動きをします。つまり、Skip の後は実行しないで、次のテストを実行します。
テスト
→ T_SomeTests.vbs # T_TestReport
の T_SampC
***********************************************************************
<<< Skipped >>>
***********************************************************************
Skipped
(src)
Sub Skipped
デバッグなどの理由で、テストの一部を一時的にスキップしたことを、テストスクリプトに
知らせます。 Skipped を呼んだテスト項目は、Pass を呼び出しても Fail します。
このときのエラーメッセージは、次のようになります。
Pass But Skipped. Cut calling "Skipped" function.
テスト
→ [T_Skip] テストをスキップする
***********************************************************************
<<< ManualTest >>>
***********************************************************************
ManualTest
(src)
Sub ManualTest( TestSymbol as string )
テストが手動テストであることを、テストスクリプトに知らせます。
手動テストは最低限にしてください。
サンプル
ManualTest "T_Sample1"
ManualTest tests.Symbol
参考
→ Tests クラス
参考
→ テストプログラム作成のヒント
***********************************************************************
<<< Assert >>>
***********************************************************************
Assert
(src)
Sub Assert( Condition as boolean )
条件が満たされているかをチェックします。
満たされていなければ、Fail を呼び出します。
If not Condition Then Fail とほぼ同じですが(違いは下記)、正しい条件文を記述する
ことになるので、ソースの可読性があがります。
また、If 文を使わないので、マルチステートメント(1行に複数の文)が記述できます。
g_debug の設定にかかわらず常にチェックします。
If Condition と If not Condition は、完全に反対の関係ではありません。
たとえば、If 4 と If not 4 は、どちらも真です。
完全に反対の関係は次のように複数行になります。
If Condition Then
Else
***
End If
よって、正しい条件文を記述することは If Then Fail より Assert の方が簡単になります。
サンプル:
Public Property Let VarA(x) : Assert x >= 0 : VarA = x : End Property
x >= 0
関連
→ Fail
テストが失敗したことを、ユーザーやテストスクリプトに知らせます。
→ Raise
新規にエラーを発生させます。
***********************************************************************
<<< AssertExist >>>
***********************************************************************
AssertExist
Sub AssertExist( Path as string )
ファイルまたはフォルダが存在するかどうかをチェックします。
存在しなければ、エラーメッセージの中にファイルのパスが含まれます。
このため、デバッガを起動しなくてもユーザーが対応できる可能性が高まります。
エラーコードは、E_PathNotFound になります。
逆に、AssertExist では、存在するときにエラーにすることはできません。
大文字小文字が異なると、echo_v 関数で警告を表示しますが、継続します。
サンプル:
AssertExist "settings.txt"
"settings.txt"
エラーメッセージのサンプル:
参考
→ TestCommon_setVariables
Test.vbs で共通のファイルの存在チェック
ソース
→ vbslib.vbs
テスト
→ T_File.vbs
T_AssertExist
→ T_FileMutex_Manually.vbs
T_AssertExist_UNC
関連
→ exist
→ 大文字小文字に統一することの副作用
***********************************************************************
<<< AssertFC >>>
***********************************************************************
AssertFC
(src)
Sub AssertFC( Path1 as string, Path2 as string )
2つのテキストファイルを比較して、異なれば diff ツールを開きます。
テキストファイルの文字コードが自動判定できるなら、文字コードが異なっても
テキストが同じであれば、同じと判定します。
文字コードが異なれば必ず異なると判定するときは、
IsSameBinaryFile
を使ってください。
大文字と小文字を区別しません。
Path2 のファイルの内容に、% を使った文字列変換関数を使うことができます。
参考
→ % を使った文字列変換関数
テスト
→ IsSameTextFile のテスト
c.RightHasPercentFunction or c.ErrorIfNotSame のケース
***********************************************************************
<<< AssertValue >>>
***********************************************************************
AssertValue
Sub AssertValue( Name as string, TestValue as variant, PassValue as variant,
CompareOption as interger )
値が範囲内であるかどうかをチェックし、範囲外なら詳細なメッセージを付けてエラーにします。
【引数】
Name
値の名前、エラーメッセージ用
TestValue
チェック対象の値
PassValue
範囲
CompareOption
比較オプション
サンプル
AssertValue "EqualNumber", a, 1, Empty
a = 1 であるかチェックします。
AssertValue "RangeNumber", a, Array( 1, 3 ), c.Range
1 ≦ a ≦ 3 であるかチェックします。
AssertValue "Str", a, Array( "A", "ABC" ), c.CaseSensitive
a = "A" または a = "ABC" であるかチェックします。
ソース
→ vbslib.vbs
テスト
→ T_Value.vbs # [T_AssertValue]
***********************************************************************
<<< ErrorValue >>>
***********************************************************************
ErrorValue
書きかけ
***********************************************************************
<<< その他 >>>
***********************************************************************
その他
→ ConvertToFullPath
テキストファイルの中の相対パスをフル・パスに変換します。
***********************************************************************
<<< 性能計測 >>>
***********************************************************************
性能計測
参考
→ BenchStart
***********************************************************************
<<< 開発環境操作 >>>
***********************************************************************
開発環境操作
Visual Studio 2005〜2010 を操作します。
→ devenv_rebuild
Visual Studio のソリューションをリビルドします
→ devenv_build
Visual Studio のソリューションをビルドします
→ devenv_clean
Visual Studio のソリューションをクリーンします
→ devenv_ver_name 環境変数
ファイル:
VisualStudio.vbs
テスト
→ T_devenv フォルダ
関連
→ Module Mixer 3
***********************************************************************
<<< devenv_rebuild >>>
***********************************************************************
devenv_rebuild
(src)
Sub devenv_rebuild( SlnPath as string, ConfigName as string )
Visual Studio のソリューションをリビルドします。
【引数】
SlnPath
ソリューション・ファイルのパス(.sln)
ConfigName
設定名("Release"など)
ソリューション・ファイルに書かれたバージョン情報を元に、
コンパイラのバージョンを自動的に選択します。
ビルドに失敗したら、E_BuildFail エラーになります。
ソース
→ VisualStudio.vbs
サンプル
Dim ds_:Set ds_= new CurDirStack
pushd "src"
devenv_rebuild "sample.sln", "Release"
popd
devenv_rebuild "src\sample_%devenv_ver_name%.sln", "Debug"
devenv_rebuild "sample.sln", "Release|x64"
Release|x64 が使えるかどうかは、.sln ファイルをテキストファイル
で開いて、そのコンフィグがあるかどうかで判断してください。
参考
→ Devenv コマンド ライン スイッチ (Web)
→ コマンドライン・コンパイル
→ devenv_ver_name 環境変数
テスト
→ T_devenv.vbs # [T_devenv_build]
→ T_devenv.vbs # [T_devenv_build_MultiFolder]
***********************************************************************
<<< devenv_build >>>
***********************************************************************
devenv_build
(src)
Sub devenv_build( SlnPath as string, ConfigName as string )
Visual Studio のソリューションをビルドします。
参考
→ devenv_rebuild
***********************************************************************
<<< devenv_clean >>>
***********************************************************************
devenv_clean
(src)
Sub devenv_clean( SlnPath as string )
Visual Studio のソリューションをクリーンします。
【引数】
SlnPath
ソリューション・ファイルのパス(.sln)
サンプル:
Dim ds_:Set ds_= new CurDirStack
pushd "src"
devenv_clean "sample.sln"
popd
参考
→ devenv_ver_name 環境変数
テスト
→ T_devenv.vbs # [T_devenv_build_MultiFolder]
***********************************************************************
<<< devenv_upgrade >>>
***********************************************************************
devenv_upgrade
(src)
Sub devenv_upgrade( SlnPath as string, Opt as Empty )
Visual Studio のソリューション・ファイルを新しい Visual Studio 用に変換します。
【引数】
SlnPath
古い Visual Studio のソリューション・ファイルのパス(.sln)
Opt
Empty または、c.MakeBackup
新しいバージョンとは、現在の PC にインストールされている Visual Studio のうち、
最も新しいバージョンのことです。
Opt に、c.MakeBackup を指定すると、変換前のファイルのバックアップを作成します。
ただし、c は、get_VisualStudioConsts の返り値です。
サンプル:
Dim ds_:Set ds_= new CurDirStack
pushd "src"
devenv_upgrade "sample.sln", Empty
popd
参考
→ devenv_ver_name 環境変数
→ /Upgrade (devenv.exe) (Web)
→ To the command line enthusiasts Some quick know-hows for Upgrading to VS 2010 (Web)
***********************************************************************
<<< get_VisualStudioConsts >>>
***********************************************************************
get_VisualStudioConsts
(src)
Function get_VisualStudioConsts() as Object
VisualStudio.vbs で使う定数の集合。
サンプル:
Dim c : Set c = get_VisualStudioConsts()
'// c.MakeBackup
***********************************************************************
<<< devenv_ver_name 環境変数 >>>
***********************************************************************
devenv_ver_name 環境変数
(src)
devenv_rebuild, devenv_clean などに指定する .sln ファイルのパスには、
%devenv_ver_name% を指定することができます。
devenv_rebuild "src\sample_%devenv_ver_name%.sln", "Release"
インストールされている Visual Studio に応じて、次の文字列に変換されます。
Visual Studio 2010 … "vs2010"
Visual Studio 2008 … "vs2008"
Visual Studio 2005 … "vs2005"
複数の Visual Studio がインストールされているときは、デフォルトでは最新のものが設定されますが、
PC の環境変数や、SetVar で devenv_ver_name を設定することで、バージョンを選択できます。
GetVar や env で、devenv_ver_name 環境変数の値を取得するときは、その前に
get_DevEnvObj を実行してください。
get_DevEnvObj
get_DevEnvObj
echo "Default: " + GetVar( "%devenv_ver_name%" )
devenv_ver_name
テスト
→ [T_devenv]
関連
→ devenv_ver_name 環境変数
***********************************************************************
<<< IsVisualStudioInstalled >>>
***********************************************************************
IsVisualStudioInstalled
(src)
Function IsVisualStudioInstalled( VersionNum as integer, IsExpress as boolean ) as boolean
指定したバージョンの Visual Studio がインストールされているかどうかを返します。
【引数】
VersionNum
バージョン番号
IsExpress
Express 版かどうか
返り値
インストールされているかどうか
***********************************************************************
<<< GetVisualStudioVersionNum >>>
***********************************************************************
GetVisualStudioVersionNum
(src)
Function GetVisualStudioVersionNum( VersionString as string ) as integer
Visual Studio のバージョン文字列(例:"vs2008")を数値(例:2008)に変換します。
***********************************************************************
<<< GetSlnFileVersion >>>
***********************************************************************
GetSlnFileVersion
(src)
Sub GetSlnFileVersion( SlnPath as string, out_VersionNum as integer,
out_IsExpress as boolean )
指定のソリューション・ファイルが使える Visual Studio のバージョンを返します。
【引数】
SlnPath
Visual Studio のソリューション・ファイルのパス(.sln)
out_VersionNum
(出力) バージョン番号。 2012, 2010, 2008, 2005
out_IsExpress
(出力) Express 版かどうか
***********************************************************************
<<< VisualStudioSlnClass >>>
***********************************************************************
VisualStudioSlnClass
(src)
Visual Studio の *.sln ファイルを読み込みます。
Load
してから
Projects
にアクセスしてください。
テスト
→ T_devenv.vbs # [T_devenv_SlnLoad]
***********************************************************************
<<< Load (VisualStudioSlnClass) >>>
***********************************************************************
Load (VisualStudioSlnClass)
(src)
Sub VisualStudioSlnClass::Load( SlnFilePath as string )
Visual Studio の *.sln ファイルを読み込みます。
【引数】
SlnFilePath
*.sln ファイルのパス
***********************************************************************
<<< Projects (VisualStudioSlnClass) >>>
***********************************************************************
Projects (VisualStudioSlnClass)
Dim VisualStudioSlnClass::Projects as ArrayClass of VisualStudioSlnProjectClass
VisualStudioSlnProjectClass
ソリューションの中にあるプロジェクトの一覧。
Load
してからアクセスしてください。
***********************************************************************
<<< VisualStudioSlnProjectClass >>>
***********************************************************************
VisualStudioSlnProjectClass
(src)
Class VisualStudioSlnProjectClass
Public ProjectName '// as string
Public RelativePath '// as string
Public ProjectGuid '// as string
End Class
参考
→ VisualStudioSlnClass
***********************************************************************
<<< DeleteProjectInVisualStudioSln >>>
***********************************************************************
DeleteProjectInVisualStudioSln
(src)
Sub DeleteProjectInVisualStudioSln( SlnFilePath as string, ProjectNameh as string )
Visual Studio の *.sln ファイルの中にある1つのプロジェクトを削除します。
【引数】
SlnFilePath
*.sln ファイルのパス
ProjectNameh
削除するプロジェクトの名前
プロジェクトの名前は、
VisualStudioSlnProjectClass::ProjectName
から参照できます。
テスト
→ T_devenv.vbs # [T_devenv_DeleteProjectsInSln]
***********************************************************************
<<< インストール、レジストリ、OS >>>
***********************************************************************
インストール、レジストリ、OS
→ Shutdown
PC の電源を切ります。
→ RegEnumKeys
レジストリのサブキーを列挙します。
→ RegEnumValues
指定のレジストリ・キーに入っている値を列挙します。
→ RegExists
指定のレジストリ・キーか値が存在するかどうかを判定します。
→ RegExport
レジストリ・キーの値を .reg ファイルに出力します。
→ RegRead
レジストリからリードします。
→ RegWrite
レジストリにライトします。
→ InstallRegistryFileOpen
ファイルをダブルクリックしたときに開くプログラムを設定します。
→ InstallRegistryFileVerb
ファイルの右クリック・メニューの1つの項目を追加します。
関連
→ レジストリ (VBS)
→ バージョン判定、環境変数
***********************************************************************
<<< Shutdown >>>
***********************************************************************
Shutdown
[ 親: システム、OS、レジストリ ]
(src)
Sub Shutdown( Operation as string, CountDownTimeSec as integer )
PC の電源を切ります。
【引数】
Operation
電源の切り方(下記)
CountDownTimeSec
電源を切るまでの時間(秒)
ソース
→ vbslib.vbs
→ SetSuspendState フォルダー
サンプル
main_child が終了したらデフォルト設定で電源を切る。
RunProg "cscript main_child.vbs", ""
Shutdown Empty, Empty
通常 60秒後にシャットダウンします。
エラーが発生しても、電源を切るには、
RunProg などで、メイン処理を行う子プロセス
を起動して、子プロセスが終了する(RunProg から戻る)まで待ってから、Shutdown
を実行してください。 こうすれば、Ctrl-C や閉じるボタンが押されても電源が切れます。
サンプル
30秒後にスリープする
Shutdown "Sleep", 30
Operation 引数
次のいずれかの文字列を指定できます。
"PowerOff", "Reboot", "Hibernate", "Sleep", "Standby"
スリープするときは、scriptlib\vbslib_XXX\SetSuspendState フォルダが必要です。
Sleep と Standby は同じです。
Windows 8 タブレットのコネクテッド・スタンバイ には対応していません。
補足
Shutdown 関数を呼び出すと、カウントダウンを始め、下記のウィンドウが開きます。
ただし、CountDownTimeSec = 0 のときは開きません。
[OK] を押せば、すぐに電源を切ります。
[キャンセル]を押すか、VBScript の
コンソールを閉じると、電源を切らなく
なります。
デフォルト設定は、
setting フォルダ
に下記の関数の定義によって設定します。
関数定義がないときは、"PowerOff", 60 になります。
Function Setting_getShutdownOperation()
Setting_getShutdownOperation = "PowerOff"
End Function
Function Setting_getShutdownCountDownTimeSec()
Setting_getShutdownCountDownTimeSec = 60
End Function
サンプル
音楽を鳴らしながら、60秒待ち、スリープする
g_CommandPrompt = 1 '// この行だけ SetupVbslibParameters に記述
Sub main()
Play "******.mp3"
Dim e ' as Err2
If TryStart(e) Then On Error Resume Next
Shutdown "Sleep", 60
If TryEnd Then On Error GoTo 0
e.Clear '// ユーザ・キャンセルしてもウィンドウを閉じるため
End Sub
このスクリプトを、Windows のタスクに登録しておくと、1時間ごとにスリープに入ることを
試みるようなことができます。
参考
→ タスク (Windows でのスケジュール実行)
Windows 7 では、地デジの予約録画などによる、
「半スリープ状態」
から、
Shutdown "Sleep" してもスリープ状態になりません。
wakeonlan : 無停電 Linux サーバーから別の PC の電源を入れる
まず、電源を入れる PC の準備をします。
Windows XP の場合、
[ スタート > マイコンピューター ] を右クリック [ プロパティ > ハードウェア > デバイス
マネージャ ] から、ネットワーク アダプタの子ノードの中から該当するアダプタを
右クリック [ プロパティ ]、[ 詳細設定 > Wake Up Capabilities ] を [ Magic Packet ]、
[ 電源の管理 > このデバイスで、コンピュータのスタンバイ状態を解除できるように
する ] にチェックします。
PC の電源を切ってから、再度電源を入れてすぐに BIOS の設定画面を開き(機種
依存です。例:F2を押す)、Wake On LAN を有効にします(例:Power > Automatic
Power On > Wake on LAN = Primary)
『無停電の Linux サーバー』 にログインして、wakeonlan コマンドを実行します。
なお、MAC アドレスは、コマンドプロンプトから ipconfig /all を実行すると分かります。
wakeonlan <電源を入れるPCのMACアドレス>
例:
./wakeonlan 11:22:33:44:55:66
電源を落とすには、リモート・デスクトップ経由で、コマンドプロンプトから
shutdown /s /f
を実行するか、
vbslib Prompt.vbs の Shutdown
を実行するか、無停電 Linux サーバー
から下記のコマンドを入力してください。
/usr/bin/net rpc -S <マシン名> -U <アカウント名>%<パスワード> shutdown -t 10
<アカウント名> は、<ユーザ名> または <ドメイン名>\\<ユーザ名>
テスト
→ T_Shutdown_Manually.vbs
それぞれの OS のバージョンで行うこと
***********************************************************************
<<< IsScreenSaverRunning >>>
***********************************************************************
IsScreenSaverRunning
[ 親: システム、OS、レジストリ ]
(src)
Function IsScreenSaverRunning() as boolean
スクリーンセーバーが動いているかどうかを返します。
テスト
→ T_ScreenSaver_Manually.vbs # [T_IsScreenSaverRunning]
***********************************************************************
<<< RegEnumKeys >>>
***********************************************************************
RegEnumKeys
[ 親: システム、OS、レジストリ ]
(src)
Sub RegEnumKeys( Path as string, out_Keys as array of string, Opt as integer )
レジストリのサブキーを列挙します。
【引数】
Path
レジストリのキーのパス
out_Keys
(出力) サブキーのフルパスの配列。 末尾に \ は無い
Opt
オプション。 Empty か F_SubFolder
ファイル:
System.vbs
サブキーが無いときは、UBound( out_Keys ) = -1 になります。
Path の末尾に \ があってもなくても、キー(フォルダーのようなもの)を指定したことに
なります。
サンプル:
Dim keys
RegEnumKeys "HKEY_CURRENT_USER\Software\_Test", keys, Empty
'// keys(0) = "HKEY_CURRENT_USER\Software\_Test\Sub"
'// keys(1) = "HKEY_CURRENT_USER\Software\_Test\Sub2"
テスト
→ T_Reg.vbs # T_Reg1
***********************************************************************
<<< RegEnumValues >>>
***********************************************************************
RegEnumValues
[ 親: システム、OS、レジストリ ]
(src)
Sub RegEnumValues( Path as string, out_Values as array of RegValueName )
RegValueName
指定のレジストリ・キーに入っている値を列挙します。
【引数】
Path
レジストリのキーのパス
out_Values
(出力) 値と型名の配列
→ RegValueName クラス
ファイル:
System.vbs
サンプル:
Dim values
RegEnumValues "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\" + _
"CurrentVersion\Setup", values
Path の末尾に \ があってもなくても、キー(フォルダーのようなもの)を指定した
ことになります。
RegValueName クラス
Class RegValueName
Public Name as string
Public Type_ as string
End Class
テスト
→ T_Reg.vbs # T_Reg1
***********************************************************************
<<< RegExists >>>
***********************************************************************
RegExists
(src)
[ 親: システム、OS、レジストリ ]
Sub RegExists( RegPath as string )
指定のレジストリ・キーか値が存在するかどうかを判定します。
【引数】
RegPath
レジストリのキーのパス
Path の末尾が \ のときは、キーがあるかどうかを判定します。
Path の末尾が \ ではないときは、値があるかどうかを判定します。
ファイル:
System.vbs
サンプル:
If RegExists( "HKEY_CURRENT_USER\Software\_Test\" ) Then Fail
***********************************************************************
<<< RegRead >>>
***********************************************************************
RegRead
[ 親: システム、OS、レジストリ ]
(src)
Function RegRead( Path as string ) as variant
レジストリからリードします。
【引数】
Path
リードする場所。 キーへのパス+値の名前
返り値
値、または Empty
RegRead (Shell)
との違いは、キーが見つからないときにエラーになるのではなく、
Empty を返すところです。
Path の最後に \ があると、キーの (規定) をリードします。
***********************************************************************
<<< RegExport >>>
***********************************************************************
RegExport
[ 親: システム、OS、レジストリ ]
(src)
Sub RegExport( RegPath as string, OutFilePath as string, Opt as variant )
指定のレジストリ・キーに入っている値を .reg ファイルに出力します。
【引数】
RegPath
レジストリのキーのパス
OutFilePath
出力ファイルパス
Opt
オプション。 Empty か F_SubFolder
ファイル:
System.vbs
対応しているキーの型は、REG_SZ のみです。
サンプル:
RegExport "HKEY_CURRENT_USER\Control Panel\Keyboard", _
"keyboard.reg", F_SubFolder
テスト
→ T_Reg.vbs # T_RegExport
***********************************************************************
<<< RegWrite >>>
***********************************************************************
RegWrite
[ 親: システム、OS、レジストリ ]
(src)
Sub RegWrite( Path as string, Value as string or integer, Type as string or Empty )
レジストリにライトします。
【引数】
Path
ライトする場所。 キーへのパス+値の名前
Value
値、または Empty(=値を消す)
Type
値のタイプ, "REG_SZ", "REG_DWORD" など、または Empty(*1)
ファイル:
System.vbs
Path によっては管理者権限が必要です
RegWrite (Shell)
との違いは、エラーメッセージの内容です。
Path の最後に \ があると、キーの (規定) に設定します。
(*1) Type = Empty のときは、 Value の型によって自動的に型を判定します。
サンプル:
RegWrite "HKEY_CLASSES_ROOT\.ext\", "ExtSample", Empty
***********************************************************************
<<< RegDelete >>>
***********************************************************************
RegDelete
[ 親: システム、OS、レジストリ ]
(src)
Sub RegDelete( Path as string )
レジストリの値、またはキーを削除します。
Path の末尾が "\" のときは、キー(フォルダーのようなもの)を削除します。
サブ・キーや値があるときでも、削除できます。
値の名前に "\" を含むときは、
ただし、RegDelete でキーを削除するときは、そのキー(またはサブ・キー)が
持つ値の名前に "\" を含んでいても正しく処理します。
StdRegProv::DeleteValue
を使ってください。
サンプル:
RegDelete "HKEY_CLASSES_ROOT\.svg\"
テスト
→ T_Reg_Manually.vbs # T_RegWriteRead
→ T_Reg_Manually.vbs # T_FileAssocOpen
最後の T_FileAssocProg2.exe アンインストールで、値の名前に "\" を含む
値を持つキーを削除しています。
***********************************************************************
<<< OpenForRegFile >>>
***********************************************************************
OpenForRegFile
(src)
Function OpenForRegFile( RegFilePath as string ) as EditRegFile
レジストリファイル(*.reg)を編集します。
【引数】
RegFilePath
レジストリファイルのパス
返り値
EditRegFile オブジェクト
サンプル:
Dim f : Set f = OpenForRegFile( "Sample.reg" )
If IsEmpty( f.RegRead( "HKEY_CLASSES_ROOT\.ext\" ) ) Then _
f.RegWrite "HKEY_CLASSES_ROOT\.ext\", "ExtSample", "REG_SZ"
f = Empty '// Write
Sample.reg
HKEY_CLASSES_ROOT\.ext\
ExtSample
ランダムアクセスに対応しています。 OpenForRead や OpenForWrite のように
シーケンシャル(ファイルの先頭から順番)にアクセスする必要はありませんし、
変更しないキーまで Write する必要はありません。
存在しないキーを新規に Write したときは、シーケンシャル(RegWriteした順番)
にファイルに記述されます。 Empty の値を Write すると、そのキーは削除されます。
元々書かれていたコメントは保持されます。
テスト
→ T_Reg.vbs # T_RegFile
関連
→ OpenForEnvVarsFile
→ .ini ファイル
***********************************************************************
<<< EditRegFile クラス >>>
***********************************************************************
EditRegFile クラス
(src)
レジストリファイル(*.reg)を編集します。 OpenForRegFile から取得できます。
メソッド
.RegRead
レジストリファイルからリードします。
.RegWrite
レジストリファイルにライトします。
.Close
レジストリファイルを閉じます。 アクセスを終了します。
***********************************************************************
<<< Close (EditRegFile) >>>
***********************************************************************
Close (EditRegFile)
(src)
Sub EditRegFile::Close()
レジストリファイルを閉じます。 アクセスを終了します。
デストラクタによっても自動的にファイルを閉じます。
閉じる前にエラーが発生してデストラクタが呼ばれたら、Write した内容は反映されません。
***********************************************************************
<<< InstallRegistryFileOpen >>>
***********************************************************************
[ 親: システム、OS、レジストリ ]
(src)
InstallRegistryFileOpen
Sub InstallRegistryFileOpen( Extension as string, ExePath as string, IsDefault as boolean )
ファイルをダブルクリックしたときに開くプログラムを設定します。(現在のユーザーのみ)
【引数】
Extension
拡張子
ExePath
プログラムの exe ファイルのパス。相対パス可。
IsDefault
True = ダブルクリックしたときに開く、 False = プログラムの選択に登録する
ファイル:
System.vbs
サンプル:
InstallRegistryFileOpen ".svg", "Snap Note.exe", True
Windows8 では、関連する設定に矛盾があると、「この種類のファイル (.<拡張子>)
を開くには、どのアプリを使いますか?」が常に表示されます。
下記 Hash キーがあるときは、レジストリーの設定を直接設定しただけでは、「この種類の
ファイル (.<拡張子>)を開くには、どのアプリを使いますか?」が常に表示されるようになります。
セキュリティーの機能の可能性があります。 少なくとも、マクロソフト製品が使う拡張子は、
Hash キーができます。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\
FileExts\.<拡張子>\UserChoice\Hash
ダブルクリックしたときに開くプログラムを変更できるように戻すには、
UninstallRegistryFileOpen
などで、レジストリーの設定を元に戻してから、ファイルを右クリック [ プログラムから開く >
既定のプログラムの選択 ] を選んでください。
マクロソフト製品(または、Windows インストーラーでインストールしたプログラム?)が使わない
拡張子には Hash キーができず、レジストリーの設定だけで関連付けすることができます。
参考
→ ファイルをダブルクリックしたときのコマンド
→ 既定のプログラムの選択、プログラムから開く
テスト
→ T_Reg_Manually.vbs # [T_FileAssocOpen]
関連
→ UninstallRegistryFileOpen
ダブルクリックしたときの設定解除
→ InstallRegistryFileVerb
ファイルの右クリック・メニュー
→ InstallRegistryFileOpenCommand
コマンドラインを指定して開くプログラムを設定する
***********************************************************************
<<< UninstallRegistryFileOpen >>>
***********************************************************************
[ 親: システム、OS、レジストリ ]
(src)
UninstallRegistryFileOpen
Sub UninstallRegistryFileOpen( Extension as string, ExePath as string )
ファイルをダブルクリックしたときに開くプログラムを設定解除します。(現在のユーザーのみ)
【引数】
Extension
拡張子
ExePath
プログラムの exe ファイルのパス。相対パス可。
ファイル:
System.vbs
サンプル:
UninstallRegistryFileOpen ".svg", "Snap Note.exe"
テスト
→ T_Reg_Manually.vbs # [T_FileAssocOpen]
関連
→ InstallRegistryFileOpen
ダブルクリックしたときの設定
***********************************************************************
<<< InstallRegistryFileOpenCommand >>>
***********************************************************************
[ 親: システム、OS、レジストリ ]
(src)
InstallRegistryFileOpenCommand
Sub InstallRegistryFileOpenCommand( Extension as string,
ProgID as string, CommandLine as string, IsDefault as boolean )
ファイルをダブルクリックしたときに開くプログラムを設定します。(現在のユーザーのみ)
【引数】
Extension
拡張子
ProgID
プログラムの識別子
CommandLine
コマンドライン
IsDefault
True = ダブルクリックしたときに開く、 False = プログラムの選択に登録する
ファイル:
System.vbs
サンプル
InstallRegistryFileOpenCommand ".svg", "Snap Note.exe", """Snap Note.exe"" ""%1""", True
サンプル
prompt_vbs = SearchParent( "vbslib Prompt.vbs" )
command_line = """%windir%\System32\cmd.exe"" /K (""%windir%\System32\cscript.exe"" //nologo """+_
prompt_vbs +""" TranslateTest ""%1"" """")"
InstallRegistryFileOpenCommand "trans", "TranslateTest", command_line, True
参考
→ ファイルをダブルクリックしたときのコマンド
テスト
→ T_Reg_Manually.vbs # T_FileAssocOpen_OS_Exe
関連
→ UninstallRegistryFileOpenCommand
→ GetCScriptGUI_CommandLine
***********************************************************************
<<< UninstallRegistryFileOpenCommand >>>
***********************************************************************
UninstallRegistryFileOpenCommand
Sub UninstallRegistryFileOpenCommand( Extension as string, ProgID as string )
ファイルをダブルクリックしたときに開くプログラムを設定解除します。(現在のユーザーのみ)
【引数】
Extension
拡張子
ProgID
プログラムの識別子
ファイル:
System.vbs
サンプル:
UninstallRegistryFileOpenCommand ".svg", "Snap Note.exe"
テスト
→ T_Reg_Manually.vbs # T_FileAssocOpen_OS_Exe
関連
→ InstallRegistryFileOpenCommand
***********************************************************************
<<< RegWriteOpenExt >>>
***********************************************************************
[ 親: システム、OS、レジストリ ]
(src)
RegWriteOpenExt
廃止されました。 代わりは……
→ InstallRegistryOfFileOpen
Sub RegWriteOpenExt( Ext, KeyName, Explain, Command, Opt )
指定の拡張子の [開く(&O)] メニューのコマンドを登録します。
【引数】
Ext
拡張子。先頭はピリオド。例:.ext
KeyName
レジストリのキーの名前(英語)
Explain
タイプの説明に表示される内容
Command
実行するコマンドライン
Opt
通常 Empty
サンプル:
.c ファイルをメモ帳で開くようにします。
RegWriteOpenExt ".c", "cfile", "C Language source", _
"C:\Windows\Notepad.exe ""%1""", Empty
ファイル:
System.vbs
管理者権限が必要です
今まで関連付けられていた情報は失われます。
***********************************************************************
<<< InstallRegistryFileVerb >>>
***********************************************************************
[ 親: システム、OS、レジストリ ]
(src)
InstallRegistryFileVerb
Sub InstallRegistryFileVerb( ProgID as string, Verb as string, Caption as string,
CommandLine as string )
ファイルの右クリック・メニューの1つの項目を追加します。(現在のユーザーのみ)
【引数】
ProgID
"*"、または RegReadExtProgID の返り値 (*1)
Verb
メニュー項目の識別子(英語)
Caption
右クリック・メニューに表示する文字列。(*2)
CommandLine
コマンドライン。 %1 は、ファイルのパスに置き換わります。
ファイル:
System.vbs
サンプル:
InstallRegistryFileVerb RegReadExtProgID( "svg" ), "edit", "Snap Note (&Z)", _
""""+ GetFullPath( "Snap Note.exe", Empty ) +""" ""%1"""
(*1)
RegReadExtProgID
で、拡張子と現在関連付けられている ProgID を取得できます。
フォルダーに対する設定をするときは、ProgID="Folder" を指定してください。
すべてのファイルやフォルダーに対する設定をするときは、ProgID="*" を指定してください。
(*2)
& の次の文字は、右クリック・メニューを表示している状態で押すと選択できるキーボード
のキーになります。
参考
→ 右クリックして表示されるメニュー (特定の拡張子のファイル)
テスト
→ T_Reg_Manually.vbs # [T_FileAssocVerb]
関連
→ UninstallRegistryFileVerb
右クリック・メニューの削除
→ InstallRegistryFileOpen
ダブルクリックしたときの設定
→ RegReadExtProgID
拡張子と関連付けられている ProgID の取得
***********************************************************************
<<< UninstallRegistryFileVerb >>>
***********************************************************************
[ 親: システム、OS、レジストリ ]
(src)
UninstallRegistryFileVerb
Sub UninstallRegistryFileVerb( ProgID as string, Verb as string )
ファイルの右クリック・メニューの1つの項目を削除します。(現在のユーザーのみ)
【引数】
ProgID
"*"、または RegReadExtProgID の返り値 (*1)
Verb
メニュー項目の識別子(英語)
ファイル:
System.vbs
サンプル:
InstallRegistryFileVerb RegReadExtProgID( "svg" ), "edit"
(*1)
RegReadExtProgID
で、拡張子と現在関連付けられている ProgID を取得できます。
関連
→ InstallRegistryFileVerb
右クリック・メニューの追加
***********************************************************************
<<< RegWriteAsterExt >>>
***********************************************************************
[ 親: システム、OS、レジストリ ]
(src)
RegWriteAsterExt
廃止されました。 代わりは……
→ InstallRegistryFileVerb
Sub RegWriteAsterExt( KeyName, Caption, Command, Opt )
すべてのファイルに対するコンテキストメニューを追加登録します。
【引数】
KeyName
レジストリのキーの名前(英語)
Caption
コンテキストメニューに表示される内容
Command
実行するコマンドライン
Opt
通常 Empty
ファイル:
System.vbs
管理者権限が必要です
サンプル:
'--- start of parameters for vbslib include -------------------------------
g_admin = 1
:
'--- end of parameters for vbslib include ---------------------------------
Sub main()
Dim prog : prog = GetFullPath( "bz", Empty )
RegWriteAsterExt "bz", "bz (binary editor)", prog + "\bz.exe ""%1""", Empty
End Sub
***********************************************************************
<<< RegReadExtProgID >>>
***********************************************************************
[ 親: システム、OS、レジストリ ]
(src)
RegReadExtProgID
Function RegReadExtProgID( Extension as string ) as string
拡張子と現在関連付けられている ProgID を取得します。(現在のユーザー)
フォルダーに対応する ProgID は、"Folder" です。
関連
→ InstallRegistryFileVerb
右クリック・メニューの追加
***********************************************************************
<<< MsiModify >>>
***********************************************************************
MsiModify
(src)
Sub MsiModify( MsiPath as string, TableName as string,
KeyColumnName as string, ValueColumnNum as integer,
Key as string, NewValue as string )
Windows 用のインストール・パッケージ(.msi)のデータベースを修正します。
【引数】
MsiPath
インストール・パッケージ(.msi)のファイルのパス
TableName
データベースのテーブル名
KeyColumnName
キーがある列の名前
ValueColumnNum
値がある列の番号(最初=1)
Key
キーの名前
NewValue
新しい値
サンプル
Sub Main( Opt, AppKey )
Dim msi_path : msi_path = "sample.msi"
Dim new_values : Set new_values = Dict(Array( "Utilities", "INSTALLDIR" ))
Dim key
For Each key In new_values.Keys
MsiModify msi_path, "Directory", "Directory", 2, key, new_values.Item( key )
Next
End Sub
参考
→ Orca ツール、msi ファイルのデータベースの修正
***********************************************************************
<<< get_WMI >>>
***********************************************************************
[ 親: システム、OS、レジストリ ]
(src)
get_WMI
Function get_WMI( ComputerName as string, ClassName as string ) as Object
WMI オブジェクトを返します。
【引数】
ComputerName
コンピューター名。 Empty = ログオンしているコンピューター
ClassName
WMI のクラス名
返り値
エラーコード、正常=0
参考
→ WMI (Windows Management Instrumentation)
***********************************************************************
<<< GetPythonInstallPath >>>
***********************************************************************
GetPythonInstallPath
(src)
Function GetPythonInstallPath() as string
Python がインストールされているフォルダーのパスを返します。
レジストリーの情報と、
SetTargetPythonVersion
の設定を元にしています。
***********************************************************************
<<< SetTargetPythonVersion >>>
***********************************************************************
SetTargetPythonVersion
(src)
Sub SetTargetPythonVersion( MinVer as integer, MaxVer as integer )
Python に関する機能の対象となるバージョンの範囲を設定します。
【引数】
MinVer
最小バージョン、または、Empty
MaxVer
最大バージョン、または、Empty
本関数を呼び出すと、
GetPythonInstallPath
や
IsInstallPython
の動きが
変わります。
***********************************************************************
<<< IsInstallPython >>>
***********************************************************************
IsInstallPython
(src)
Function IsInstallPython() as boolean
Python がインストールされているかどうかを返します。
***********************************************************************
<<< その他 >>>
***********************************************************************
その他
→ GetOSVersion
→ SetTaskStartTime
タスクに登録する
→ 送る、に登録する
***********************************************************************
<<< ネットワーク >>>
***********************************************************************
ネットワーク
→ DownloadByHttp
インターネットからダウンロードします。
→ SetVirtualFileServer
仮想ファイル・サーバーを設定します。
→ GetPercentURL
% 文字を使った正規の URL に変換します。
→ CheckWSHNetwork
ファイアウォールをチェックします。
→ start
ホームページを開きます。
***********************************************************************
<<< DownloadByHttp >>>
***********************************************************************
キーワード:
sage_p_downloader.exe
DownloadByHttp
Sub DownloadByHttp( DownloadURL as string, OutLocalPath as string )
インターネットからダウンロードします。
【引数】
DownloadURL
ダウンロードする URL、または、その配列
OutLocalPath
ダウンロードしたファイルの保存先パス
DownloadURL 引数が配列のときは、OutLocalPath はフォルダーのパスになります。
DownloadURL 引数が配列のときは、実行後は、DownloadURL 配列の内容が、
保存先のファイルのパスに置き換わります。
サンプル
DownloadByHttp "http://www.sage-p.com/index.html", "index.html"
DownloadURL には、URL に含むことができない文字も含むことができます。
内部で、GetPercentURL を呼び出しています。
ダウンロードを含む処理をするときは、SetVirtualFileServer を使えば、実際に
ネットワークにアクセスする前に、ローカル PC だけで動作確認ができます。
参考
→ SetVirtualFileServer
デフォルトでは、Sage Plaisir 21 のホームページからダウンロードするときのみ、
ユーザーの許可を確認することなくダウンロードできます。 他のホームページ
からダウンロードするときは、ユーザーの許可を求められます。
他のホームページからダウンロードする処理を含むスクリプトを使って自動化する
ときは、ユーザーの許可を求めない exe を作成する必要があります。 デフォルト
では、ダウンロードを実際に行うのは、scriptlib\vbslibXXX\sage_p_downloader に
入っている sage_p_downloader.exe ですが、_src\Test\vbslib_test\scriptlib\
vbslib\sage_p_downloader\src にソースが含まれているので、
修正は簡単です。 ソースに記述されたダウンロードできるドメインを
変更し、再コンパイルし、exe 名を変更して、Netword.vbs にある DownloadByHttp
の定義を編集してください。 exe 名を変更することで、ウィルス対策ソフトが
ネットワークアクセスの許可を再度行います。
ソース
→ Network.vbs
テスト
→ T_Download.vbs
T_SetVirtualFileServer
T_SetVirtualFileServer_Files
T_SetVirtualFileServer_Files_Manually
関連
→ SetVirtualFileServer
→ GetPercentURL
***********************************************************************
<<< SetVirtualFileServer >>>
***********************************************************************
SetVirtualFileServer
Sub SetVirtualFileServer( VirtualURL as string, LocalPath as string )
ネットワーク・サーバーの代わり(仮想ファイル・サーバー)を設定します。
【引数】
VirtualURL
仮想ファイル・サーバーが応答するベース URL
LocalPath
VirtualURL に対応するローカル・フォルダのパス
ソース
→ Network.vbs
サンプル
キーワード:
VirtualServer, TestServer
If not IsEmpty(GetVar( "VirtualServer" )) Then
SetVirtualFileServer "http://www.sage-p.com/", "C:\www_sage-p_com\"
End If
If not IsEmpty(GetVar( "TestServer" )) Then
DownloadByHttp "http://www.sage-p.com/index_test.html", "index.html"
Else
DownloadByHttp "http://www.sage-p.com/index.html", "index.html"
End IF
C:\www_sage-p_com\
_test
上記は、環境変数 VirtualServer が定義されていたら、
copy "C:\www_sage-p_com\index.html", "index.html" と同じ処理をします。
VirtualServer が定義されていないで、TestServer が定義されていたら
http://www.sage-p.com/index_test.html からダウンロードします。
どちらも定義されていなかったら、(リリース版そのものとして)
http://www.sage-p.com/index.html からダウンロードします。
SetVirtualFileServer を使うと、
DownloadByHttp
を呼び出しても、インターネットからダウン
ロードせず、設定したローカル・フォルダからコピーします。
この機能により、一般公開されているサーバーを変更しないでテストができます。
VirtualServer の末尾の文字が / なら、LocalPath の末尾は \ にしてください。
***********************************************************************
<<< GetPercentURL >>>
***********************************************************************
GetPercentURL
Function GetPercentURL( UnicodeURL as string ) as string
URL に使えない文字があったときに、% 文字を使った URL に変換します。
【引数】
UnicodeURL
URL に使えない文字も含まれた URL
返り値
URL に使える文字だけを使った URL
ソース
→ Network.vbs
サンプル
url = GetPercentURL( "http://www.sage-p.com/download file.zip" )
url は、 "http://www.sage-p.com/download%20file.zip" になります。
標準仕様 rfc1738-ja (下記)では、~ 文字は %7E に置き換わりますが、置き換わらない方がデファクト・
スタンダードなので、GetPercentURL では ~ のままになります。
URLに使える文字 rfc1738-ja
RFC 2396, RFC 3986
uchar(-escape)
hsegment
/?%
Windows では、互換性のため、\(バックスラッシュ)を / に置き換えるとよいでしょう。
fooooooo://example.com:8042/over/there?name=ferret#nosefragment
(scheme) ( authority )( path ) ( query ) ( fragment )
→ RFC 3986 - 3. Syntax Components (Web)
0
1
2
3
4
5
6
7
url = httpurl | ftpurl | newsurl |
nntpurl | telneturl | gopherurl |
waisurl | mailtourl | fileurl |
prosperourl | otherurl
0
spc
0
@
P
`
p
1
!
1
A
Q
a
q
2
"
2
B
R
b
r
3
#
3
C
S
c
s
httpurl = "http://" hostport [ "/" hpath [ "?" search ]]
4
$
4
D
T
d
t
5
%
5
E
U
e
u
hpath = hsegment *[ "/" hsegment ]
hsegment = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
search = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
6
&
6
F
V
f
v
7
'
7
G
W
g
w
8
(
8
H
X
h
x
9
)
9
I
Y
i
y
uchar = unreserved | escape
A
LF
*
:
J
Z
j
z
B
+
;
K
[
k
{
unreserved = alpha | digit | safe | extra
escape = "%" hex hex
C
,
<
L
\
l
|
D
CR
-
=
M
]
m
}
E
.
>
N
^
n
~
safe = "$" | "-" | "_" | "." | "+"
extra = "!" | "*" | "'" | "(" | ")" | ","
F
/
?
O
_
o
0
1
2
3
4
5
6
7
参考
→ Uniform Resource Identifier (URI): Generic Syntax (Web)
関連
→ ConvertCharCodeInHref
***********************************************************************
<<< LockByFileMutex >>>
***********************************************************************
LockByFileMutex
Function LockByFileMutex( UNC_FilePath as string, TimeOut_msec as integer ) as FileMutexClass
ファイル・サーバーに対する排他制御を開始します。
【引数】
UNC_FilePath
排他制御を管理するファイルのパス
TimeOut_msec
タイムアウト(ミリ秒)、または、c.Forever
返り値
ロック状態を保持しているオブジェクト
→ FileMutexClass
UNC_FilePath に、ファイル・サーバー、または、ローカルのファイルのパスを指定
してください。
指定したファイルには、ロックしているユーザー名 %USERDOMAIN%\%USERNAME%
(例:PC01\User1)が上書きされ、書き込み禁止、読み込み許可状態になります。
ロック状態を解除したら、ファイルを削除します。
FileMutexClass
LockByFileMutex 関数の返り値です。
FileMutexClass のオブジェクトが削除されると、ロック状態を解除します。
Close メソッド(引数なし)を呼び出しても解除できます。
サンプル
Set c = g_VBS_Lib
Set mutex = LockByFileMutex( "\\PC01\Folder\_Mutex.txt", c.Forever ) '// ロック開始
...
mutex = Empty '// ロック終了
ソース
→ Network.vbs
テスト
→ T_FileMutex_Manually.vbs
***********************************************************************
<<< CheckWSHNetwork >>>
***********************************************************************
CheckWSHNetwork
→ CheckWSHNetwork フォルダ
WSH (wscript.exe, cscript.exe) に、ファイアウォールがネットワークアクセスを許可しているか
どうかをチェックするスクリプトです。
CheckWSHNetwork.vbs をダブルクリックすると起動します。
cscript.exe または wscript.exe に、ネットワークアクセスを許可すると危険かもしれませんが、
Windows7 のファイアウォールは、WSH によるネットワークアクセスをブロックしないで
実行できます。 (ダウンロードサーバーのドメインで識別するのかもしれません?)
***********************************************************************
<<< vbs_inc, vbslib include (vbslib のコア・システム) >>>
***********************************************************************
[ テスト ]
vbs_inc, vbslib include (vbslib のコア・システム)
複数の VBScript ファイルをインクルードするライブラリです。
scriptlib フォルダの中の vbs_inc.vbs ファイルの中にあり、内部的に使われます。
Main 関数
があるスクリプト・ファイルに、vbs_inc をインクルードするコード(vbslib include
)が必要です。 そのコードは、
Short Hand Prompt
を使って新規作成できるスクリプトなど
に入っているので参考にしてください。
vbslib include は、scriptlib\setting フォルダーの中にある .vbs ファイル(通常、
vbs_inc_setting.vbs) に書かれた
Setting_getIncludePathes 関数
に書かれた .vbs ファ
イルをロードします。
main
sample
メイン・スクリプト (vbslib includeを含む)
→ Main 関数
scriptlib
vbslib
vbs_inc.vbs
vbs_inc ライブラリ本体
→ vbs_inc.vbs
setting
設定フォルダ
vbs_inc_setting.vbs
vbs_inc の設定
→ Setting_getIncludePathes
sample_lib
インクルードするライブラリのサンプル
→ ライブラリ.vbs のルール
は、インクルードの方向
参考
→ vbs_inc/setting の処理フロー
→ 正常終了時の動作
vbs_inc は、次のグローバル変数を定義しています。
→ g_debug
デバッガに接続しているかどうか(するかどうか)
→ g_debug_params
デバッガに接続するときのコマンドライン・パラメータ
→ g_vbslib_path
vbs_inc.vbs のフル・パス
→ g_vbslib_folder
scriptlib フォルダのフル・パス。末尾に \ が付く
→ g_vbslib_ver_folder
vbs_inc.vbs があるフォルダのフル・パス。末尾に \ が付く
→ g_IncludePathes
インクルードする VBS ファイルのパスの配列
→ g_CommandPrompt
コマンドプロンプトで実行するかどうか
→ g_Vers
バージョン番号の集合です。
→ g_cut_old
古い関数でブレークするようにします。
→ g_is_cscript_exe
コマンドライン(cscript.exe)で実行しているかどうか
→ g_admin
起動時に管理者へログインするのかしないのか
→ g_fs
g_fs = CreateObject( "Scripting.FileSystemObject" )
→ g_sh
g_sh = WScript.CreateObject("WScript.Shell")
→ グローバル変数の初期化、g_InitializeModule
***********************************************************************
<<< vbs_inc.vbs >>>
***********************************************************************
vbs_inc.vbs
vbs_inc.vbs には、インクルードする vbslib のバージョンや、vbslib が入っているフォルダーを
選択して、vbslib をインクルードするスクリプトが書かれています。
vbs_inc.vbs は、
メイン.vbs
からインクルードされます。
インクルードする前に、次の変数に値を代入しておいてください。
g_vbslib_path 変数
g_Vers.Item("vbslib")
vbs_inc.vbs の中で次の変数を設定(再設定)してください。
g_vbslib_folder 変数
g_Vers.Item("vbslib")
vbslib が入っているフォルダーを変更するときは、上記の変数の設定(再設定)だけでなく、
g_vbslib_path 変数
も再設定してください。
サンプル
g_vbslib_folder = g_fs.GetParentFolderName( g_vbslib_folder )
g_vbslib_folder = g_vbslib_folder + "\src\samples\scriptlib\"
g_vbslib_path = g_vbslib_folder +"vbs_inc.vbs"
***********************************************************************
<<< メイン.vbs のグローバル変数 >>>
***********************************************************************
メイン.vbs のグローバル変数
メイン・スクリプトのグローバル変数は、start of lib include 〜 end of lib include
の間にある、設定値を格納する場所で Dim/New してください。
'--- 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 -------------------------------
'--- start of vbslib include -----------------------------
:
'--- start of parameters for vbslib include -------
'--- end of parameters for vbslib include --------------
:
'--- end of vbslib include -------------------------------
ライブラリ・スクリプトのグローバル変数は、グローバル領域で Dim して、
InitializeModule 関数の中で初期化します。
g_InitializeModule に InitializeModule 関数のリファレンスを設定します。
Dim g_Test
Function InitializeModule
Set g_Test = New TestScript
End Function
Dim g_InitializeModule
Set g_InitializeModule = GetRef( "InitializeModule" )
→ グローバル変数の初期化、後始末、g_InitializeModule、g_FinalizeModule
***********************************************************************
<<< vbslib_updater - vbslib をバージョンアップする >>>
***********************************************************************
vbslib_updater - vbslib をバージョンアップする
vbslib_updater ツール
バージョンアップを補助する
vbslib_updater
というツールを提供しています。
下記の作業を自動的に行います。 ただし、手動で修正が必要な場合もあります。
vbslib ヘッダ
にあるファイルをベースに vbslib フォルダを vbslib ヘッダに作成する。
vbslib ヘッダがある *.vbs ファイルに
g_Vers
を追加し vbslib のバージョンを 3.0 に設定する。
main 関数を
main2
に置き換える。 元の main 関数は、コメントアウトする。
g_IncludeType を、コメントアウトする。
アプリケーション・スクリプトの修正
一部の関数は、廃止されても移植性のために残してあるものがあります。
True に設定して、廃止される関数を呼び出すとブレークするので、見つけやすくなります。
g_cut_old
を
[WARNING] Out of Writable の警告が大量に出るときは、main2 の最初に次を記述してください。
AppKey.SetWritableMode F_IgnoreIfWarn
SetWritableMode
scriptlib フォルダの ver2 と ver3 の共存
ver2 の scriptlib フォルダの vbs_inc.vbs を vbs_inc_200.vbs に改名し、
ver3 の scriptlib フォルダを ver2 の scriptlib フォルダにコピーすると、
上書きすることなく、ver2 と ver3 を共存できます。
***********************************************************************
<<< Main (メイン.vbs) >>>
***********************************************************************
Main (メイン.vbs)
Sub Main()
Sub Main( Opt as dictionary, AppKey as AppKeyClass )
vbslib を使うスクリプトは、Main から内容を記述します。
Main 関数を定義しているスクリプト・ファイルの中に、
(vbslib をインクルードして Main を呼び出すコード)が必要です。
その内容は、既存のメイン・スクリプト(vbslib Prompt.vbs など)を参照してください。
vbslib include
のコード
ユーザ定義関数です。
引数はあってもなくてもかまいませんが、ファイルに出力するスクリプトは、
AppKey 引数を使った
NewWritable メソッド
を呼ぶ必要があります。
Main 関数が呼ばれるときのカレント・フォルダーは、スクリプトがあるフォルダー
になります。 WSH を起動したときのカレント・フォルダー(作業フォルダー)は、
g_start_in_path
に入っています。
main2 関数が定義されているときは呼ばれません。
サンプル
Sub Main()
echo "Hello, world!"
End Sub
'--- start of vbslib include ------------------------------
: (vbslib をインクルードして main を呼び出すコード)
: (既存のメイン・スクリプトを参照してください)
vbslib include
カレント・フォルダー
にファイルを出力できるようにする
サンプル
↓
Sub Main( Opt, AppKey )
Dim w_:Set w_=AppKey.NewWritable( "." ).Enable()
echo "Hello, world!"
End Sub
'--- start of vbslib include ------------------------------
: (vbslib をインクルードして main を呼び出すコード)
: (既存のメイン・スクリプトを参照してください)
NewWritable
vbslib include
参考
→ 処理フロー (vbs_inc/setting)
Main 関数の外側の動き
テスト
→ T_NewMain1 フォルダ
vbslib_inc のみの環境
→ T_NewMain2 フォルダ
vbslib がある環境
関連
→ GetMainSetting 関数 (vbsool)
***********************************************************************
<<< main2 >>>
***********************************************************************
main2
Sub main2( Opt as dictionary, AppKey as AppKeyClass )
vbslib を使うスクリプトは、main2 から内容を記述します。
廃止予定です。 main を使ってください。
ユーザ定義関数です。
ファイルを出力するスクリプトは、出力するフォルダを、下記サンプルの NewWritable の引数に
指定することで、出力して良いかユーザに確認しなくなります。 ただし、Windows フォルダや
Program Files フォルダなどは必ず確認します。
main 関数が呼ばれるときのカレント・フォルダーは、スクリプトがあるフォルダーになります。
WSH を起動したときのカレント・フォルダー(作業フォルダー)は、
g_start_in_path
に入っています。
カレント・フォルダー
にファイルを出力できるようにする
サンプル:
↓
Sub main2( Opt, AppKey )
Dim w_:Set w_=AppKey.NewWritable( "." ).Enable()
echo "Hello, world!"
End Sub
NewWritable
***********************************************************************
<<< SetupVbslibParameters >>>
***********************************************************************
SetupVbslibParameters
Sub SetupVbslibParameters()
vbslib include の設定をします。
ユーザー定義関数です。
次の変数を設定できます。
→ g_debug
→ g_debug_tree
→ g_debug_process
***********************************************************************
<<< g_fs >>>
***********************************************************************
g_fs
(src)
Dim g_fs as Scripting.FileSystemObject
FileSystemObject
を参照するグローバル変数です。
実装コード:
Dim g_fs : Set g_fs = CreateObject( "Scripting.FileSystemObject" )
***********************************************************************
<<< g_sh >>>
***********************************************************************
g_sh
(src)
Dim g_sh as WScript.Shell
→ WScript.Shell オブジェクト (WshShell オブジェクト)
vbs_inc.vbs をインクルードした後に使えます。
Dim g_sh : Set g_sh = WScript.CreateObject( "WScript.Shell" )
***********************************************************************
<<< 動作モード、デバッグ >>>
***********************************************************************
動作モード、デバッグ
***********************************************************************
<<< g_debug >>>
***********************************************************************
g_debug
(src)
Dim g_debug as integer
デバッガに接続しているかどうか(するかどうか)。 何番目のエラーでブレークするか。
g_debug は、
/g_debug オプション
もしくは、
SetupVbslibParameters
にユーザが記述します。
0 = デバッガに接続しない
1 = デバッガに接続する、BreakErrID = 1
1.5 = デバッガに接続する、BreakErrID = 1.5
2 = デバッガに接続する、BreakErrID = 2
:
-1 = デバッガに接続しないが、
SetupDebugTools
を呼び出す。
99 など大きい数 = デバッガに接続する(エラーが発生しないとき)
参考
→ g_debug - デバッグを開始する
→ Err2::BreakErrID
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
テスト
→ [T_ErrInfo] ユーザへのエラー通知とデバッガ接続
→ [T_Err2] Err2 オブジェクトとデバッガーのテスト
→ [T_StartFromOther] スクリプトが無いフォルダーから起動したとき
***********************************************************************
<<< g_debug_tree >>>
***********************************************************************
g_debug_tree
(src)
Dim g_debug_tree as Array of integer
エラーが発生した場所の詳細情報。 ブレークするために使われる情報です。
g_debug_tree は、
/g_debug オプション
もしくは、
SetupVbslibParameters
にユーザが記述します。
サンプル:
Dim g_debug_tree = Array( 1, 2 )
プログラムを On Error Resume Next 〜 On Error Goto 0 のブロックのツリー構造として
見たときの情報になっています。 ユーザーは、エラーが発生したときに表示される
g_debug_tree に設定する値をそのままお使いください。 表示されなかったときは、設定
する必要はありません。
参考
→ g_debug - デバッグを開始する
テスト
→ T_Err2_Tree フォルダ
***********************************************************************
<<< g_debug_process >>>
***********************************************************************
g_debug_process
Dim g_debug_process as integer
何回目の子プロセスを起動したときにデバッガに接続するかどうか
g_debug_process は、
/g_debug オプション
もしくは、
SetupVbslibParameters
にユーザが記述します。
0 = メイン・プロセスをデバッガに接続する(g_debug>0 のとき)
1 = 1回目にメイン・プロセスが起動した子プロセスをデバッガに接続する
2 = 2回目にメイン・プロセスが起動した子プロセスをデバッガに接続する
:
サンプル
g_debug_process = 1
孫プロセスを起動したときにデバッガに接続することもできます。
g_debug_process = Array(3,1)
3回目に起動した子プロセスから1回目に呼び出す孫プロセス
参考
→ g_debug - デバッグを開始する
テスト
→ T_ChildProcessIDNest_Manually.vbs # Array
→ T_ChildProcessIDNest_Manually2.vbs
コールツリー
ChangeScriptMode
'// g_debug_process
(src)
// "/g_debug" オプションを g_debug_process 変数へ
InitializeModule
(src)
// g_Err2.Break_ChildProcess_CallID へ
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
RunProg
(src)
'// Break in ChildProcess by "g_debug_process"
If g_InterProcess.ProcessCallID(i) + 1 = g_Err2.Break_ChildProcess_CallID(i) Then
cmdline = "cscript //x "+
// デバッガーと接続して起動する
CallFinalizeInModules
(src)
If g_debug_process > 0 Then
// デバッグ モードから戻すように警告する
WScript.Echo " 0 です。
***********************************************************************
<<< g_is_debug >>>
***********************************************************************
g_is_debug
False = 接続していない
True = 接続している
If g_is_debug Then
***********************************************************************
<<< g_debug_params >>>
***********************************************************************
g_debug_params
(src)
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"
テスト
→ T_DebugParam フォルダ
***********************************************************************
<<< g_debug_or_test >>>
***********************************************************************
g_debug_or_test
(src)
Dim g_debug_or_test as integer
デバッグ時、またはデバッグ時のテストかどうか。
自動テストを行うことができるデバッグ機能は、g_debug ではなく g_debug_or_test
値が True のときに行います。
***********************************************************************
<<< g_CommandPrompt >>>
***********************************************************************
g_CommandPrompt
(src)
Dim g_CommandPrompt as integer
コマンドプロンプトを表示するかどうか
0= コマンドプロンプトなし。メッセージは標準ダイアログで表示。
1= コマンドプロンプトあり。終了するとすぐに閉じる。 エラーが発生したときは閉じない。
2= コマンドプロンプトあり。終了しても閉じない。
+4=コマンドプロンプトを最小化ウィンドウで表示。
+4 は、他のオプションと複合するオプションです。
g_CommandPrompt は、
にユーザが記述します。
SetupVbslibParameters
コマンドプロンプトなしのときは、wscript.exe で実行します。
コマンドプロンプトありのときは、vbs ファイルをダブルクリックした瞬間はwscript.exe で実行しますが、
メインのスクリプトは、コマンド・プロンプト(cmd.exe)の上の cscript.exe で実行します。
→ ChangeScriptMode
コマンドプロンプトから cscript.exe 経由でスクリプトを起動したときは、同じウィンドウで実行します。
ただし、64ビットのコマンドプロンプトから起動したとき、
g_is64bitWSH
が False(デフォルト)なら、
32ビットのコマンド・プロンプト(cmd.exe)である、新しいウィンドウで実行します。
64ビットWindows
32ビットWindows
64ビット cmd.exe
%windir%\System32\cmd.exe
-
32ビット cmd.exe
%windir%\SysWOW64\cmd.exe
%windir%\System32\cmd.exe
テスト
→ [T_CommandPrompt] プロンプトを開く、閉じるテスト
→ [T_ErrInfo] ユーザへのエラー通知とデバッガ接続
関連
→ g_is_cscript_exe
→ コマンドプロンプト、コンソール (cmd.exe)
→ /close オプション
***********************************************************************
<<< /close オプション >>>
***********************************************************************
/close オプション
(src)
Sample.vbs /close:0
g_CommandPrompt = 1 のときでも、コマンドプロンプトが正常終了してもすぐに閉じなくする。
関連
→ g_CommandPrompt
***********************************************************************
<<< ChangeScriptMode >>>
***********************************************************************
ChangeScriptMode
Sub ChangeScriptMode();
必要に応じて、子プロセスでスクリプトを実行します。
子プロセスを起動する理由は、次のものがあります。
・コマンドプロンプトのウィンドウを開くために、wscript.exe から cscript.exe を起動する
→ g_CommandPrompt
・デバッガーに接続するために、//x オプションをつけて cscript.exe または cscript.exe
を起動する
・管理者として実行するために、runas コマンド経由で wscript.exe または cscript.exe
を起動する
・64ビットのコマンドプロンプトから起動したときに、32ビットの wscript.exe または
cscript.exe を起動する。 この場合は、新しいウィンドウが開きます。
ChangeScriptMode 関数は、vbslib を使うときに、自動的に呼ばれます。
vbslib_mini.vbs ファイルを使うときは、明示的に呼び出してください。
ソース
→ vbs_inc_sub.vbs
→ vbslib_mini.vbs
→ sample without vbslib.vbs
関連
→ 常に cscript.exe で実行する (コマンドプロンプトを出す)
***********************************************************************
<<< g_is_cscript_exe >>>
***********************************************************************
g_is_cscript_exe
(src)
Dim g_is_cscript_exe as boolean
コマンドライン(cscript.exe)で実行しているかどうか
***********************************************************************
<<< g_admin >>>
***********************************************************************
g_admin
(src)
Dim g_admin as integer
起動時に管理者へログインするのかしないのか
0 = 起動時に管理者へログインしない
1 = 起動時に管理者へログインする
通常、
sudo
を使ってください。
に記述します。
g_admin の設定値は、メインの .vbs ファイルの中の
SetupVbslibParameters
Windows XP では、制限ユーザーから管理者へログインする設定にすると、起動時に管理者の
パスワードを入力するようになります。 自分が管理者であるときは、入力を求められません。
Windows Vista/7 では、vbs ファイルをダブルクリックした直後に、昇格の確認が求められます。
Windows XP では、管理者のユーザ名を
Setting_getAdminUserName
に設定してください
テスト
→ [T_Admin]
参考
→ IShellDispatch2::ShellExecute
の runas
→ アカウント
関連
→ sudo
***********************************************************************
<<< g_is_admin >>>
***********************************************************************
g_is_admin
(src)
Dim g_is_admin as boolean
管理者のグループに入っているかどうか。
Windows Vista 以降では、UAC を確認した後で true になります。
***********************************************************************
<<< g_is64bitWindows >>>
***********************************************************************
g_is64bitWindows
(src)
Dim g_is64bitWindows as boolean
スクリプトが動いている OS が、64ビットWindows かどうか。
関連
→ 64ビットWindows (WOW64)
→ g_is64bitWSH
***********************************************************************
<<< g_is64bitWSH >>>
***********************************************************************
g_is64bitWSH
(src)
Dim g_is64bitWSH as boolean
スクリプトが動いているホストが、64ビット WSH かどうか。
デフォルトの vbslib は、64ビット WSH(OSのデフォルト)で起動しても、32ビット WSH に
切り替わります。
SetupVbslibParameters 関数の中で、g_is64bitWSH = True とすると、64ビット Windows
では、64ビット WSH になります。 ただし、メイン.vbs の最後にある vbslib include の中に
Dim g_is64bitWSH が記述されている必要があります。 参考: vbslib Prompt.vbs の内容
Main 関数を呼び出した後は、実際に動いている WSH のバージョンに従った値になります。
関連
→ 32ビットWindows と 64ビットWindows の WSH
→ g_is64bitWindows
***********************************************************************
<<< ファイルまたはフォルダのパス >>>
***********************************************************************
ファイルまたはフォルダのパス
***********************************************************************
<<< g_start_in_path >>>
***********************************************************************
g_start_in_path
(src)
Dim g_start_in_path as string
プロセス起動時のカレント・フォルダーのフル・パス。
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] スクリプトが無いフォルダーから起動したとき
関連
→ InputPath
***********************************************************************
<<< g_vbslib_path >>>
***********************************************************************
g_vbslib_path
(src)
Dim g_vbslib_path as string
vbs_inc.vbs をインクルードする前
vbs_inc.vbs の相対パス。
相対パスの基準は、すべてのスクリプトのベースフォルダなど。
にユーザが記述します。
インクルードする前の g_vbslib_path は、
SetupVbslibParameters
vbs_inc.vbs をインクルードした後
vbs_inc.vbs のフル・パス
***********************************************************************
<<< g_vbslib_folder >>>
***********************************************************************
g_vbslib_folder
(src)
Dim g_vbslib_folder as string
scriptlib フォルダのフル・パス。末尾に \ が付く
g_Ver の設定に関わらず、最初の scriptlib フォルダの親になります。
関連
→ g_vbslib_ver_folder
→ scriptlib フォルダ
→ g_vbslib_parent_folder
***********************************************************************
<<< g_vbslib_ver_folder >>>
***********************************************************************
g_vbslib_ver_folder
(src)
Dim g_vbslib_ver_folder as string
vbs_inc_XXX.vbs があるフォルダのフル・パス。末尾に \ が付く
g_Ver の設定によって、フォルダパスは変わります。
関連
→ scriptlib フォルダー
→ g_vbslib_folder
***********************************************************************
<<< g_SrcPath >>>
***********************************************************************
g_SrcPath
(src)
Dim g_SrcPath as string
インクルードしているスクリプトファイル(.vbs)のフル・パス。
include
や
call_vbs
や
g_IncludePathes
で、グローバル領域を実行しているとき、
だけ定義されます。
参考
→ get_DefineInfoObject
g_SrcPath のサンプルがあります
→ デバッガで開いているソースのパスを知る
g_SrcPath のサンプルがあります
***********************************************************************
<<< g_MainPath >>>
***********************************************************************
g_MainPath
(src)
Dim g_MainPath as string
メイン.vbs のスクリプトファイル(.vbs)のフル・パス。
***********************************************************************
<<< グローバル変数の初期化、後始末、g_InitializeModule、g_FinalizeModule >>>
***********************************************************************
グローバル変数の初期化、後始末、g_InitializeModule、g_FinalizeModule
(src)
vbs_inc.vbs でインクルードするモジュールの中にあるグローバル変数は、下記のように
初期化関数を g_InitializeModule に設定してください。後始末が必要なら、g_FinalizeModule
と g_FinalizeLevel を設定してください。 g_FinalizeLevel が小さいモジュールほど先に呼ばれます。
これらによって、グローバル変数の初期化や後始末の順番を制御します。
同じモジュールの中のオブジェクトの Class_Terminate が呼ばれる順番は、グローバル変数に
格納した順番と同じです。
参考
→ Class_Terminate が呼ばれる順序
初期化関数で依存するモジュールがなくても、(モジュール).vbs をダブルクリックして、
文法チェックができます。
Setting_getIncludePathes にモジュールを登録して、vbs_inc.vbs をダブルクリックすると、
初期化、後始末のテストができます。
サンプル (TestScript.vbs)
' 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
配列のグローバル変数
main より後のグローバル領域に、配列を宣言すると、main 関数終了後にエラーになることが
あります。そのときは、下記のように SetupVbslibParameters の中で宣言してください。
'--- start of parameters for vbslib include -------------------------------
Dim g_LineOfThreadSwitch()
***********************************************************************
<<< g_Finalizing >>>
***********************************************************************
g_Finalizing
(src)
Dim g_Finalizing as boolean
グローバル変数の後始末処理を行っているときかどうか。
参考
→ グローバル変数の初期化、後始末、g_InitializeModule、g_FinalizeModule
***********************************************************************
<<< vbslib_helper.exe >>>
***********************************************************************
vbslib_helper.exe
VBScript だけではできないが、C言語ではできる機能を実行するプログラムです。
vbslib の内部から必要に応じて自動的に起動されます。
vbslib_helper.exe ファイルは、
g_vbslib_ver_folder
に格納してください。
ソース:
→ vbslib_helper_src フォルダー
***********************************************************************
<<< 処理フロー (vbs_inc/setting) >>>
***********************************************************************
[ 親: vbs_inc ]
[ 親: setting フォルダ ]
処理フロー (vbs_inc/setting)
VBScript global code
[メイン.vbs]
'// start of vbslib include
Execute g_f.ReadAll
[vbs_inc.vbs]
VBScript global code
Execute g_f.ReadAll
[vbs_inc_sub.vbs]
VBScript global code
ChangeScriptMode
(src)
コマンドプロンプトに変える(場合によっては再起動する)
setting フォルダ
'//=== Load setting script
(src)
設定ファイルをロード(実行)する
scriptlib フォルダ
'//=== read and execute g_IncludePathes
Setting_getIncludePathes
モジュールをロード(実行)する
CallInitializeInModules
InitializeModule
モジュールの初期化をする
Setting_onAfterInclude
あるフォルダの中あるすべてのスクリプトの既定の設定
ResumePush
On Error Resume Next
main / main2
メイン・スクリプト
ResumePop
→ 詳細
→ 正常終了時の動作
→ エラー発生時の動作
CallFinalizeInModules
(src)
モジュールの後始末をする
関連
→ エラーが発生して終了するとき
→ 処理フロー (Err2)
***********************************************************************
<<< 正常終了時の動作 >>>
***********************************************************************
正常終了時の動作
main 関数からそのまま返ると、エラーレベルは 21 になります。
これは、wscipt.exe, cscript.exe は、スクリプトの内部でエラーが発生しても、
エラーレベルは 0 になっており、正常に終了したかどうかを区別するためです。
エラーレベルを指定するときは、g_ExitCode に設定してください。
/SuccessRet - メイクファイルから vbslib を使ったスクリプトを呼び出すとき
コンパイルするときに使われることがあるメイクファイルは、起動したコマンドのエラーレベルが 0
ではないときは、エラーが発生したものとみなしますが、vbslib を使ったスクリプトが正常終了した
ときは、エラーレベルが 21 になるため、メイクファイルは処理を中断してしまいます。
正常終了したときに、エラーレベルが 0 になるようにするには、/SuccessRet:0
オプションを指定して vbs を起動してください。 ただし、ごくまれに vbslib がキャッチ
できないエラーが発生することがありますが、そのときは、エラーレベルが 0 になるため、
正常終了と区別することはできません。
cscript sampe.vbs /SuccessRet:0
テスト
→ [T_SuccessRet] /SuccessRet オプションによるエラーレベル
内部フロー
main
ResumePop
CallFinalizeInModules
If not IsEmpty( g_ExitCode ) Then WScript.Quit g_ExitCode
WScript.Quit 21
***********************************************************************
<<< エラー発生時の動作 >>>
***********************************************************************
エラー発生時の動作
(src)
main 関数の中でエラーが発生したら、標準化されたエラーメッセージを表示し、
適切なエラーレベルを、wscript.exe / cscript.exe を呼び出したプロセスへ返します。
→ エラーメッセージ文字列の標準書式(XML版)
wscipt.exe, cscript.exe は、スクリプトの内部でエラーが発生しても、エラーレベルは
0 になっています。 これではエラーが発生したかどうかがわからないので、vbs_inc
がエラーをキャッチして、エラー番号をエラーレベルにします。
文法エラーが発生したときは、エラーレベルが 1 になります。
関連
→ 正常終了時の動作
→ 終了、返り値(エラーレベル)を指定する (VBScript)
→ 警告して終了するには
→ CheckTestErrLevel
***********************************************************************
<<< バージョン判定、環境変数 >>>
***********************************************************************
バージョン判定、環境変数
インスタンスを特定する必要が無い
どの設定ファイルを使うか、などを選択するときに、環境変数を使います。
一般的な設定値は、環境変数ではなく、 XML 形式などの設定ファイルや、
演算器的なオブジェクト
の、どのバージョンを使うか、
静的オブジェクト・スクリプト・ファイル
を使ったほうが、階層化できたりして扱いやすいです。
設定値を指定するときは、main または
デフォルト(自動判定など)の設定値を使うときは、SetVar を使いません。
優先度の高いものから並べると、main 関数の SetVar > setting の SetVar > OS の環境変数
> 自動選択、の順になります。
Setting_getIncludePathes
で
SetVar
を使います。
関連
→ set_
OS の環境変数の設定
→ FuncRedir_add
関数コールのリダイレクト
→ LoadEnvVars
ファイルに書かれた環境変数の集合を使う
→ TestCommon_setVariables
Test.vbs で共通の環境変数とファイルのチェック
→ GetMainSetting 関数 (vbsool)
スクリプト内で共通の設定値
処理フロー
VBScript global code
[メイン.vbs]
1つのスクリプトで使う InitializeModule
で設定される内容の選択
g_Vers.Add "Disable", 1
環境変数
VBScript global code
[vbs_inc_sub.vbs]
Setting_getIncludePathes
あるフォルダの中にある
スクリプトの InitializeModule で
設定される内容の選択
g_Vers.Add "Disable", 1
InitializeModule
→ モジュールのグローバル変数の初期化
全スクリプト共通の既定の設定
(全 scriptlib フォルダ)
SetVar
Setting_onAfterInclude
[vbs_inc_setting.vbs など]
→ setting フォルダ
あるフォルダの中にあるスクリプトの
既定の設定(scriptlib フォルダごと)
SetVar
main / main2
SetVar
1つのスクリプトで使う設定
new ClassA
Class_Initialize
Me.Ver = CInt2( GetVar( "ClassA_Ver" ) )
If IsEmpty( Me.Value ) Then Me.Ver = 200
数値を自動的に
設定する
ClassI_validate
インスタンスを
自動的に
選択する
If IsEmpty( g_ClassI ) Then
Dim name : name = GetVar( "ClassI" )
If IsEmpty( name ) Then
... (自動判定ルーチン)
name = "ClassA"
End If
Select Case name
Case "ClassA" : Set g_ClassI = new ClassA
Case "ClassB" : Set g_ClassI = new ClassB
End Select
Set ClassI_validate = g_ClassI
End If
デフォルト値の決定方法は、
次のものがあります。
・固定値
・設定ファイルからのリード
・自動判定
環境変数の値を使った後は、SetVar をしても無効なので、SetVar は main 関数の
最初で呼び出してください。
関連
→ 環境変数を取得する (VBScript)
***********************************************************************
<<< IsDefined >>>
***********************************************************************
[ 親: バージョン判定 ]
IsDefined
(src)
Function IsDefined( Symbol as string ) as boolean
指定したシンボルの関数が定義されているかどうかを返します。
サンプル:
If not IsDefined( "copy" ) Then ...
参考
→ GetRef
***********************************************************************
<<< g_Vers >>>
***********************************************************************
[ テスト ]
[ 親: バージョン判定 ]
g_Vers
(src)
Dim g_Vers as Scripting.Dictionary
vbslib のバージョン番号です。
値は文字列や数値やオブジェクトなどを格納できます。
SetVar
で設定される変数と同じ変数の領域(Dictionary)です。 (vbslib ver4 より)
VarStack
を使うことができます。
設定サンプル:
Sub SetupVbslibParameters()
'--- start of parameters for vbslib include -------------------------------
g_Vers("vbslib_ver") = 99.99
:
'--- end of parameters for vbslib include ---------------------------------
End Sub
バージョン番号
"vbslib"
0.0 … バージョン切り替えテスト用
2.0 … ver2.00 をそのまま使う (vbs_inc のデフォルト)
3.0 … ver3.00 を使う
4.0 … ver4.00 を使う
99.99 … 最新を使う
vbs_inc.vbs から vbslib をインクルード開始する時点で、実際に使用するバージョン
番号に変わります。 それまでは、メイン.vbs が要求する番号です。
上記のように決めていますが、実際の動きは下記の vbs_inc.vbs の内容によります。
判定サンプル: vbs_inc.vbs の一部
g_f = g_Vers.Item("vbslib")
If g_f >= 4.9 Then
g_Vers.Item("vbslib") = 4.9
g_vbslib_path = g_vbslib_folder + "vbslib\vbs_inc_sub.vbs"
ElseIf g_f >= 4.0 Then
g_vbslib_path = g_vbslib_folder + "vbslib400\vbs_inc_400.vbs"
ElseIf g_f >= 3.0 Then
g_vbslib_path = g_vbslib_folder + "vbslib300\vbs_inc_300.vbs"
ElseIf g_f >= 2.0 Then
g_vbslib_path = g_vbslib_folder + "vbs_inc_200.vbs"
Else
g_vbslib_path = g_vbslib_folder + "vbslib000\vbs_inc_000.vbs"
End If
バージョンの判定は、不等号を使ってください。
参考
→ vbslib をバージョンアップする
テスト
→ T_Var.vbs # T_g_Vers_Stack
関連
→ VarStack
***********************************************************************
<<< CutPropertyM >>>
***********************************************************************
CutPropertyM
キーワード:
Name, m_Name
Dim g_Vers("CutPropertyM") as string
True なら Name プロパティを、False なら m_Name プロパティを使います。
ライブラリが提供するいくつかの関数の中で使われるオブジェクトに対して、Name プロパティを
参照するか、m_Name プロパティを参照するかを選べます。
デフォルトは、True です。
サンプル
g_Vers("CutPropertyM") = False
関連
→ Dic_addNewObject
***********************************************************************
<<< ThisIsOldSpec >>>
***********************************************************************
ThisIsOldSpec
(src)
Sub ThisIsOldSpec()
現在実行している関数が、廃止されようとしている関数であることを警告します。
ファイル:
vbs_inc_sub.vbs
g_debug <> 0 のときは、初めて ThisIsOldSpec を呼び出したときにブレークします。
関連
→ SetErrorOfOldSpec
***********************************************************************
<<< g_cut_old >>>
***********************************************************************
[ 親: バージョン判定 ]
g_cut_old
(src)
g_cut_old は、廃止されました。 代わりに ThisIsOldSpec を使ってください。
→ ThisIsOldSpec
Dim g_cut_old as boolean
vbslib の古い関数を呼び出したときに、デバッガでブレークするようにします。
vbslib のユーザーのサンプル:
g_cut_old = True
vbslib の作成者のサンプル:
If g_cut_old Then Stop :If g_cut_old=I_CutOldErr Then Error
デフォルトは True になります。
False にするには、
SetupVbslibParameters
に次のように記述してください。
'--- start of parameters for vbslib include -------------------------------
Dim g_cut_old : g_cut_old = False
参考
→ vbslib2 から vbslib3 へバージョンアップする
***********************************************************************
<<< SetErrorOfOldSpec >>>
***********************************************************************
SetErrorOfOldSpec
(src)
Sub SetErrorOfOldSpec()
ThisIsOldSpec が呼ばれたら、エラーにするように設定します。
ファイル:
vbs_inc_sub.h
関連
→ ThisIsOldSpec
***********************************************************************
<<< GetOSVersion >>>
***********************************************************************
[ 親: バージョン判定 ]
GetOSVersion
(src)
Function GetOSVersion() as double
Windows のバージョンを返します。
5.0 = Windows 2000
5.1 = Windows XP
6.0 = Windows Vista
6.1 = Windows 7
6.2 = Windows 8
6.3 = Windows 8.1
関連
→ g_is64bitWindows
→ g_is64bitWSH
***********************************************************************
<<< set_, SetVar >>>
***********************************************************************
set_, SetVar
(src)
(src)
[ 親: 環境変数 ]
Sub set_( Symbol as string, Value as string )
Sub SetVar( Symbol as string, Value as variant )
vbslib の環境変数を設定します。
【引数】
Symbol
変数名
Value
設定する値、Empty = 変数を未定義にする
サンプル:
set_ "FooVar", "1"
OS の環境変数
SetVar "FooVar", 1
ローカル環境変数 (vbslib が持つ辞書)
set_ は、OS の環境変数には設定されます。
SetVar は、OS の環境変数には設定されません。そのため、RunProg などで
子プロセスを起動しても、伝達されません。
その代わり、文字列以外(数値や配列など)を設定することができます。
set_ も SetVar も、env を使って参照することができます。
注意
環境変数はグローバル変数と同じなので、なるべく使わないでください。
下記のいずれかが使用できないか検討してください。
・オブジェクトのメソッド、プロパティ
・設定関数
・setting フォルダ, setting_default フォルダ
テスト
→ T_Var フォルダ
関連
→ GetVar
→ VarStack
→ SetVarBreak
→ env
→ RunBat
→ clib の環境変数
→ Environment (Shell)
→ 条件ブレーク
→ SetDefaultEnvironmentVariables
→ AddIfNotExist
テスト
→ [T_Var] vbslib の環境変数のテスト
→ T_Var フォルダ
***********************************************************************
<<< GetVar >>>
***********************************************************************
GetVar
(src)
[ 親: 環境変数 ]
Function GetVar( Symbol as string ) as variant
vbslib の環境変数の値を返します。
【引数】
Symbol
変数名
返り値
Symbol に指定した環境変数の値
サンプル:
v = GetVar( "FooVar" )
値を設定していない環境変数を指定したときは、エラーが発生するのではなく、Empty を返し
ます。
OS の環境変数を指定することもできます。
変数名に % を付けたものを指定した場合、% が無い変数名の値が返ります。
GetVar( "FooVar" ) = GetVar( "%FooVar%" )
テスト
→ T_Var フォルダ
T_Var1
T_Var2
関連
→ SetVar
→ SetVarBreak
→ env
→ 条件ブレーク
***********************************************************************
<<< SetVarBreak >>>
***********************************************************************
SetVarBreak
(src)
[ 親: 環境変数 ]
Sub SetVarBreak( Symbol as string, Opt as Empty )
vbslib の環境変数の値を設定、または参照しているところでブレークするように設定します。
【引数】
Symbol
変数名
Opt
Empty を指定してください
サンプル:
SetVarBreak "FooVar", Empty
関連
→ SetVar
→ GetVar
→ env
***********************************************************************
<<< VarStack >>>
***********************************************************************
VarStack
(src)
[ 親: 環境変数 ]
オブジェクトが破棄されるタイミングで、環境変数の値を元に戻します。
下記の場合、関数から抜けると戻します。
Sub FuncA()
Set v_= new VarStack
set_ "Foo2", "2a"
SetVar "Foo3", 3
g_Vers "Foo4", 1
End Sub '// 元の環境変数の値に戻る
set_
SetVar
g_Vers
***********************************************************************
<<< LoadEnvVars >>>
***********************************************************************
LoadEnvVars
(src)
[ 親: 環境変数 ]
Sub LoadEnvVars( Path_ofSetCommandLog, Option_ )
ファイルを参照して、複数の環境変数を現在のプロセスに設定します。
【引数】
Path_ofSetCommandLog
環境変数の設定の一覧のファイルパス、または辞書
Option_
Empty または F_Append または辞書
今まで設定されていた環境変数のうち、Path_ofSetCommandLog のファイルに記述されて
いない環境変数は、削除されます。 ただし、Option_ = F_Append にすると削除されません。
サンプル
環境変数全体を、ファイルに記述された値に設定します。
LoadEnvVars "settings.txt", Empty
setting.txt
VAR1=value1
VAR2=3
VAR3=cmd
setting.txt は、コマンドプロンプトの set (Enter) で出力される内容と同じフォーマットです。
VBScript では、下記のように記述します。
g_sh.Run "cmd /C (set > ""C:\folder\settings.txt"")",, True
サンプル
環境変数全体を、辞書に入っている内容に設定します。
Set dic = CreateObject( "Scripting.Dictionary" )
dic.Item( "VAR1" ) = "value1"
dic.Item( "VAR2" ) = "3"
LoadEnvVars( dic, Empty )
サンプル
ファイルに入っている環境変数の設定を、辞書に格納する
Set envs = CreateObject( "Scripting.Dictionary" )
LoadEnvVars "settings.txt", envs
Option_ 引数に辞書オブジェクトを渡すと、その辞書オブジェクトの内容が変わるだけで、
環境変数の値は変わりません。
参考
→ デフォルトの環境変数の設定タイミング
テスト
→ T_Var.vbs # T_LoadEnvVars
関連
→ SaveEnvVars
→ ClearEnvVars
→ Dic_add
***********************************************************************
<<< SaveEnvVars >>>
***********************************************************************
SaveEnvVars
(src)
[ 親: 環境変数 ]
Sub SaveEnvVars( Path_ofSetCommandLog, Option_ )
現在の環境変数をファイルに保存するか、辞書に格納します。
【引数】
Path_ofSetCommandLog
ファイルパス、または辞書、または Empty
Option_
Empty 固定
Path_ofSetCommandLog に、値が入っていない(Empty の)変数を指定したら、
内部で Dictionary オブジェクトを生成して、その中に環境変数の設定値を
格納します。
サンプル:
Dim envs
SaveEnvVars envs, Empty '//[out] envs
echo envs
LoadEnvVars envs, Empty
テスト
→ T_Var.vbs # T_LoadEnvVars
関連
→ VarStack
***********************************************************************
<<< ClearEnvVars >>>
***********************************************************************
ClearEnvVars
(src)
[ 親: 環境変数 ]
Sub ClearEnvVars()
現在のプロセスの環境変数をほぼすべて削除します。
VBScript から削除できない環境変数は残ります。
テスト
→ T_Var.vbs # T_LoadEnvVars
***********************************************************************
<<< OpenForEnvVarsFile >>>
***********************************************************************
OpenForEnvVarsFile
(src)
Function OpenForEnvVarsFile( EnvVarsFilePath as string ) as EditEnvVarsFile
環境変数ファイルを編集します。
【引数】
EnvVarsFilePath
環境変数ファイルのパス
返り値
EditEnvVarsFile オブジェクト
サンプル:
Dim f : Set f = OpenForEnvVarsFile( "settings.txt" )
echo f.get_( "VAR_A" )
f.set_ "VAR_A", "1"
f.select_ "VAR_A", "1", Array( "VAR_A", "VAR_B", "VAR_C" ), "0"
f = Empty '// Write
settings.txt
VAR_A
VAR_A
1
VAR_A
1
ランダムアクセスに対応しています。 OpenForRead や OpenForWrite のように
シーケンシャル(ファイルの先頭から順番)にアクセスする必要はありませんし、
変更しないキーまで Write する必要はありません。
存在しない環境変数を新規に set_ したときは、ABC 順でファイルに記述されます。
Empty の値を set_ すると、その環境変数はファイルから削除されます。
関連
→ OpenForRegFile
テスト
→ T_VarFile.vbs # [T_VarFile1]
***********************************************************************
<<< EditEnvVarsFile クラス >>>
***********************************************************************
EditEnvVarsFile クラス
関連
→ OpenForEnvVarsFile
.Path
Property .Path as string
.set_
Sub .set_( Name as string, Value as string or Empty )
.get_
Function .get_( Name as string ) as string
Name が定義されていないときは、Empty を返します
.select_
Sub select_( Name as string, Value as string,
OtherNames as array of string, OtherValue as string )
***********************************************************************
<<< SetVarInBatchFile >>>
***********************************************************************
SetVarInBatchFile
Sub SetVarInBatchFile( Path as string, Symbol as string, Value as variant )
バッチ・ファイルの中で、環境変数を設定している部分の値を変更します。
【引数】
Path
バッチ・ファイルのパス
Symbol
環境変数の名前
Value
環境変数の値
ソース
→ vbslib.vbs
テスト
→ T_VarFile.vbs
T_SetVarInBatchFile
***********************************************************************
<<< エラー処理 (Err2) >>>
***********************************************************************
[ テスト ]
エラー処理 (Err2)
→ Err2 のコーディング例 (TryStart, TryEnd)
→ エラーメッセージをチェックするテスト
→ Err2 オブジェクト
→ エラーコード
→ Error
未知のエラーを発生させます。
→ Raise
新規にエラーを発生させます。
→ Warning
警告を表示してプロセスを終了します。
→ FinObj クラス
Finally ブロックに似た記述をする
→ エラーメッセージ文字列の標準書式
→ エラー発生時の動作
→ Err2 の処理フロー
テスト
→ T_Err2 フォルダ
→ [T_Err2] Err2 オブジェクトのテスト
関連
→ エラー処理 (Err 版)
***********************************************************************
<<< Err2 のコーディング例 (TryStart, TryEnd) >>>
***********************************************************************
Err2 のコーディング例 (TryStart, TryEnd)
Try ブロックの中が、1行だけのとき
Dim e ' as Err2
If TryStart(e) Then On Error Resume Next
...
If TryEnd Then On Error GoTo 0
If e.num = E_FileNotExist Then ... : e.Clear
If e.num <> 0 Then e.Raise
Err2
TryStart
TryEnd
E_FileNotExist
Clear
Raise
関連
→ エラーメッセージをチェックするテスト
エラーをキューにためる
→ EnqueueAndClear (Err2)
クリアしたエラーが発生した場所を調べるときは、クリアする代わりに
Err2::Raise してください。
Try ブロックの中が、複数行のとき
Dim e ' as Err2
If TryStart(e) Then On Error Resume Next
If Trying Then ...
If Trying Then ...
If TryEnd Then On Error GoTo 0
If e.num = E_FileNotExist Then ... : e.Clear
If e.num <> 0 Then e.Raise
Err2
TryStart
TryStart
Trying
Trying
TryEnd
E_FileNotExist
Clear
Raise
Trying は、毎行記述する必要があります。
エラーが発生しても、TryStart〜TryEnd の間で続きを実行する場合は、
Trying は不要です。
Try ブロックの中で発生したエラーでブレークさせるとき
If g_count_up(1)=0 Then Stop '// watch-> g_count [TODO]
echo "g_count(1)=" & g_count(1)
If g_count(1) < 99 Then
If TryStart(e) Then On Error Resume Next
End If
参考
→ g_count, g_count_up
TryStart を使うと、エラーが発生した場所で、ブレークさせることができます。
On Error Resume Next を呼び出したらブレークしなくなるので、TryStart が、
On Error Resume Next を呼び出すべきかどうかを判定します。
ブレークさせるときは、Err2::BreakErrID を設定してください。
→ Err2::BreakErrID
サンプル
→ _err2_test.lzh
関連
→ メンバ変数 (Err2)
→ エラー処理 (Err 版)
***********************************************************************
<<< Err2 オブジェクト >>>
***********************************************************************
Err2 オブジェクト
(src)
関連
→ Err オブジェクト
→ Err2 のコーディング例 (TryStart, TryEnd)
取得, g_Err2
TryStart を呼び出すと、Err2 オブジェクトを取得できます。
また、g_Err2 グローバル変数からアクセスすることもできます。
Dim g_Err2 as Err2
メンバ変数
Public Number ' Err.Number
Public num ' Err.Number
Public Description ' Err.Description (Error Message)
Public desc ' Err.Description (Error Message)
Public Source ' Err.Source
Public ErrID ' count of (num <> 0) in each first Copy after Clear
Public RaiseID ' count of (num <> 0) in Copy
Public BreakErrID ' as integer
Public BreakRaiseID ' as integer
メンバ関数
.Copy
err オブジェクトの内容をコピーします。
.Raise
同じ内容のエラーを再度発生させる。
.OverRaise
エラーの内容を変えて、再度エラーを発生させる。
.Clear
エラーをクリアする。
他にもあります。
テスト
→ [T_Err2] Err2 オブジェクトのテスト
→ T_Err2 フォルダ
***********************************************************************
<<< Number (Err2) >>>
***********************************************************************
Number (Err2)
→ Err2 オブジェクト
num (Err2)
Property Get Err2::Number() as integer
Property Get Err2::num() as integer
エラーコード。
エラー状態でなければ、0 になります。
***********************************************************************
<<< Description (Err2) >>>
***********************************************************************
Description (Err2)
→ Err2 オブジェクト
desc (Err2)
Property Get Err2::Description() as string
Property Get Err2::desc() as string
エラー・メッセージ。
***********************************************************************
<<< ErrStr (Err2) >>>
***********************************************************************
ErrStr (Err2)
→ Err2 オブジェクト
Property Get Err2::ErrStr() as string
XML形式のエラーメッセージ。
エラーメッセージの例:
関連
→ エラーメッセージ文字列のXML書式
***********************************************************************
<<< GetErrStr (Err2) >>>
***********************************************************************
GetErrStr (Err2)
(src)
廃止されました
→ ErrStr (Err2)
Function Err2::GetErrStr() as string
標準形式のエラーメッセージを返す。
エラーメッセージの例:
関連
→ エラーメッセージ文字列の標準書式(XML版)
***********************************************************************
<<< DebugHint (Err2) >>>
***********************************************************************
DebugHint (Err2)
→ Err2 オブジェクト
Property Get Err2::DebugHint() as string
エラーの内容とデバッグのヒント。
サンプル:
If TryStart(e) Then On Error Resume Next
...
If TryEnd Then On Error GoTo 0
If e.num <> 0 Then echo e.DebugHint : e.Clear
エラーメッセージの例:
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、
デバッガに接続して問題がある場所で停止します。
"T_Err2_Clear.vbs"
------------------------------------------------------------------
g_debug = 2
------------------------------------------------------------------
テスト
→ T_InputCommand.vbs # T_InputCommand_ForgetClear
***********************************************************************
<<< Value (Err2) >>>
***********************************************************************
Value (Err2)
(src)
廃止されました
→ DebugHint (Err2)
Function Err2::Value() as string
エラーの内容を文字列型で返します。
***********************************************************************
<<< Copy (Err2) >>>
***********************************************************************
Copy (Err2)
(src)
Sub Err2::Copy( err as Err )
err オブジェクトの内容をコピーします。
***********************************************************************
<<< Raise (Err2) >>>
***********************************************************************
Raise (Err2)
(src)
Sub Err2::Raise()
同じ内容のエラーを再度発生させる。
***********************************************************************
<<< OverRaise (Err2) >>>
***********************************************************************
OverRaise (Err2)
(src)
Sub Err2::OverRaise( e_num as integer, e_desc as string )
エラーの内容を変えて、再度エラーを発生させる。
***********************************************************************
<<< Clear (Err2) >>>
***********************************************************************
Clear (Err2)
(src)
Sub Err2::Clear()
エラーをクリアする。
エラー処理が終わったことを示すため、メンバ変数をリセットします。
num = 0 : Description = "" : RaiseID = 0
関連
→ GetErrStr (Err2)
エラーメッセージを取得する
→ CopyAndClear (Err2)
エラーの情報コピーしてクリアする
***********************************************************************
<<< CopyAndClear (Err2) >>>
***********************************************************************
CopyAndClear (Err2)
(src)
Sub Err2::CopyAndClear( out_e2 as Err2 )
エラーの情報を out_e2 にコピーしてから Err2 のエラーをクリアします。
内部で Err2 オブジェクトが生成されて、out_e2 に格納されます。
CopyAndClear した後でエラーが発生した場合、テストによるエラーであると判断して、
次のようなメッセージが表示されます。
'//エラーが発生した場所を知るには、CopyAndClear する前に Raise してください。
次のように Raise するコードを追加してください。
'//=== Error Handling Test
echo vbCRLF+"Next is Error Test"
If TryStart(e) Then On Error Resume Next
Test '// ここでエラーが発生する
If TryEnd Then On Error GoTo 0
e.Raise '// これを追加する
e.CopyAndClear e2 '//[out] e2
Assert e2.num <> 0 '// テストによるエラーが発生した場所
参考
→ エラーメッセージをチェックするテスト
テスト
→ T_Err2_Main.vbs # T_Err2_CopyAndClear
***********************************************************************
<<< EnqueueAndClear (Err2) >>>
***********************************************************************
EnqueueAndClear (Err2)
(src)
Sub Err2::EnqueueAndClear()
エラーの情報を Err2 の内部キューに入れてから Err2 のエラーをクリアします。
サンプル
Dim e ' as Err2
If TryStart(e) Then On Error Resume Next
Err.Raise 1,, "Error1"
If TryEnd Then On Error GoTo 0
e.EnqueueAndClear
If not IsEmpty(e) Then s = e.DequeueAll() : If s <> "" Then Raise 1, s
EnqueueAndClear
DequeueAll
テスト
→ T_Err2_Main.vbs # T_Err2_EnqueueAndClear
***********************************************************************
<<< DequeueAll (Err2) >>>
***********************************************************************
DequeueAll (Err2)
(src)
Function Err2::DequeueAll() as string
Err2 の内部キューの内容を返し、内部キューを空にします。
エラーがキューに入っていないときは、"" を返します。
XML 書式のエラーメッセージを取得したいときは、ルート要素(タグ)を追加する
必要があるか検討してください。
サンプル返り値
参考
→ EnqueueAndClear (Err2)
テスト
→ T_Err2_Main.vbs # T_Err2_EnqueueAndClear
***********************************************************************
<<< ErrID (Err2) >>>
***********************************************************************
ErrID (Err2)
Dim Err2::ErrID as integer
エラーの通し番号。
エラーが発生して初めての TryEnd を通ったとき +1 されます。
Err2::Clear した後で、次のエラーが発生すると +1 されます。
関連
→ Err2::BreakErrID
***********************************************************************
<<< RaiseID (Err2) >>>
***********************************************************************
RaiseID (Err2)
Dim Err2::RaiseID as integer
エラーの通し番号。
エラーが発生して TryEnd を通るたびに +1 されます。
Err2::Clear で 0 に戻ります。
***********************************************************************
<<< BreakErrID (Err2) >>>
***********************************************************************
BreakErrID (Err2)
Dim Err2::BreakErrID as integer
デバッガでブレークするエラーの通し番号。
通常、
vbslib.vbs をインクルードしたら、g_Err2::BreakErrID に設定されます。
g_debug
に設定してください。
サンプル:
'--- start of parameters for vbslib include -------------------
g_debug = 1.5
参考
→ Err2 のコーディング例 (TryStart, TryEnd)
エラーメッセージの前に g_debug を設定するように表示されます。 このメッセージに従って、
デバッガを起動すると、エラーが発生した場所でブレークします。
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、
デバッガに接続して問題がある場所で停止します。
"T_Err2_Clear.vbs"
------------------------------------------------------------------
g_debug = 2
------------------------------------------------------------------
g_debug が小さすぎると、後で復帰するために問題の無いエラーでブレークします。
また、ブレークしたときはエラー復帰が行われなくなります。
とりあえずデバッガに接続したいときは、十分に大きい値を設定するか、0 に設定して
エラーメッセージから必要な値を確認してください。
g_Err2.BreakErrID を 1.5 とすると、Err2::ErrID が 1 のときのエラーをキャッチする
TryEnd または Trying でブレークします。
エラーが発生したら Err2::ErrID が+1されますが、Err2::ErrID = Err2::BreakErrID に
なったら、エラーによってデバッガでブレークします。 次に Err2:ErrID が+1されるのは、
Err2::Clear した後にエラーが発生したときです。 それまでの Err.Raise では、Err2:ErrID
ではなく、Err2:RaiseID が+1されます。
Pass (vbslib)
は、エラーではありませんが、内部で Err.Raise を呼び出しているため、
Err2:ErrID が+1されます。
ただし、TryStart 〜 TryEnd の間ではないとき(On Error Next Resume を実行していない
とき)にエラーが発生したときは、Err2::BreakErrID の値にかかわらず、エラーが発生したら
必ずエラーブレークします。
Visual Studio 2008 以降では、エラーが発生した場所からステップ実行することができます。
関連
→ Err2::ErrID
→ 処理フロー (Err2)
***********************************************************************
<<< エラーコード >>>
***********************************************************************
エラーコード
(src)
関連
→ エラーメッセージ (VBS)
→ Windows エラーコード
Dim E_Others : E_Others = 1
Dim E_TestPass : E_TestPass = 21
Dim E_TestSkip : E_TestSkip = 22
Dim E_TestFail : E_TestFail = 23
Dim E_BuildFail : E_BuildFail = &h80041004
Dim E_OutOfWritable : E_OutOfWritable = &h80041005
Dim E_NotFoundSymbol : E_NotFoundSymbol = &h80041006
Dim E_ProgRetNotZero : E_ProgRetNotZero = &h80041007
Dim E_Unexpected : E_Unexpected = &h80041008
Dim E_TimeOut : E_TimeOut = &h80041009
Dim E_WIN32_FILE_NOT_FOUND: E_WIN32_FILE_NOT_FOUND = &h80070002
Dim E_WIN32_DIRECTORY : E_WIN32_DIRECTORY = &h8007010B
Dim E_ProgTerminated : E_ProgTerminated = &hC0000005
Dim E_BadType : E_BadType = 13
Dim E_FileNotExist : E_FileNotExist = 53
Dim E_EndOfFile : E_EndOfFile = 62
Dim E_WriteAccessDenied : E_WriteAccessDenied = 70
Dim E_ReadAccessDenied : E_ReadAccessDenied = 70
Dim E_PathNotFound : E_PathNotFound = 76
Dim E_AlreadyExist : E_AlreadyExist = 58
***********************************************************************
<<< [E_NotClear] エラー処理の途中で終了しました。Err2.Clear または再 Raise してください >>>
***********************************************************************
[E_NotClear] エラー処理の途中で終了しました。Err2.Clear または再 Raise してください
TryStart
〜 TryEnd でエラー処理するときの最後に必要な
Err2::Clear
または
Err2::Raise
が呼ばれないで、スクリプトが終了しました。
Err2::BreakErrID
を設定して、エラーが発生した場所でブレークして、コールスタックを参照
して、TryStart 〜 TryEnd のエラー処理に、Err2::Clear または Err2::Raise を記述してください。
エラーメッセージ:
処理フロー
VBScript global code (メインvbs の vbslib include)
ResumePop
CallFinalizeInModules
0
FinalizeModule (vbslib.vbs)
(= g_FinalizeModules(i))
Err2.OnSuccessFinish
echo GetErrStr( num, Description )
***********************************************************************
<<< エラーメッセージのXML書式 >>>
***********************************************************************
エラーメッセージのXML書式
XML を使って、エラー情報を構造化します。
もしエラー情報の一部を取得したいときは、エラーメッセージ(Err2.Description) を
LoadXML
に渡してください。 参考
→ Err2 オブジェクト
>>
***********************************************************************
Error
(src)
Sub Error()
簡易的にその他のエラーを発生させます。
コーディングが最も楽なエラー発生です。 その代わり、エラーの内容はユーザに
伝わりません。 cscript.exe のエラーレベルは 1 になります。
エラー値を返す API やライブラリは、少なくとも、正常に処理されたことを示す値
でなかったら、本関数を呼び出して、緊急停止させます。
想定済みのエラーであれば、ユーザがエラーに対応できるように、Raise などを
使ってエラー処理を実装してください。
想定外のエラーや開発者が発生させたことがないエラーは、本関数を呼び出して、
緊急停止させます。
関連
→ Raise
エラーを発生させる。
***********************************************************************
<<< OrError >>>
***********************************************************************
OrError
(src)
Sub OrError()
子プロセスであっても、そのコードを実行したところでブレークできるようにします。
サンプル
Stop:OrError
通常、上記のように Stop 命令と同時に使用します。
g_debug = 0 の状態で上記のコードを実行したときは、OnError 関数の中でエラーが発生します。
このエラーにより、このコードでブレークするために必要な設定が、エラーメッセージに表示され
ます。
参考
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
ブレークするために必要な設定を行って、スクリプトを再起動すると、Stop 命令によってブレーク
します。 続いて実行される OnError 関数の中では何もしないので、続きをステップ実行できます。
***********************************************************************
<<< Raise >>>
***********************************************************************
Raise
(src)
Sub Raise( ErrorNum as integer, Description as string )
新規にエラーを発生させます。
【引数】
ErrorNum
エラーコード
Description
エラーメッセージ
サンプル
Raise 1, "ファイルが見つかりません c:\a.txt"
参考
→ エラーを発生させる(VBS)
関連
→ Error
簡単に実装できるエラー発生
→ GetErrStr
標準形式のエラーメッセージを返す。
→ Assert
条件が満たされているかをチェックします。
→ 警告して終了するには
***********************************************************************
<<< Warning >>>
***********************************************************************
Warning
(src)
Sub Warning( Description as string )
警告を表示してプロセスを終了します。
【引数】
Description
警告メッセージ
エラーコード E_TestPass(=21) のエラーが発生します。
サンプル
スクリプト:
Warning "アップデートのチェックはスキップしました。"
表示内容:
→ エラーメッセージのXML書式
テスト
→ T_Warning フォルダー
***********************************************************************
<<< GetErrStr >>>
***********************************************************************
GetErrStr
(src)
Function GetErrStr( e_num as integer, e_desc as string ) as string
標準形式のエラーメッセージを返す。
【引数】
e_num
エラーコード
e_desc
エラーメッセージ
サンプル:
Dim e ' as Err2
echo_v GetErrStr( e.num, e.desc )
エラーメッセージの例:
関連
→ エラーメッセージ文字列の標準書式(XML版)
→ GetErrStr (Err2)
***********************************************************************
<<< TryStart >>>
***********************************************************************
TryStart
(src)
Function TryStart( e as Err2 ) as boolean
Try ブロックの開始に記述します。
On Error Resume Next を呼び出すべきかどうかを判定します。
参考
→ Err2 のコーディング例 (TryStart, TryEnd)
"エラーが発生しているときに TryStart は呼べません。" エラーについて
処理
TryStart
エラーが発生(1)
TryEnd
←
Err2::Clear
していない
TryStart
エラーが発生(2)
← このエラーが前のエラーの情報を消してしまう
TryEnd
エラーにしている理由
ほとんどの場合、1つ目のエラーを対処することで、2つ目のエラーは発生しなくなるため、
2つ目のエラーが発生して、1つ目のエラーの情報が上書きされて消えてしまうことが
ないようにすることが重要です。
対処方法
1.
エラーメッセージに表示されているように、g_debug 変数などの値を設定し、エラーが
発生している場所、つまり、TryStart の中の Stop 命令でブレークさせます。
2.
Err.Number が 0 以外なら、Err.Description の値を、e.num が 0 以外なら e.desc の
Err2::desc の値を表示させて、1つ前のエラーの内容を確認します。
3.
コールスタックを上にたどっていき、On Error Resume Next が無いか探します。
あったら、おそらく、そこで1つ前のエラーが発生しているので、そのエラーを発生
させなくするか、クリアすることで対処してください。
なお、多くの場合、TryStart を使わない On Error Resume Next によって、そこで
発生したエラーでブレークすることができなくなっています。
VBScript の不具合に対する対処
Class_Initialize か Class_Terminate で発生したエラーは、VBScript は投げられま
せん(エラーによる中断をしません)。
ErrCheck
または
ErrorCheckInTerminate
を呼び出してください。
***********************************************************************
<<< TryEnd >>>
***********************************************************************
TryEnd
(src)
Function TryEnd() as boolean
Try ブロックの終了に記述します。
On Error GoTo 0 を呼び出すべきかどうかを判定します。
参考
→ Err2 のコーディング例 (TryStart, TryEnd)
***********************************************************************
<<< Trying >>>
***********************************************************************
Trying
(src)
Function Trying() as boolean
Try ブロックの中で記述します。
エラーが発生していたら False を返します。
参考
→ Err2 のコーディング例 (TryStart, TryEnd)
***********************************************************************
<<< ErrCheck >>>
***********************************************************************
キーワード:
new の注意点
ErrCheck
(src)
Sub ErrCheck()
これまでの処理で、エラーがあったかどうかをチェックして、エラーがあったら発生させます。
クラスの Class_Initialize メソッドの中でエラーが発生しても、VBScript は、続きを実行してしまい、
エラーを見つけるのが困難になります。 new でオブジェクトを生成したら、本関数を呼び出して
ください。
サンプル:
Set obj = new ClassA : ErrCheck
テスト
→ テスト [T_ErrOnNew] コンストラクタで発生したエラーを検出
関連
→ ErrorCheckInTerminate
***********************************************************************
<<< ErrorCheckInTerminate >>>
***********************************************************************
ErrorCheckInTerminate
(src)
Sub ErrorCheckInTerminate( ErrNumAtStart as integer )
クラスの Class_Terminate の中で発生したエラーを表示します。
【引数】
ErrNumAtStart
Class_Terminate に入った直後のエラーコード
エラーが発生していたら、Err オブジェクトの内容を echo 出力して Stop または pause します。
エラーが発生していなかったら(Err.Number = 0 なら)、何もしません。
Class_Terminate の中でエラーを発生させることはできないので、ErrorCheckInTerminateも
エラーを発生させません。
なるべく、Class_Terminate の中では、複雑な処理をしないで、
エラーが発生したことを示すフラグを立てて、後で処理してください。
参考
→ Class_Terminate の中のエラー
サンプル:
Private Sub Class_Terminate()
Dim en,ed : en = Err.Number : ed = Err.Description
On Error Resume Next '// This clears error
If en=0 or en=21 Then
Else
del Me.TmpDstPath
End If
ErrorCheckInTerminate en
On Error GoTo 0 : If en <> 0 Then Err.Raise en,,ed '// This sets en again
End Sub
ErrorCheckInTerminate
エラーが発生したときに対処法
Class_Terminate の中で発生したエラーでブレークさせる方法を説明します。
On Error Resume Next の後に、下記のコードを記述してください。
一度実行したら、最後の行の 99 を g_count(0) の値に変更して再度実行してください。
参考
→ g_count, g_count_up
On Error Resume Next '// This clears error
If g_count_up(0)=0 Then Stop
echo "g_count(0)=" & g_count(0) '// watch-> g_count [TODO]
If g_count(0) = 99 Then On Error GoTo 0
0
0
0
0
99
テスト
→ T_Finish.vbs # ErrorCheckInTerminate
***********************************************************************
<<< NotCallFinish >>>
***********************************************************************
NotCallFinish
(src)
Sub NotCallFinish()
Finish が呼ばれないで、クラスの Class_Terminate が呼ばれたときにエラー表示します。
関連
→ Class_Terminate の中のエラー
サンプル:
Private Sub Class_Terminate()
If en = 0 and not Me.IsFinished Then NotCallFinish
End Sub
***********************************************************************
<<< FinObj クラス (Finallyブロック) >>>
***********************************************************************
FinObj クラス (Finallyブロック)
(src)
FinObj クラスを使うと、Finally ブロックに似た記述をすることができます。
エラーが発生しても、続きを実行したり、キャッチしたりしませんが、Finally ブロックは実行します。
VBA の On ErroroGoto (Label) に相当する機能です。 WSH の VBScript では Goto は 0 しかできません。
関連
→ エラー処理, On Error
記述例: 関数の場合
Sub FuncA( Path )
Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
ren Path, "a.txt" : fin.SetVar "Path", Path '// 戻すときのデータを記録
:
fin.SetVar "Path", Empty '// 正常時は戻さないならデータを削除
End Sub
Sub FuncA_Finally( Vars ) '// Finally ブロックに相当
en = Err.Number : ed = Err.Description : On Error Resume Next '// This clears error
path = Vars.Item("Path") '// 戻すデータを取得
If not IsEmpty( path ) Then ren "a.txt", path '// 戻す処理
ErrorCheckInTerminate en : On Error GoTo 0 : If en <> 0 Then Err.Raise en,,ed '// This sets en again
End Sub
FuncA_Finally
ren Path, "a.txt"
Path
FuncA_Finally
Path
ren "a.txt", path
記述例: メソッドの場合
Class ClassA
Public Sub FuncA( Path )
Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
:
End Sub : Public Sub FuncA_Finally( Vars ) '// Finally ブロックに相当
:
End Sub
End Class
Sub ClassA_FuncA_Finally( Vars ) : Vars.Item("Me").FuncA_Finally( Vars ) : End Sub
ローカル変数のデストラクタが動く順番に依存しないようにしてください。
たとえば、下記のように、デストラクタでカレント・フォルダが変わるとき、FuncA_Finally が
呼ばれるタイミングが、カレント・フォルダが変わる前か後かどうか不定なので、Finally
ブロックで相対パスを指定することはできません。
Sub FuncA( Path )
Dim fin : Set fin = new FinObj : fin.SetFunc "FuncA_Finally"
Dim ds_:Set ds_= New CurDirStack
fin.SetVar "CurDir", g_fs.CurrentDirectory
:
End Sub : Sub FuncA_Finally( Vars )
del Vars.Item("CurDir") + "\_temporary_folder"
End Sub
関連
→ Class_Terminate (デストラクタ)
→ ErrorCheckInTerminate
***********************************************************************
<<< 処理フロー (Err2) >>>
***********************************************************************
処理フロー (Err2)
→ 正常終了するとき
→ エラーが発生して終了するとき
→ エラーが Err2.Clear または再 Raise されないで終了したときの処理フロー
関連
→ 処理フロー (vbs_inc/setting)
正常終了するとき
VBScript global code
(メインvbs の vbslib include)
ResumePop
CallFinalizeInModules
0
On Error Goto 0 していないときは 1
FinalizeModule (vbslib.vbs)
(= g_FinalizeModules(i))
エラーが発生して終了するとき
VBScript global code
(メインvbs の vbslib include)
:
Err.Raise
g_FinalizeInModulesCaller.Class_Terminate
CallFinalizeInModules
1
FinalizeModule (vbslib.vbs)
(= g_FinalizeModules(i))
***********************************************************************
<<< 困ったときは? (デバッグ) >>>
***********************************************************************
困ったときは? (デバッグ)
エラーメッセージを見ても分からないときは、スクリプトの開発者に質問してください。
あなたが開発者であるときは、デバッグモードで動かしてみてください。
→ デバッグを開始する
→ エラーメッセージの標準書式
→ g_count, g_count_up
… スルーカウンタ
→ 条件ブレーク
→ ファイル出力を開始するタイミングでブレークする
→ SetupDebugTools
… デバッグ機能の設定場所
→ ウォッチ (WS, WD, WX)
→ 性能計測
→ g_debug_params
… 起動時のパラメーターを指定する
→ エラーコード
→ 長い文字を入力するときの注意
→ vbslib2 から vbslib3 へ移植するには
サポート
ソフトウェアデザイン館 Sage Plaisir 21 http://www.sage-p.com/
ホームページにあるサポート掲示板かメールアドレスへ
***********************************************************************
<<< g_debug - デバッグを開始する (vbslib) >>>
***********************************************************************
g_debug - デバッグを開始する (vbslib)
デバッガーとは、スクリプトの実行を一時的に止めて、変数の値を確認することなどができる
ツールです。 正しい値で処理されているところと、誤った値で処理されているところを
挟み込んでいくようにして、問題がある場所を見つける作業を支援します。
インストール
デバッガーは、Visual Studio Standard 以上、または MS-Office 付属の
Microsoft Script
Editor
に含まれています。 無料の
scd10jp.exe
も使えます。
→ デバッガー (Visual Studio など)
Visual Studio 2008 Professtional で、VBScript (WSH) をデバッグ
デバッガーの起動の仕方
vbslib を使っているスクリプトの場合:
→ コマンドラインやショートカットからデバッガーに接続する
vbslib を使わない場合:
→ デバッガー (Visual Studio など)
Mircrosoft 製のデバッガーは、すべて同じ手順でデバッガーを起動できます。
その他の手順
→ コマンドラインやショートカットからデバッガーに接続する
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
→ ソース・ファイルの中の任意の場所でブレーク(一時停止)する
→ デバッガを終了する
→ デバッガで開いているソースの場所を知る
→ デバッガが無いときの g_debug
→ デバッグモードにしないでデバッガに接続
→ vbslib include や、vbs_inc モジュールのデバッグ
→ コンパイルエラーが発生したときのデバッグ (g_is_compile_debug)
→ SetupDebugTools
→ 子プロセスでブレーク(Stop)する
→ ファイル出力を開始するタイミングでブレークする
→ 条件ブレーク
→ g_count, g_count_up
→ SkipToSection
→ メッセージボックス (VBScript)
→ 動作モード、デバッグ関係のグローバル変数
→ エラー、デバッグ (VBScript)
コマンドラインやショートカットからデバッガーに接続する (/g_debug)
vbslib を使用しているスクリプトは、
WSH のデバッガー
がインストールしてある環境では、
コマンドライン:
cscript sample.vbs /g_debug:99
または、ショートカットを作成して、ショートカットを右クリック [ プロパティ ] の、
リンク先:
"C:\Folder\sample.vbs" /g_debug:99
として起動するだけで、デバッガーに接続します。
/g_debug:1 にすると、1つ目のエラーでブレークします。
"C:\Folder\sample.vbs" /g_debug:2,1;1
のような複雑な記述もできます。 記述すべき値はエラーメッセージに表示されます。
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
コロンの次は、
g_debug
、コンマの次は、
g_debug_tree
、セミコロンの次は、
g_debug_process
に設定されます。
関連
→ デバッグを開始する, g_debug (vbslib)
テスト
→ T_Err2_Debug1_WithDebugger
→ T_Err2_Tree
→ T_ChildProcessIDNest_Manually2.vbs
エラーが発生した瞬間のスクリプト内部の様子を調べる
エラーが発生したら、エラーが発生した瞬間でブレーク(一時停止)するために必要な、
g_debug
などに設定すべき値が自動的に表示されます。
表示されるエラーメッセージの例
WSH のデバッガーがインストールされていれば、スクリプト・ファイルへのショートカッ
トを作成、プロパティ - リンク先に、下記の /g_debug オプションを追加、ショートカ
ットから起動すると、問題がある場所で停止します。
----------------------------------------------------------------------
"T_Sample.vbs" /g_debug:1
----------------------------------------------------------------------
エラーが発生した瞬間でブレークさせるには、2つの方法があります。
1つは、*.vbs ファイルのショートカットを作成して、右クリック [ プロパティ ] の [ リンク先 ]
に、/g_debug:1 オプションを設定してください。
リンク先:
...\sample.vbs /g_debug:1
1つ目のエラーでブレークする
もう1つは、メイン・スクリプトの
SetupVbslibParameters
の中にある g_debug = 0 を編集して
ください。 編集したら、スクリプトを再度実行してください。
Sample.vbs
g_debug = 1
デバッガにアタッチして、1つ目のエラーでブレークする
多くの場合、vbslib の内部関数の中でブレークしてしまうので、自分が扱っているスクリプトが
見つかるまで、コールスタック(デバッグ | ウィンドウ | 呼び出し履歴)を開いて、探してください。
深い
浅い
テスト
→ [T_ErrInfo] ユーザへのエラー通知とデバッガ接続
関連
→ テストが Fail したとき
→ エラー処理のデバッグ
ソース・ファイルの中の任意の場所でブレーク(一時停止)する
g_debug
ブレークしたいソースの場所に、Stop:OrError を記述して実行してください。
Stop:OrError
g_debug などの変数に設定すべき値が書かれたコードが表示されます。 このコードを、
メイン.vbs の最後にある SetupVbslibParameters 関数の最後に記述してください。
下記のファイルをテキストエディタで開いて次のように変数の値を修正すると、デバッガ
に接続して問題がある場所で停止します。
"sample.vbs"
----------------------------------------------------------------------
g_debug = 1
----------------------------------------------------------------------
その状態で実行すると、Stop:OrError を記述した場所でブレークします。
関連
2回目以降でブレークする方法
→ g_count, g_count_up
→ 条件ブレーク
デバッガを終了する
デバッグを中止するときは、コマンドプロンプトを閉じてください。
コマンドプロンプトが表示されていないときは、kill_wscript.bat を実行してください。
デバッガで開いているソースの場所を知る
コールスタック(デバッグ | ウィンドウ | 呼び出し履歴)を見れば、全体から見てどの部分で
止まっているかが分かります。 開いているソースのフル・パスは、1行目に自動的に挿入
されています。 一部のオブジェクト(静的オブジェクト)は、DefineInfo.FullPath プロパティに、
クラスを定義しているソースのフル・パスが入っています。DefineInfo プロパティが無くても、
メソッドにステップインしたときのソースの1行目から分かります。
メイン・スクリプトのパスは、WScript.ScriptFullName プロパティの値を見れば
分かりますが、インクルードしたスクリプトのパスは、通常分かりません。
しかし、g_debug=1 でデバッガに接続したときに表示される vbslib のソースは、
1行目にフル・パスが記述されたコメントが付きます。 (ただし、Visual Studio 2012 では、
すべてのファイルが1つのウィンドウにまとめられてしまうため、"g_SrcPath=" で上方向
に検索してください。)
また、ソースの先頭に下記のような記述があり、
g_SrcPath の値を代入した g_〜_vbs.DefinePath 変数の値に、インクルードしたスクリプト
のパスが入っています。 Visual Studio では、この変数を選択してウォッチ・ウィンドウへ
ドロップし、値(パス、" "付きでも可)をコピーして、 ファイル・オープンで開けます。
.vbs ファイルの先頭
'// g_SrcPath="C:\Folder\vbslib\Sample.vbs" ... デバッグ時に自動的に付きます
Dim g_SrcPath
Class Sample_vbs : Public FullPath : End Class
Dim g_Sample_vbs
Set g_Sample_vbs =_
new Sample_vbs
With g_Sample_vbs
.FullPath = g_SrcPath
End With
Class ClassA
Public Property Get DefineInfo() : Set DefineInfo = g_Sample_vbs
End Property
End Class
g_SrcPath
簡易版
→ get_DefineInfoObject
もし、g_〜_vbs.DefinePath 変数が無くても、最後の call_vbs, call_vbs_d が呼び出している
関数を定義しているスクリプトのパスなら、g_SrcPath の値から知ることができます。
最後以外は、コールスタックを目的の call_vbs, call_vbs_d に切り替えて、 path 引数
の値を調べることで分かります。
また、下記の式の値が True なら、最後の call_vbs, call_vbs_d が、メイン・スクリプト
の関数を呼び出していると判断できます。
g_SrcPath = WScript.ScriptFullName
vbs ファイルが、main 関数を持ち、include もされる場合、上記の実装では、二重定義
エラーになります。 下記のように実装してください。
Dim g_Sample_vbs
If IsEmpty( g_Sample_vbs ) Then Declare_g_Sample_vbs
Sub Declare_g_Sample_vbs
ExecuteGlobal "Class Sample_vbs : Public FullPath : End Class"
Set g_Sample_vbs =_
new Sample_vbs
With g_Sample_vbs
.FullPath = g_SrcPath
End With
End Sub
Sub main2( Opt, AppKey )
g_SrcPath = WScript.ScriptFullName : Declare_g_Sample_vbs
:
デバッガが無いときの g_debug
デバッガが無くても、g_debug=1 にすれば、エラーメッセージが詳しくなることがあります。
g_debug=0
[ERROR](500) この変数は宣言されていません。
g_debug=1
C:\home\sample.vbs(34, 3)
Microsoft VBScript 実行時エラー: この変数は宣言されていません。: 'e'
ただし、行番号が出るのは、文法エラーのみです。
子プロセスでブレーク(Stop)する
ブレークしたい場所に Stop 命令を記述してデバッガーに接続しても、RunProg 関数など
で起動した子プロセスが Stop 命令を実行したときは、ブレークしません。
その代り、Stop:OrError と記述すると、ブレークするために必要な方法が表示されます。
参考
→ OrError
デバッグモードにしないでデバッガに接続
g_debug=1 にすると、詳しい動作内容が表示されたり、エラーが発生したらブレーク
したりするなど、若干動きが異なります。 この動きをさせないで、デバッガに接続する
には、g_debug=0 にして、下記のバッチファイルを実行してください。
debugger.bat
Test.vbs ファイルをデバッガにアタッチします
@cscript //x Test.vbs /g_debug:0
@pause
wscript ではないことに注意
ただし、
g_CommandPrompt
=0 なら wscript にしてください
main.vbs
g_debug=0
vbslib include や、vbs_inc モジュールのデバッグ
内部で、デバッガに接続するまでに、
vbs_inc
モジュールの一部が動きますが、
そこをデバッグするときは、下記のバッチファイルを実行してください。
debugger.bat
Test.vbs ファイルをデバッガにアタッチします
wscript であることに注意
@wscript //x Test.vbs
@pause
デバッグを中止するときは、kill_wscript.bat を実行してください。
インクルードしたファイルにコンパイルエラーが発生したときのデバッグ (g_is_compile_debug)
インクルードしたファイルがコンパイルエラーしたときは、g_is_compile_debug = 1 として
起動すると、コンパイルエラーがあった vbs ファイルがある行を開きます。 ただし、
Setting_getEditorCmdLine
に、行番号を指定して開くことができるテキストエディタが
すでに登録してある必要があります。
'--- start of parameters for vbslib include -------------------------------
g_debug = 0 '// release:0, debug:99, -1:call SetupDebugTools
Dim g_is_compile_debug : g_is_compile_debug = 1
テスト
→ T_CompileDebug フォルダ
***********************************************************************
<<< g_debug_var >>>
***********************************************************************
g_debug_var
(src)
ReDim g_debug_var(10)
デバッグ用グローバル配列変数 g_debug_var。
ブレークする条件を満たしたことを設定するときなどに使用できます。
すべてのモジュールからアクセスすることができ、スコープを超えて通知ができます。
デバッグするときに新しく一時的なグローバル変数を作成することがよくありますが、
その度にどこに配置したらよいかを考えなくて済みます。
デバッグが完了したら、g_debug_var を使っているコードを削除してください。
vbslib は、g_debug_var 変数を用意するだけで、アクセスしません。
サンプル
条件付きブレークをする
テスト対象の中:
If ... Then g_debug_var( 0 ) = True
:
If g_debug_var( 0 ) Then Stop
Stop する条件を満たしたことを通知しています。
テスト対象の中の中:
If ... Then g_debug_var( 1 ) = True
:
If g_debug_var( 1 ) Then Stop
2つ目の条件を満たしたことを通知しています。
補足
作成中の新機能を一時的に有効にするときは、g_debug_var を使わずに、
一時的なグローバル変数を作成してください。
新機能の外:
gc_NewFunction = True '//[TODO] 一時的なグローバル変数
新機能の中:
If gc_NewFunction Then NewFunction
関連
→ g_DebugVar (clib)
***********************************************************************
<<< g_count, g_count_up >>>
***********************************************************************
g_count, g_count_up
(src)
Function g_count_up( i as integer ) as integer
グローバル配列変数 g_count の1つの配列要素の値を+1します。
【引数】
i
カウンタの種類の番号、配列要素番号(0以上)
返り値
新しい配列要素の値
デバッグ用です。 参考
→ スルーカウンタ
問題が発生した場所の少し前でブレークさせたい場所で、まず下記のように記述します。
複数のカウンタを使うときは引数 0 を変えてください
If g_count_up(0)=0 Then Stop '// watch-> g_count [TODO]
echo_v "g_count(0)=" & g_count(0)
0
0
0
実行させてエラーが発生した場所でブレークしたら、g_count(0) の値をウォッチします。
0 は、g_count_up の ( ) の中と同じです。 ウォッチするのは、g_count_up ではないことに
注意してください。
g_count(0)
← ウォッチ
g_count(0) の値がウォッチした値と一致したらブレークするように、記述を変更します。
If g_count_up(0)=2 Then Stop
2
← g_count(0) をウォッチしたら 2 だった場合
再び最初から実行させると、上記の Stop で止まります。
関連
→ 条件ブレーク
→ スルーカウンタ (C言語 - errors)
***********************************************************************
<<< 条件ブレーク >>>
***********************************************************************
条件ブレーク
特定の条件を満たしたときだけブレークしたいときは、次のように記述します。
If ... Then SetVar "Stop1", 1 '// 条件の判定 [TODO]
:
If GetVar( "Stop1" ) Then Stop '// ブレークする場所 [TODO]
***********************************************************************
<<< ファイル出力を開始するタイミングでブレークする >>>
***********************************************************************
ファイル出力を開始するタイミングでブレークする
出力ファイルの内容に問題があるときは、ファイル名を指定するだけで、
ファイルの出力を開始するところでブレークさせることができます。
参考
→ SetBreakByFName
***********************************************************************
<<< Test.vbs のコールバック関数を呼び出すタイミングでコールバックする >>>
***********************************************************************
Test.vbs のコールバック関数を呼び出すタイミングでコールバックする
OnStart (SkipSectionGlobal)
に、デバッグ用に作成したコールバック関数を登録してください。
参考
→ テスト・プロンプト (Test.vbs)
***********************************************************************
<<< 処理の詳細表示 (g_verbose)、トレース表示 >>>
***********************************************************************
処理の詳細表示 (g_verbose)、トレース表示
Dim g_verbose as boolean
Verbose モードが有効かどうか。
ファイル:
vbs_inc_sub.vbs
Verbose モードが有効であるときは、内部処理の内容を詳しく表示しながら実行します。
Verbose モードで内部処理を表示する主な目的は、行われるはずの処理が行われて
いない不具合を解決することです。 処理が行われなかった
ことを中心に表示してください。 そうしないと、必要な情報が多くのノイズ(情報)に
隠れてしまいます。 とりあえず Verbose モードで動かし、そこからどの情報を詳しく
表示するようにすればいいか、どのオブジェクトを GetEchoStr で表示させるとよいか
をガイドできればよいでしょう。
プログラムが処理内容に対してメタな処理になっているときに処理のステップを表示
したいときは、そのモジュールのメンバーに Verbose モードを追加してください。
サンプル (デバッグ時)
g_verbose = 1
FuncA
pause
FuncA の処理内容を詳しく表示します。
サンプル (開発時)
If g_verbose Then echo_v "処理は1つも行われませんでした。"
テスト
→ T_Verbose.vbs # [T_Verbose]
関連
→ echo_v
***********************************************************************
<<< SetupDebugTools >>>
***********************************************************************
SetupDebugTools
(src)
Sub SetupDebugTools()
デバッグ時に main 関数を呼び出す直前で呼び出される関数。
通常、vbslib include に、SetupDebugTools 関数の定義を記述します。
デバッグ用に何らかの設定をしたり、ファイルを初期状態に戻すなどの処理を、この関数の
中に定義してください。 main 関数の最初に記述しても同じことができますが、vbslib を
インクルードする前に、vbslib など vbs_inc でインクルードする関数が使え、g_debug の設定
の直後に処理を記述できるため、デバッグ用のコードを一般のコードと区別できます。
また、この関数の中では、利便性のために
Out of Writable 警告
を発しません。
ただし、ファイルパスを指定するときは変数を使わないようにするなどして、予想外のファイル
を壊さないように注意してください。
サンプル:
'--- start of parameters for vbslib include ---------
g_debug = 0 '// release:0, debug:99, -1:call SetupDebugTools
Sub SetupDebugTools() : set_input "" : SetBreakByFName Empty : End Sub
g_debug = 99 '// 上書きすることで、上記のデフォルトのコードを保護します。
Sub SetupDebugTools() '// 関数も前の定義を上書きできます。
del "C:\Users\user1\Desktop\TestData"
set_input "1."
SetBreakByFName "Out.xml"
End Sub
set_input
SetBreakByFName
テスト
→ [T_SetupDebugTools] デバッガ時の初期設定
***********************************************************************
<<< ウォッチ (WS, WD, WX) >>>
***********************************************************************
ウォッチ (WS, WD, WX)
(src)
Sub MARK( Label as string, out_Count as variant )
スレッドの通過を表示します
Function WS( Expression as string ) as string
文字列値を表示するコードを返します
Function WD( Expression as string ) as string
数値を表示するコードを返します
Function WX( Expression as string ) as string
数値を16進数で表示するコードを返します
Sub WS2( Label as string, Value as variant )
文字列値を表示します
Sub WD2( Label as string, Value as variant )
数値を表示します
Sub WX2( Label as string, Value as variant )
数値を16進数で表示します
ブレークしないで、変数の値を標準出力へ表示します。
サンプル:
Dim var1 : var1 = 123
Execute WD("var1")
MARK "a", 0
Dim var1 : var1 = 123
WD2 "var1", var1
出力例:
関連
→ Execute_Echo
***********************************************************************
<<< エラー処理のデバッグ >>>
***********************************************************************
エラー処理のデバッグ
エラーが発生した後の処理を、デバッグする方法を示します。
1.
まず、エラーが発生した瞬間を捕らえて、その場所に Stop 命令を記述します。
参考
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
→ ソース・ファイルの中の任意の場所でブレーク(一時停止)する
… Stop 命令
2.
g_debug
を 99 など大きな数に設定して起動します。
3.
Stop したら、ステップ実行します。