(for Internet Explorer)
← ▼ ▲
↑
ReplaceStringTemplates
Sub ReplaceStringTemplates( in_FileOrFolderPath as string,
in_Replaces as array of StringTemplateReplaceClass, in_Empty as Empty )
テキストファイルの中をキーワードで検索し、テンプレートを置き換えます。
【引数】
in_FileOrFolderPath
in_Replaces
検索対象ファイルやフォルダーのパス
in_Empty
Empty を指定してください
テンプレートの配列（下記）
→ ToolsLib.vbs
ソース
テスト
StringTemplateReplaceClass
.KeywordBefore
.TemplateBefore
.TemplateAfter
.DefaultValues
string
string
string
dictionary< string >
検索対象のワイルドカード
置き換える前のテンプレート
置き換えた後のテンプレート
変数のデフォルト値
→ new_ReplaceTemplateClass
→ ReplaceStringTemplate
サンプル
← ▼ ▲
new_ReplaceTemplateClass
→ Samples\ReplaceTemplate フォルダー
→ SyncFilesMenuLib.vbs
サンプル
ソース
Function new_ReplaceTemplateClass( in_PathOfXML as string ) as ReplaceTemplateClass
テキストファイルのテンプレートを操作するオブジェクトを生成します。
【引数】
in_PathOfXML
テンプレートに関するの設定ファイルのパス
テンプレートを操作するオブジェクト
返り値
→ RunGetDifference
テキストファイルのテンプレートを操作するオブジェクトは、次のメソッドを持ちます。
→ EchoOld
→ RunReplace
合っていない（古い）テンプレートの場所を表示します
合っていない（古い）テンプレートの中の場所を表示します
テンプレートを置き換えます
→ ファイルの内容
テスト
→ T_ReplaceByTemplate フォルダー
in_PathOfXML 引数に、フォルダーのパスを指定したときは、そのフォルダーとサブ フォルダーに
入っている *.replace.xml ファイルの内容を設定します。 また、*.before.* と *.after.* の両方の
ファイルがあれば、*.before.* を置き換える前のテンプレート、*.after.* を置き換えた後の
テンプレートとして設定します。
*.replace.xml
in_PathOfXML
*.after.*
*.before.*
置き換える前のテキストがそのまま入ったファイル
置き換えた後のテキストがそのまま入ったファイル
詳細な置き換えの設定
→ ReplaceTemplate.xml
コールツリー
replace_.ID_Before = xml_full_path + tag.getAttribute( "before" )
Me.ReplaceTemplate.Add replace_
ReplaceTemplateClass::AppendLoadSetting
ReplaceTemplateClass::RunReplace
ReplaceStringTemplate
Me.Files.GetText( replace_.ID_Before )
Set Me_.Files = new MultiTextXML_Class
new_ReplaceTemplateClass
MultiTextXML_Class
in_PathOfXML 引数に、
ReplaceTemplate.xml ファイル
のパスを指定してください。
← ▼ ▲
ReplaceTemplate.xml
/MultiText/Target
@path
処理対象のパス。複数可能。
→ FF-path 属性
処理対象のパス。 関連
/MultiText/EnabledTemplateIDs
現在使われている（変換後の）テンプレートのアドレス。
複数指定するときは、複数行記述してください。
@type
"Lines" を指定してください。
text()
/MultiText/ReplaceTemplateID_From
→ Samples\ReplaceTemplate フォルダー
サンプル
→ ReplaceStringTemplate
→ MultiTextXML_Class
${ } 変数、テキストファイルのテンプレート
new_ReplaceTemplateClass 関数
ReplaceTemplate タグを記述するファイルです。 ファイル名は、ReplaceTemplate.xml とは限りません。
ReplaceTemplate.xml は、
詳細
/MultiText/ReplaceTemplate
@before
@after
置き換える前のテキストがある Text タグの URL
置き換えた後のテキストがある Text タグの URL
/MultiText/Text
置き換える前または後のテンプレート
→ SetTargetPath
マージ設定ファイル
や
の
<?xml version="1.0" encoding="UTF-16"?>
<MultiText>
<ReplaceTemplate before="#Before" after="#After"/>
<Text id="Before"><![CDATA[
/* Function: ${FunctionName} */
]]></Text>
<Text id="After"><![CDATA[
/* Func: ${FunctionName} */
]]></Text>
</MultiText>
サンプル
/* Function: … */ を /* Func: … */ に置き換える設定
${ } 変数で置き換える前の内容を置き換えた後にコピーできます。
text()
→ CutIndentOfMultiLineText
インデント、改行コード
@id
@cut_indent
@indent
テンプレートに記述できる ---- 形式のコメント
→ MultiTextXML_Class
値の末尾が "_Keyword" のとき
→ EchoOld (ReplaceTemplateClass)
text()
置き換える前のテンプレートのアドレス。
→ RunReplace (ReplaceTemplateClass)
/MultiText/ReplaceTemplateID_To
→ RunReplace (ReplaceTemplateClass)
置き換えた後のテンプレートのアドレス。
text()
→ EchoOld (ReplaceTemplateClass)
→ RunReplace (ReplaceTemplateClass)
→ RunReplace (ReplaceTemplateClass)
← ▼ ▲
IsPause (ReplaceTemplateClass)
Dim ReplaceTemplateClass::IsPause as boolean
ユーザーへの確認を行うかどうか。
RunReplace メソッド
を呼び出したとき、置き換え内容を
たとえば、False に設定すると、
ユーザーに要求しなくなります。
← ▼ ▲
EchoOld (ReplaceTemplateClass)
→ SyncFilesMenuLib.vbs
ソース
Sub ReplaceTemplateClass::EchoOld()
現在使われているテンプレートと合っていない（古い）テンプレートの場所を表示します。
以下の場所にあるテキスト ファイルの一部がテンプレートがマッチしませんでした。
下記のパスの末尾にある番号は、テンプレートの中のキーワードがある行番号です。
vbslib Prompt.vbs の OpenByStepPath コマンドで開くことができます。
基準パス："C:\Folder"
GetDifference コマンドでテンプレートの中のマッチしなかった行の行番号が表示されま
す。
-------------------------------------------------------------------------------
Target\a.txt(2)
Target\a.txt(13)
-------------------------------------------------------------------------------
サンプル
EchoOld 実行時の表示内容
関連
→ SearchStringTemplate
<< new_ReplaceTemplateClass
ReplaceTemplate.xml
設定してください。
そのテンプレートを囲むタグの id 属性（ /MultiText/Text/@id ） と
/MultiText/EnabledTemplateIDs/text() の ID が同じになるように ID を設定してください。
ただし、 /MultiText/EnabledTemplateIDs/text() の各行の先頭には # を記述してください。
# を記述することは、HTML の A href 属性と同じ仕様です。
/MultiText/EnabledTemplateIDs/text() に複数行のテキストを指定すると、複数の
テンプレートについて処理を行います。
テンプレートが id="A" にあるとき（/MultiText/Text[@id='A']/text() にあるとき）、
_Keyword を末尾に追加した id 属性のテキスト （/MultiText/Text[@id='A_Keyword ']/text() ）
にテンプレートの中の１行にヒットする正規表現を設定してください。
上記テンプレートを ReplaceTemplate.xml の一部に設定する内容の例
<EnabledTemplateIDs type="Lines">
#vbslib_copyright
</EnabledTemplateIDs>
<Text id="vbslib_copyright_Keyword"><![CDATA[
vbslib is provided under
]]></Text><Text id="vbslib_copyright"><![CDATA[
'* vbslib is provided under 3-clause BSD license.
'* Copyright (C) Sofrware Design Gallery "Sage Plaisir 21" All Rights Reserved.
]]></Text>
参考
→ OpenByStepPath
'* vbslib is provided under 3-clause BSD license.
'* Copyright (C) Sofrware Design Gallery "Sage Plaisir 21" All Rights Reserved.
テンプレートの例
の /MultiText/Text/text() に、現在使われているテンプレートを
→ RunGetDifference
GetDifference コマンド
OpenByStepPath コマンド
← ▼ ▲
RunGetDifference (ReplaceTemplateClass)
→ SyncFilesMenuLib.vbs
ソース
Sub ReplaceTemplateClass::RunGetDifference()
現在使われているテンプレートと合っていない（古い）テンプレートの中の場所を表示します。
Enterのみ："Target\a.txt"
調べるファイルのパス >
以下の場所にあるテンプレートがマッチしませんでした。
-------------------------------------------------------------------------------
Target\a.txt(5)
-------------------------------------------------------------------------------
サンプル
表示内容
調べる対象のファイルの入力を要求されます。
関連
→ GetLineNumOfTemplateDifference
<< new_ReplaceTemplateClass
← ▼ ▲
SetTargetPath (ReplaceTemplateClass)
Sub ReplaceTemplateClass::SetTargetPath( in_Path as string or PathDictionaryClass )
処理対象のファイルやフォルダーのパスを設定します。
【引数】
in_Path
処理対象のファイルやフォルダーのパス
→ SyncFilesMenuLib.vbs
ソース
ReplaceTemplate.xml
の /MultiText/Target が設定されていないときは、本関数で設定する必要が
あります。
← ▼ ▲
RunReplace (ReplaceTemplateClass)
→ SyncFilesMenuLib.vbs
ソース
Sub ReplaceTemplateClass::RunReplace()
テンプレートを置き換えます。
以下の場所にあるファイルの中にあるテンプレートを置き換えます
編集するフォルダー = Target
ReplaceTemplateID_From = #vbslib_copyright_old
ReplaceTemplateID_To = #vbslib_copyright
続行するには Enter キーを押してください . . .
-------------------------------------------------------------------------------
>ReplaceStringTemplate "Target", "\* Function:"
Target\a.txt
サンプル
表示内容
実行するかどうかの確認を要求されます。
参考
<< new_ReplaceTemplateClass
→ ReplaceTemplate.xml に設定できる値
上記テンプレートを ReplaceTemplate.xml の一部に設定する内容の例
<ReplaceTemplateID_From>#vbslib_copyright_old</ReplaceTemplateID_From>
<ReplaceTemplateID_To >#vbslib_copyright</ReplaceTemplateID_To>
<Text id="vbslib_copyright_old_Keyword"><![CDATA[
vbslib is provided under
]]></Text><Text id="vbslib_copyright_old"><![CDATA[
'* vbslib is provided under 3-clause BSD license.
'* Copyright (C) "Sage Plaisir 21" All Rights Reserved.
]]></Text>
<Text id="vbslib_copyright_Keyword"><![CDATA[
vbslib is provided under
]]></Text><Text id="vbslib_copyright"><![CDATA[
'* vbslib is provided under 3-clause BSD license.
'* Copyright (C) Sofrware Design Gallery "Sage Plaisir 21" All Rights Reserved.
]]></Text>
'* vbslib is provided under 3-clause BSD license.
'* Copyright (C) Sofrware Design Gallery "Sage Plaisir 21" All Rights Reserved.
置き換えた後のテンプレートの例
置き換える前のテンプレートの例
'* vbslib is provided under 3-clause BSD license.
'* Copyright (C) "Sage Plaisir 21" All Rights Reserved.
ReplaceTemplate.xml
してください。 別の /MultiText/Text/text() に、置き換えた後のテンプレートを設定して
ください。
置き換える前のテンプレートを囲むタグの id 属性（ /MultiText/Text/@id ） と
/MultiText/ReplaceTemplateID_From/text() の ID が同じになるように ID を設定してください。
置き換えた後のテンプレートを囲むタグの id 属性（ /MultiText/Text/@id ） と
/MultiText/ReplaceTemplateID_To/text() の ID が同じになるように ID を設定してください。
ただし、 /MultiText/ReplaceTemplateID_From/text() の先頭と
/MultiText/ReplaceTemplateID_To/text() の先頭には # を記述してください。
# を記述することは、HTML の A href 属性と同じ仕様です。
テンプレートが id="A" にあるとき（/MultiText/Text[@id='A']/text() にあるとき）、
_Keyword を末尾に追加した id 属性のテキスト （/MultiText/Text[@id='A_Keyword ']/text() ）
にテンプレートの中の１行にヒットする正規表現を設定してください。
の /MultiText/Text/text() に、置き換える前のテンプレートを設定
← ▼ ▲
Set rep = StartReplace( "a.txt", "a.txt.updating", True )
Do Until rep.r.AtEndOfStream
SplitLineAndCRLF rep.r.ReadLine(), line, cr_lf '// Set "line", "cr_lf"
line = Replace( line, "Value=0", "Value=1" )
rep.w.WriteLine line + cr_lf
Loop
rep.Finish
SafeFileUpdateEx "a.txt.updating", "a.txt", Empty
StartReplace
Set rep = StartReplace( "a.txt", GetTempPath("*.txt"), False )
Do Until rep.r.AtEndOfStream
SplitLineAndCRLF rep.r.ReadLine(), line, cr_lf '// Set "line", "cr_lf"
line = Replace( line, "Value=0", "Value=1" )
rep.w.WriteLine line + cr_lf
Loop
rep.Finish
(src)
Function StartReplace( SrcPath as string, TmpDstPath as string, IsDstWillBeExist as boolean )
as StartReplaceObj
ファイルの一部を行単位で置き換える準備をします。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
TmpDstPath が置き換えた後のパスかどうか
IsDstWillBeExist
サンプル
StartReplace を呼び出すと、SrcPath と TmpDstPath のファイルを開きます。
返り値を使って、ファイルにアクセスできます。（下記サンプルを参照）
返り値
コンテキスト
StartReplaceObj
関連
→ AddLastOfFileName
→ GetTempPath
→ T_Replace.vbs # [T_StartReplace]
テスト
改行文字コードは、SrcPath に記述されているものが、そのまま継承されます。 ただし、
get_ADODBConsts
が使える環境である必要があります。 （通常、使えます）
また、rep.r 「以外」のファイルから rep.w にライトするときは、リードするファイルを開くときに、
改行文字コードについて
ReadLine で取得できる行の末尾には、vbCRLF または vbLF が付きます。
その他のサンプル
→ サンプル （ウィザード）
→ サンプル （ドラッグ＆ドロップからテキスト処理）
IsDstWillBeExist に g_VBS_Lib.DstIsBackUp を指定すると、TmpDstPath にバックアップを作成し、
SrcPath 置き換えた後の内容が入ります。
IsDstWillBeExist = False のときは、返り値の Finish メソッドを呼び出すと、全てのファイルを閉じ、
TmpDstPath から SrcPath へ、ファイルコピーを行い、TmpDstPath を削除します。
SplitLineAndCRLF
WriteLine で行を出力するときは、ReadLine で取得した改行文字を付けてください。
SplitLineAndCRLF
を使えば、改行文字を分けることができます。
関連
→ FindStringLines
→ StringStream クラス
new_TextFileLineSeparatorStack
( g_VBS_Lib.KeepLineSeparators ) が必要です。
CutIndentOfMultiLineText
は、改行文字コードを明示的に指定する
MultiTextXML_Class
、
ことができます。
→ OpenForReplace
重要なファイルを上書き更新するときは、StartReplace の TmpDstPath 引数に一時的に
出力するパスを指定し、その一時ファイルを作成した後（ファイルを閉じた後）で、
SafeFileUpdateEx
を呼び出してください。 ただし、内部で２〜３回のファイルコピーを行います。
SplitLineAndCRLF
サンプル
SafeFileUpdateEx
← ▼ ▲
StartReplaceObj クラス
テキストファイルの一部を置き換えるインターフェース
取得
→ StartReplace
→ StartReplace2
r
w
置き換えようとするファイルのストリーム
一時ファイル、または置き換えた後のファイルのストリーム
→ TextStream
→ TextStream
Finish
正常に完了したら呼び出す必要がある関数
→ サンプル
Class_Terminate
デストラクタ。 Finish または ExitFinish が呼ばれなかったら警告します
ExitFinish Empty
置き換えをキャンセルします。
← ▼ ▲
ReplaceTextFile
Sub ReplaceTextFile( SrcPath as string, TmpDstPath as string,
bDstWillBeExist as boolean, ReplaceList as ReplaceItem, Opt as variant )
ファイルの一部を置き換えます。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
TmpDstPath が置き換えた後のパス=True, 一時パス=False
bDstWillBeExist
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
サンプル：
(src)
1
new_ReplaceItem_array については、
Class ReplaceItem
Public Src
Public Dst
End Class
→ new_ReplaceItem_array : オブジェクトの配列を生成する
%base%
g_sh.CurrentDirectory
file.txt
→ TextFileConvertFormat::Set_
参考
ver4 で、廃止になりました。 OpenForReplace を使ってください。
→ OpenForReplace
← ▼ ▲
サンプル （ドラッグ＆ドロップからテキスト処理）
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
スクリプト･ファイルに処理をするファイルを直接ドラッグ＆ドロップしても、スクリプト・ファイルをダブル・
クリックして開いたウィンドウに処理するファイルをドラッグ＆ドロップしても処理ができます。
「line = "> "+ line」 の部分を処理内容に書き換えてお使いください。
← ▼ ▲
サンプル （ウィザード）
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
sample_wizard.vbs
wizard
sample_wizard.vbs
files
template.c
デスクトップに、テンプレート・ファイルを少し加工してフォルダを作成します。
exe name>
と表示されるので、入力すると、
_src\Test\vbslib_test\T_Replace\T_Replace_Sample1 にあります。
← ▼ ▲
StartReplace2
Function StartReplace2( SrcPath as string, MidPath as string, Flags as integer,
TmpDstPath as string, bDstWillBeExist as boolean ) as StartReplaceObj
F_Txt2BinTxt を指定してください（下記）
ファイルの一部を置き換えて、更にフィルタ処理をするための準備をします。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
TmpDstPath が置き換えた後のパスかどうか
bDstWillBeExist
返り値
コンテキスト
MidPath
Flags
一時ファイルのパス
StartReplaceObj
F_Txt2BinTxt
StartReplaceObj.w に、Chr(&hFF) から始める行を出力すると、その行はバイナリになり
ます。
→ バイナリ混在テキスト生成 (txt2bintxt.exe)
→ TextFileConvertFormat::Set_
参考
← ▼ ▲
PassThroughLineFilters
Sub PassThroughLineFilters( SrcPath as string, TmpDstPath as string,
IsDstWillBeExist as boolean, Opt as Empty, FilterArray as array of string )
指定のキーワードを含む行を抽出します。
【引数】
SrcPath
TmpDstPath
置き換えようとするファイル
一時ファイルのパス、または置き換えた後のパス
IsDstWillBeExist
TmpDstPath が置き換えた後のパスかどうか
キーワードの配列
Empty または False (=FilterArray に含まない行を抽出）
FilterArray
Opt
(src)
PassThroughLineFilters( "a.txt", GetTempPath("*.txt"), False, Empty, _
Array( "(TRACE)", "(DEBUG)" )
サンプル
(TRACE) と (DEBUG) を含む行だけにします。
→ T_Replace.vbs # [T_PassThroughLineFilters]
テスト
関連
→ grep (検索)
→ FindStringLines
廃止予定
代わり
→ FindStringLines
→ Text (ReplaceTextFile1)
← ▼ ▲
SplitLineAndCRLF
Sub SplitLineAndCRLF( LineAndCRLF as string, out_Line as string, out_CRLF as string )
行の本文と、行末の改行文字を分けます。
【引数】
LineAndCRLF
out_Line
改行文字が末尾に含まれている可能性がある文字列
（出力） 改行文字より前の文字列
ファイル：
vbslib
out_CRLF
（出力） 行末の改行文字
(src)
→ 改行文字コードについて
関連
←
↓