←
▼
▲
Function fc_ex( PathA as string, PathB as string, Opt as fc_option ) as boolean
ファイルやフォルダの内容が同じかどうか調べます。
【引数】
PathA
1つ目のファイルのパス、またはフォルダのパス
Opt
Empty または オプション
返り値
同じかどうか
vbslib.vbs が入ったフォルダに、feq.exe が必要です。
PathB
2つ目のファイルのパス、またはフォルダのパス
Class fc_option
Public FcOptionIniPath
Public FcResultRedirectPath
Public m_bStdOut
Public IsStartDiffIfNotSame
Public IsXmlComparedAsBinary
End Class
オプション指定ファイル fc.ini のパス
FcOptionIniPath、オプション指定ファイル fc.ini
[Excludes]
A = obj
A = proj\Debug
: :
比較を行わないファイルの一覧
未対応
IsStartDiffIfNotSame
違いが発見されたら、diff を起動。 起動したら、False になります
diff ツールは、
で設定します。
結果を出力するファイルのパス
未対応
未対応
XML として同じでも、テキストが異なれば、異なると判定する
IsXmlComparedAsBinary
False なら、文字コードや空白文字などの違いがあっても、XML ドキュメントのデータが同じであれば
同じと判定します。
デフォルト(Empty)は True です。
→ T_XML.vbs # [T_CompareXml]
テスト
(src)
←
▼
▲
set_fc_option( new fc_option ).m_bStartDiff = True
If not fc( file_a, file_b ) Then Fail
If not fc( file_a, file_c ) Then Fail
set_fc_option Empty
Function set_fc_option( opt as fc_option ) as fc_option
のオプションを設定します。 デバッグ用です。
サンプル: fc で違いが発見されたら、そのファイルに対して diff を起動します。
このオプションは、fc, fc_r, fc_ex のすべてに設定され、set_fc_option Empty するまで有効です。
返り値は、opt 引数がそのまま返ります。
←
▼
▲
複数のフォルダーにある複数のファイルの差分を調べて、Diff ツールやテキスト・エディターを
開くメニューを表示することで、手動でファイルの内容を同じにする作業を支援します。
.AddRootFolder
Function AddRootFolder( IndexNum, RootFolderPath )
.AddFile
.IsCompareTimeStamp
.IsCompareContents
.Compare
Sub Compare()
Sub AddFile( StepPath )
boolean
boolean
Sub OpenSyncMenu()
→ T_SyncFiles.vbs # main
テスト
(src) SyncFilesMenuLib.vbs
.IsSameFolder
Function IsSameFolder( FolderAIndexNum, FolderBIndexNum )
サンプル・コード
Set menu = new SyncFilesMenu
menu.IsCompareTimeStamp = False
menu.Lead = "Comparing Base, Update1 and Update2"
menu.AddRootFolder 0, "Folder0"
menu.AddRootFolder 1, "Folder1"
menu.AddRootFolder 2, "Folder2"
menu.RootFolders(0).Label = "Base"
menu.RootFolders(1).Label = "FolderA"
menu.RootFolders(2).Label = "FolderB"
menu.AddFile "File1.txt"
menu.AddFile "File2.txt"
menu.AddFile "File3.txt"
menu.Compare
menu.OpenSyncMenu
→ Syncs
関連
データ構造
SyncFilesRoot<array>
.StepPath
.AbsPath
.Files( Key:StepPath )
SyncFilesFile<dic>
SyncFilesMenu
.RootFolders( Index:Num )
.IsSameBinary[ n ]
string
string
boolean
Comparing Base, Update1 and Update2
1. NotSame.txt : Base≠FolderA, Base≠FolderB, FolderA≠FolderB
2. NotSameNo0.txt : Base に存在しません, FolderA≠FolderB
3. Only0.txt : Base のみに存在します
4. SameAll.txt : 同じ内容
99. 戻る
ファイルの番号を入力してください >1
NotSame.txt
1. Diff ツールを開く
4. Base のファイルを開く
5. FolderA のファイルを開く
6. FolderB のファイルを開く
99. 戻る
操作の番号を入力してください >
サンプル画面
比較するファイルは、AddFile メソッドを使って1つ1つ指定してください。
(src)
(src)
(src)
(src)
(src)
.IsCallViaFile
boolean
CallViaFile を呼ぶメニュー 80 を追加するかどうか
.RootFolders(i).Label
ラベル。 i は、AddFile の FileNum
ファイルが同じかどうかは、ReadFile の返り値が同じかどうかで判定します。
親フォルダーの指定を、サブ・フォルダーに置き換える
←
▼
▲
Sub SyncFilesMenu::SetParentFolderProxyName( IndexNum as integer, Name as string )
親フォルダーの指定を、サブ・フォルダーに置き換えるように設定します。
【引数】
IndexNum
Name
フォルダー番号
サブ・フォルダー名
→ T_SyncFiles.vbs # T_SyncFilesParent
テスト
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 を比較します。
(src)
←
▼
▲
%AbsPath(..\SampleLib)%
変換前
変換後の例
C:\folder\SampleLib
%DesktopPath%
C:\Documents and Settings\user1\デスクトップ
vbslib の提供するいくつかの関数の中で、% を使った文字列変換関数が使えます。
% を使った環境変数も展開されます。
%AbsPath(.)%
C:\folder\current
の c.RightHasPercentFunction
(*1)
(*2)
(*1)
(*2)
○
○
×
○
○
○
○
○
%RegExp(.*)%
正規表現にマッチする任意の文字列
比較対象も指定する関数で使えるかどうか。
例:
例:
比較対象を指定しない関数で使えるかどうか。
サンプル
ABC
***%AbsPath(.)%***
***%RegExp(.*)%***
ABC
***C:\FolderA***
***01234567879***
展開
%MultiLine%〜
×
○
複数行にマッチする (*3)
(*3)
関数一覧
%MultiLine% は、任意の複数行とマッチします。
また、%MultiLine% の直後にテキスト(%を使った関数可能)を置くと、その複数行が
マッチするかどうかをチェックします。
start
%MultiLine%
end
start
Line1
Line2
Line3
end
展開
展開
start
C:\FolderA>
C:\FolderA>
C:\FolderA>
end
start
%MultiLine%%AbsPath(.)%>
end
←
▼
▲
(src)
Function grep( Parameters as string, OutPath as string ) as array of GrepFound
ファイルの中で、指定したキーワードを含む行を検索します。
【引数】
Parameters
OutPath
オプションと、キーワードと、検索対象フォルダー
Empty または 検索結果の出力先のファイル・パス
返り値
GrepFound オブジェクトの配列、または Empty
ファイル:
vbslib.vbs
Dim founds, found
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
Parameters は、grep コマンドのパラメーターと同じです。
\ によるエスケープは bash と同じです。
ただし、オプションは、-r と -i と --include のみ指定できます。
-r : サブフォルダーも検索対象にする
-i : 大文字と小文字を区別しないで検索する
キーワードは、必ず
OutPath に 検索結果の出力先のファイル・パスを指定すると、返り値は Empty になります。
サンプル
"define" を検索する。 結果は返り値で取得する。
検索対象ファイルは、..\FolderA フォルダーで、サブ・フォルダーも含める。(-r)
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
サンプル
grep "-r -i define *.txt", "grep_out.txt"
grep_out.txt ファイルのサンプル
"define" を検索する。 結果は、"grep_out.txt" ファイルに出力する。
検索対象ファイルは、拡張子が .txt で、サブ・フォルダーも含める。(-r)
大文字小文字は区別しない。(-i)
で指定してください。
正規表現
→ 正規表現
→ T_Grep.vbs # [T_Grep1]
テスト
参考
関連
文字列の途中を取り出します。
Parameters に指定した検索対象のパスが、相対パスなら、Path プロパティも
相対パスになります。 そのときの基準フォルダーは、カレント・フォルダーになります。
GrepFound::Path プロパティ
\*
→ findstr
互換性
"|" (バーチカルライン)は、OR の意味になります。
"|" を検索したいときは、"\|" のようにエスケープしてください。
"-" を検索したいときは、"\-" のようにエスケープしてください。
"/"(スラッシュ)は、一般文字であり、エスケープする必要はありません。
→ 互換性
未確認
キーワードがある(ない)行だけ抽出します。
←
▼
▲
Function GrepKeyword( Keyword as string ) as string
検索キーワードを grep や egrep のコマンドラインに指定する形式に変換します。
【引数】
Keyword
返り値
検索キーワード
grep や egrep のコマンドラインに指定する形式
Function EGrepKeyword( Keyword as string ) as string
返り値を grep や egrep のパラメーターに指定するときは、" " で囲んでください。
Assert GrepKeyword( "---" ) = "\---"
grep -r "\---" *
(src)
(src)
→ T_Grep.vbs # [T_GrepKeyword]
テスト
←
▼
▲
Function find( keyword as string, path as string ) as string
テキストファイルの中で、指定したキーワードを含む行をまとめて返します。
【引数】
keyword
検索するキーワード
キーワードを含む行、または複数行
返り値
path
テキストファイルのパス
(src)
サンプル:
lines = find( "<ERROR", "Test_logs.txt" )
Test_logs.txt ファイルのサンプル
start main.vbs
<ERROR msg='not found symbol'/>
Fail.
返り値のサンプル
<ERROR msg='not found symbol'/>
←
▼
▲
Function find_c( keyword as string, path as string ) as integer
テキストファイルの中で、指定したキーワードを含む行数を返します。
【引数】
keyword
path
検索するキーワード
テキストファイルのパス
キーワードを含む行数
返り値
(src)
←
▼
▲
Sub type_( Path as string )
テキストファイルの内容を表示します。
【引数】
Path
表示するファイルのパス
type は、VBScript の予約語なので、type の後に末尾にアンダースコアを付けた名前にしています。
type_ "result.txt"
サンプル:
参考
←
▼
▲
Function ReadFile( Path as string ) as string
テキストファイルの全体を読み込みます。
【引数】
Path
返り値
読み込むテキストファイルのパス
テキストファイルの内容
ファイルが存在しないときでもエラーにならず、"" を返します。
エラーにするときは次のようにします。
多くの場合、行末に改行文字があります。 ReadFile で取得した末尾に
改行文字があることに注意してください。
Text1
ReadFile( "a.txt" ) = "Text1"+vbCRLF
a.txt
(src)
で作成したファイルは、改行文字は付きません。
t = ReadFile( "a.txt" )
サンプル:
Dim f
Set f = OpenForRead( "a.txt" )
t = ReadAll( f )
→ T_File.vbs # [T_ReadFile]
関連
テスト
文字コードを指定するときは、
を使って
ください。 ただし、Shift-JIS, Unicode, UTF-8(BOMあり) は、使わな
くても自動的に文字コードを判定して、正しく読み込みます。
Set cs = new_TextFileCharSetStack( "EUC-JP" )
t = ReadFile( "a.txt")
cs = Empty
mini (src)
←
▼
▲
Function ReadFileInTag( Path as string, StartOfText as string, EndOfText as string ) as string
テキストファイルの中にある指定の開始タグと終了タグの間にあるテキストを読み込みます。
【引数】
Path
StartOfText
読み込むテキストファイルのパス
読み込む範囲の先頭にあるタグ(テキスト)、または Empty(=先頭から)
タグの間のテキストファイルの内容。 タグ、および、先頭と末尾の改行は除く
読み込む範囲の末尾にあるタグ(テキスト)、または Empty(=末尾まで)
返り値
EndOfText
読み込みサンプル
StartOfText = "<Tag>", EndOfText = "</Tag>" とします。
ファイル
返り値
abc<Tag>123</Tag>def
123
abc<Tag>
123
456
</Tag>def
123
456
(456の後に改行なし)
サンプル
Dim text
CreateFile "index.html", "abc<P class=""new"">123</P>def"
text = ReadFileInTag( "index.html", "<P class=""new"">", "</P>" ) : Assert text = "123"
CreateFile "index.html", "abc<P>def"
text = ReadFileInTag( "index.html", "<P>", Empty ) : Assert text = "def"
text = ReadFileInTag( "index.html", Empty, "<P>" ) : Assert text = "abc"
→ T_File.vbs # [T_ReadFileInTag]
テスト
関連
(src)
←
▼
▲
Function ReadAll( FileStream as TextStream ) as string
テキストファイルをすべてリードします。
【引数】
FileStream
返り値
開いている読み込むファイル
最後までリードしたテキスト
と異なり、ファイルサイズが 0 のときでも、エラーになりません。
TextStream::ReadAll
(src)
関連
←
▼
▲
Function CreateFile( path as string, text as string ) as string
指定のテキストを内容としたテキストファイルを作成します。
【引数】
path
text
作成するテキストファイルのパス
テキストファイルの内容
(src)
末尾に改行は入りません。
サンプル: カレントフォルダに a.txt ファイルを作る
CreateFile "a.txt", "ABC"
返り値
作成したテキストファイルの絶対パス
path に相対パスを指定したとき、基準フォルダはカレント・フォルダになりますが、ワイルド
カードが含まれていると、テンポラリ・フォルダになります。 詳しくは、
start CreateFile( "*.xml", obj.xml )
obj
サンプル: obj の xml プロパティを、テンポラリファイルに出力して開く
関連
を使うと、テキストファイルのフォーマットを指定できます。
→ T_File.vbs [T_CreateFile]
テスト
を使うと、内部で
を使います。
参考
→ FileT_create (clib)
mini (src)
→ T_File.vbs [T_CreateFile_Err]
←
▼
▲
この警告が出る最も多い原因は、ユーザが設定した場所に書き込み許可を設定しなかった
スクリプトのバグです。 スクリプト開発者は、
[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 ファイルがあるフォルダ、または、ユーザが
設定した場所のフォルダのどちらかしか、ファイルを作成したり削除しないように作られます。
このルールが守られなかったとき、警告が出ます。
この機能は、スクリプト開発者のミスによって問題が起きないようにするためのものであり、
悪意のあるスクリプトは、この警告を出さないでファイルを壊すこともあります。
→ T_Writable
デバッガでスクリプトを起動し、Out of Writable の警告で、プログラムの終了やキャンセルを
選ぶと、例外によりブレークします。
Err.Raise E_OutOfWritable,, "Out of Writable """ & CheckPath & """"
' Watch g_CurrentWritables.CurrentPathes and CheckPath
g_CurrentWritables.CurrentPathes や CheckPath をウォッチウィンドウでチェックしてください。
コールツリー
mkdir など
g_AppKey.CheckWritable
m_Key.CheckWritable
g_CurrentWritables.CheckWritable
m_Key.CheckPlusWritable
"...\*" 以外のチェック
"...\*" で追加されたものと比較
m_Key.Ask
警告の表示
m_PlusWritables( UBound( m_PlusWritables ) ) = abs_path
Writable を追加
隠しキーのメソッド
公開キーのメソッド
テスト
グローバル変数のデストラクタでファイル操作をすると、メイン関数で作成した Writables
オブジェクトが削除された後なので、必ず警告が発生します。
If IsEmpty( abs_path ) Then Exit Sub
Writable の中なので OK
AppKey.NewWritable
Writables::SetPathes
m_Pathes( UBound( m_Pathes ) ) = g_TempFile.m_FolderPath + "\"
m_Pathes(i) = abs_path + "\"
Writable の登録
テンポラリを Writable に登録
g_CurrentWritables.AskFileAccess
Writables::Enable
WritablesStack::PushPathes
CurrentWritables::PushPathes
m_PathesStack.Push
Writable を有効にする
をばらまいてください。
Writable の状況を確認したいときは、
←
▼
▲
Function AppKeyClass::NewWritable( Pathes as variant ) as Writables
Sub Main( Opt, AppKey )
Set w_= AppKey.NewWritable( "." ).Enable()
'// 書き込み可能な範囲
w_ = Empty '// これを書かないときは、関数が終わるまでが範囲
End Sub
サンプル1: カレントフォルダを書き込み可能にする
サンプル: 後で out フォルダを書き込み可能にする
Sub Main( Opt, AppKey )
Set wr = AppKey.NewWritable( "out" )
sub2 wr
End Sub
Sub sub2( wr )
Set w_ = wr.Enable()
'// "out" に書き込み可能な範囲
End Sub
書き込み可能なフォルダの設定オブジェクトを生成します。
【引数】
Pathes
書き込み可能なフォルダの
返り値
Writable 設定オブジェクト
通常は、サンプル1のように使い、NewWritable 関数の引数を調整します。
もしくは、使っているオブジェクトの
渡すと、書き込み可能なフォルダの設定を不正に変えられる可能性があります。
返り値である Writable 設定オブジェクトは、他の関数に渡すことができます。
AppKey は、なるべく他の関数に渡さないようにしてください。
Sub Main( Opt, AppKey )
Set w_= AppKey.NewWritable( Array("out1","out2") ).Enable()
'// 書き込み可能な範囲
End Sub
サンプル: 複数のフォルダを書き込み可能にする
AppKeyClass は、
NewWritable( "." )
(src)
。文字列、または文字列の配列
関連
サンプル: デスクトップに新規フォルダの作成を可能にし、新規フォルダの中は書き込み
可能にする。 新規フォルダを作成することができるフォルダのパスの後に \* を指定して
ください。
Sub Main( Opt, AppKey )
desktop = g_sh.SpecialFolders( "Desktop" )
Set w_= AppKey.NewWritable( desktop+"\*" ).Enable()
mkdir desktop+"\New Folder"
'// 書き込み可能な範囲
w_ = Empty '// これを書かないときは、関数が終わるまでが範囲
End Sub
Pathes に指定するパスの最後に "\*" があると、新規フォルダの作成を可能にし、
新規フォルダの中は書き込み可能にします。 "C:\folder1\*" とすると、C:\folder1
にファイルを作成できませんが、フォルダは作成できます。
すでに C:\folder1 にあるフォルダの中は、上書きされないように、書き込み不可
になります。
が出ないようになります。
本関数を正しく使えば、
テスト
Program Files などの OS のシステムフォルダを NewWritable に指定すると、
System folder access の警告になります。 この警告を自動的に無視するときは、
NewWritable を呼び出す前に
に F_IgnoreIfWarn を指定して、
呼び出してください。
→ T_Writable フォルダ
→ [T_Writable] の説明
を使います。
の第2引数である AppKey のクラスです。