←
▼
▲
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
使用サンプル:
Function ClassA::GetWritable() as array of string
書き込み許可の設定が必要なフォルダの一覧を取得します。
GetWritable メソッドは、それぞれのクラスで定義してください。
writable
writable
writable
定義サンプル:
Class ClassA
Public Function GetWritable()
GetWritable = Array( "Work" )
End Function
End Class
←
▼
▲
Function AppKeyClass::InPath( Paths as Array of string, EnablePath as string ) as boolean
サンプル:
Paths に指定したパスの集合が、EnablePath の中に含まれるかどうかを返します。
【引数】
Paths
EnablePath
パスの配列
許可しているパス
返り値
Paths の要素がすべて許可しているパスに含まれているかどうか
ファイル:
vbslib.vbs
(src)
←
▼
▲
(src)
Sub AppKeyClass::CheckWritable( Path as string, Opt as variant )
指定したパスが、
【引数】
Path
Opt
チェックするパス
Empty または c.ForMkDir (*1)
されているかどうかチェックします。
(*1)
Path が、Enable (Writables) されていなかったら、
が出ます。
Opt 引数に、g_VBS_Lib.ForMkDir を指定すると、Path に指定したパスの
フォルダーを作るために、Path の子フォルダー(Path より長いパス)だけが、
Enable (Writables) されていたときでも、チェックに引っかからなくなります。
g_AppKey.CheckWritable path, Empty
サンプル
←
▼
▲
Sub AppKeyClass::Watch()
Writable の状態を echo 出力します。
←
▼
▲
Function Writables::Enable() as WritablesStack
書き込み可能なフォルダを設定します。
【引数】
返り値
WritableStack オブジェクト
Writables は、
から取得できます。
返り値の 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
(src)
関連
Dim w_:Set w_= AppKey.NewWritable( "." ).Enable()
←
▼
▲
Sub SetWritableMode( Mode as integer )
で指定していないフォルダにライトしようとしたときの動きを設定します。
SetWritableMode F_ErrIfWarn
サンプル
ユーザにライトしていいかどうかを確認します(デフォルト)
E_OutOfWritable エラーにします
警告を無視します(AppKeyClass::SetWritableMode でのみ指定可能)
(src)
AppKey.SetWritableMode F_IgnoreIfWarn
Set w_=AppKey.NewWritable( env("%ProgramFiles%")+"\SampleApp" ).Enable()
SetWritableMode F_AskIfWarn
Sub AppKeyClass::SetWritableMode( Mode as integer )
関連
サンプル: F_IgnoreIfWarn には、AppKey が必要
←
▼
▲
Function OpenForRead( Path as string ) as TextStream
テキストファイルを開きます。(リード用=ファイルから入力します)
【引数】
Path
返り値
開くファイルのパス
ファイルのストリーム
と異なり、エラーがあったら、
FileSystemObject::OpenTextFile
エラーメッセージに Path が付きます。
(src)
Dim file, line
'// Dim args : Set args = WScript.Arguments.Unnamed
'// If args.Count = 0 Then Err.Raise 1,,"ファイルをドロップしてください"
Set file = OpenForRead( args(0) )
Do Until file.AtEndOfStream
line = file.ReadLine()
'// If InStr( line, "DEBUG" ) > 0 Then echo line
Loop
file = Empty
または
になります。
→ T_File.vbs # [T_OpenFile]
関連
テスト
既定の文字コードを指定します
文字コードを指定するときは、
を使ってください。
ただし、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
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
サンプル
←
▼
▲
ファイルの文字コードを判定するために、ファイルの先頭にある BOM を読みます。
【引数】
Path
文字コードを判定するファイルのパス
Function ReadUnicodeFileBOM( Path as string ) as integer
返り値
BOM の文字コード。 c.UTF_8, c.Unicode, c.No_BOM, Empty(ファイルが無い)
(src)
関連
サンプル
Dim cs : Set cs = new_TextFileCharSetStack( ReadUnicodeFileBOM( "File1.txt" ) )
CreateFile "File1.txt", "abc"
同じ文字コードを使ってファイルを作成する
File1.txt
テスト
→ T_File.vbs # [T_ReadUnicodeFileBOM]
BOM が無いときは、OS に設定された地域の標準形式になります。
ただし、
XML宣言 (?xml)
や
→ 文字エンコーディングの指定方法
MIME
や HTML の charset によって、文字コードが指定される場合もあり
ます。 その場合、
を使って開きなおしてください。
←
▼
▲
ファイルの先頭行を読んで、改行文字の種類を返します。
【引数】
Path
改行文字の種類を判定するファイルのパス
Function ReadLineSeparator( Path as string ) as integer
返り値
vbCRLF または vbLF
関連
サンプル
f.LineSeparator = ReadLineSeparator( "File1.txt" )
(src)
テスト
→ T_File.vbs # [T_ReadLineSeparator]
←
▼
▲
Function OpenForWrite( Path as string, Flags as integer ) as TextStream
テキストファイルを開きます。(ライト用=ファイルへ出力します)
【引数】
Path
返り値
開くファイルのパス
ファイルのストリーム
と異なり、エラーがあったら、エラーメッセージに Path が付きます。
FileSystemObject::OpenTextFile
Dim file
Dim w_:Set w_= AppKey.NewWritable( "." ).Enable()
Set file = OpenForWrite( "a.txt", Empty )
file.WriteLine "abc"
file = Empty
サンプル
c.Unicode
Flags 引数
Empty または 次の値
Unicode 形式ファイルにします。 指定しないときは、
new_TextFileCharSetStack で指定した既定の文字コードになります。
(src)
Flags
Empty、またはオプション(下記)
c.Append
追記します。
Shift-JIS, Unicode, UTF-8(BOMあり) のときは、文字コードを指定しなくても、
元のファイルと同じ文字コードになります。
関連
→ T_File.vbs [T_OpenForWrite]
テスト
a.txt
を使うと、その他のフォーマットも指定できます。
次の値と論理和をとることもできます。
文字コードの指定は、次のどれかが指定できます。
c.Shift_JIS
c.UTF_8
c.EUC_JP
BOM 付き UTF-8
Shift-JIS
EUC(JP)
BOM なし UTF-8
c.UTF_8_No_BOM
c は g_VBS_Lib から取得できます。
メソッドを使って、Out of Writable 警告が出ないようにしておいてください。
改行コードの指定は、
を使ってください。
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
→ T_File.vbs [T_OpenForWrite_Overwrite]
テキストファイルの内容を書き換えるときは、文字コード(Unicode ファイルのBOM)や改行文字を
を使ってください。
継承する
←
▼
▲
Set cs = new_TextFileCharSetStack( "UTF-8" )
CreateFile "File1.txt", "abc"
サンプル
"UTF-8"
ファイルの文字コードを指定します。
【引数】
CharSet
ファイルの文字コード, Empty=デフォルト
新規作成時のデフォルトは、"Shift_JIS" です。
CharSet 引数に指定する文字列の大文字小文字は区別しません。
c.Unicode などの数値定数を指定することもできます。
Function new_TextFileCharSetStack( CharSet as string ) as TextFileCharSetStack
関連
テスト
→ T_File.vbs [T_CreateFile]
(src)
新規作成するときの出力ファイルや、ファイルから読み込むときの文字コードを指定
します。 返り値のオブジェクトが削除されたら、指定は無効になります。
"UTF-8" は、ファイルの先頭に
BOM
が付きます。 "UTF-8-No-BOM" は付きません。
指定できる値は、レジストリの HKEY_CLASSES_ROOT\MIME\Database\Charset の
サブキーを参照してください。 ただし、"UTF-8-No-BOM" はサブキーにありません。
CharSetの例:
"Shift_JIS", "EUC-JP", "Unicode", "UTF-8", "UTF-8-No-BOM",
"ISO-8859-1", c.Unicode, c.UTF_8, c.UTF_8_No_BOM, c.EUC_JP,
c.Shift_JIS
BOM を付けないときは XML の encoding や HTML の charset などを用いて文字
コードを記述しなければ、多くのプログラムは文字化けを起こします。 一方で、
BOM があるとエラーを起こすプログラムも多くあります。
<?xml version="1.0" encoding="UTF-8"?>
XML の場合
<META http-equiv="content-type" content="text/html; charset=UTF-8"/>
HTML の場合
UTF-8
UTF-8
ファイルの先頭にある BOM を読みます。
XML ファイルの文字コードを指定します。
←
▼
▲
(src)
ファイルの改行文字コードを指定します。
【引数】
LS
ファイルの改行文字コード、または Empty
Function new_TextFileLineSeparatorStack( LS as string ) as TextFileLineSeparatorStack
返り値のオブジェクトが削除されたら、指定は無効になります。
LS 引数
vbCRLF, g_VBS_Lib.CRLF
vbLF, g_VBS_Lib.LF
g_VBS_Lib.KeepLineSeparators
Empty
リードするときは改行文字を自動判定、ライトするときは CR+LF、修正するとき(*下記)は
改行文字の種類を継承します。
CR+LF
LF
改行文字の種類を継承する(下記)
Dim ls : Set ls = new_TextFileLineSeparatorStack( get_ADODBConsts().Keep )
Set f = OpenForRead( Path )
ls = Empty
text = f.ReadLine()
サンプル
参考
など、修正前のテキストと修正後のテキストの両方を指定する vbslib
「改行文字の種類を継承する」 とは、入力ファイルに書かれた改行文字の種類が、1行
単位で、そのまま出力ファイルに書かれることです。 1つのファイルに複数の改行文字の
種類が混ざっていても、そのまま継承されることです。
TextStream::WriteLine に渡すテキストの末尾に vbCRLF または vbLF を付けることが
できます。 付けたときは、その種類の改行文字が出力され、TextStream::WriteLine に
よって自動的に改行文字を付けることはなくなります。 また、デフォルトの改行文字も
指定した種類に変更されます。 改行文字を付けなかったときは、デフォルトの改行
文字が自動的に付きます。 つまり、TextStream::ReadLine で入力した1行をそのまま
TextStream::WriteLine に出力すると、改行文字の種類は継承され、末尾に改行文字
を付けない新たな1行を TextStream::WriteLine に出力すると、前の行の改行文字の
種類を継承します。
自動判定 (下記)
の関数を使ったときは、その関数の中で改行文字の種類の継承処理が行われます。
を使って、入力ファイルの先頭行の改行文字の種類を
判定して、出力ファイルのデフォルト改行文字の種類を設定します。
入力ファイル、出力ファイル、ともに、g_VBS_Lib.KeepLineSeparators (上記) のモード
を使うように、new_TextFileLineSeparatorStack を呼び出します。
TextStream::ReadLine の返り値である1行のテキストの末尾に改行文字が加わります。
改行文字は、ファイルの内容によって、LF または CR+LF のどちらかになります。
ただし、最終行の末尾に改行文字が無いときだけ、改行文字は加わりません。
はじめに、
関連
そうではなく、OpenForRead などを使ってテキストをリードして、OpenForWrite などを
使ってテキストをライトする処理をプログラミングするときは、以下で説明する詳細な
手順を参考に、改行文字の継承を行ってください。
KeepLineSeparators モードでは、TextStream::ReadLine や TextStream::WriteLine に
よってアクセスする1行のテキストの内容が、次のように変わります。
テスト
→ T_Replace.vbs # T_StartReplace_KeepRet_1
→ T_File.vbs # T_OpenFile_LineSepFromFS
TextStream::WriteLineDefault を使うと、渡したテキストの改行文字を、デフォルトの
改行文字に置き換え、渡したテキストの最後に改行文字を追加して、出力します。
←
▼
▲
ファイルを作成するときに
【引数】
IsEnabled
SafeFileUpdate を実行するかどうか
Function new_IsSafeFileUpdateStack( IsEnabled as boolean ) as IsSafeFileUpdateStack
を実行します。
返り値のオブジェクトが削除されたら、指定は無効になります。
(src)
Dim sf : Set sf = new_IsSafeFileUpdateStack( True )
CreateFile "File1.txt", "abc"
サンプル
テスト
→ T_File.vbs [T_CreateFile]
←
▼
▲
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
(src)
←
▼
▲
Sub WriteVBSLibFooter( OutFileStream as TextStream, Opt as WriteVBSLibFooter_Option )
【引数】
OutFileStream
開いている書き込むファイル
WriteVBSLibFooter_Option
Class WriteVBSLibFooter_Option
Public CommandPromptMode
End Class
Opt
オプション or Empty
… Empty でないなら g_CommandPrompt の値を変更します
(src)
現在実行している、メイン.vbs ファイルの中にある --- start of vbslib include --- 以降を
OutFileStream に出力します。
--- start of vbslib include --- が Main 関数より前にあるときは、何もしません。
を出力します。 (メイン.vbs ファイルの最後にするとき)
←
▼
▲
Sub WriteVBSLibHeader( OutFileStream as TextStream, Opt as WriteVBSLibHeader_Option )
【引数】
OutFileStream
開いている書き込むファイル
WriteVBSLibHeader_Option
Class WriteVBSLibHeader_Option
Public m_OverCommandPrompt
End Class
Opt
オプション or Empty
… Empty でないなら g_CommandPrompt の値を変更します
(src)
現在実行している、メイン.vbs ファイルの中にある --- end of vbslib include --- まで(先頭から)を
OutFileStream に出力します。
--- start of vbslib include --- が Main 関数より後にあるときは、何もしません。
を出力します。 (メイン.vbs ファイルの最初にするとき)
←
▼
▲
Dim file
Set file = OpenForReplace( "file1.html", Empty )
file.Replace "<TopOfContexts/>", "<TopOfContexts/>"+vbCRLF+ "new Topic"
file = Empty
Function OpenForReplace( SrcPath as string, DstPath as string ) as ReplaceTextFile1
テキストファイルの内容を変更します。
【引数】
SrcPath
DstPath
変更前のテキストファイルのパス
変更後のテキストファイルのパス。 SrcPath と同じ、または Empty 可。
vbslib.vbs
モジュール・シンボル:
返り値
(src)
ランダムアクセスに対応しています。 OpenForRead や OpenForWrite のようにシーケンシャル
(ファイルの先頭から順番)にアクセスする必要はなく、ReplaceTextFile1::Replace などを
任意の順番で呼び出すことができます。
Set file = OpenForReplace( "file1.txt", Empty )
file.Replace "Value = 0", "Value = 1"
file = Empty
DstPath を Empty にすると、DstPath = SrcPath にした時と同じ動きをします。
file1.txt
Value = 0
Value = 1
→ T_Replace.vbs # T_OpenForReplace
テスト
関連
サンプル:
TopOfContexts タグの後ろに new Topic を追加する
Value の設定値を 0 から 1 に変える
変更する内容は、返り値のメソッドに指定します。
サンプル:
タグに囲まれた複数行を変更する
上と同じ内容の短縮形
OpenForReplace( "file1.txt", Empty ).Replace "Value = 0", "Value = 1"
file1.txt
Value = 0
Value = 1
←
▼
▲
(src)
テキストを置き換えます。
テキストファイルの内容の変更を完了します。
サンプル
指定のタグで囲まれたテキストを置き換えます。
取得
テキストを置き換えます。
指定のタグで囲まれたテキストを置き換えます。
←
▼
▲
Sub ReplaceTextFile1::Replace( FromText as string, ToText as string )
テキストを置き換えます。
【引数】
FromText
ToText
置き換える前のテキスト
置き換えた後のテキスト
(src)
置き換えた後のテキストが存在するときは、置き換えを行いません。
これは、VBS の Replace 関数と結果が異なりますが、追加的な置き換えをしたときに、多重的に
追加されることがなくなります。
例:
f.Replace "a = 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] にはなりません
a = 0 の後に b = 0 を追加する
←
▼
▲
Sub ReplaceTextFile1::ReplaceRange( StartOfFromText as string, EndOfFromText as string,
ToText as string )
指定のタグで囲まれたテキストを置き換えます。
【引数】
StartOfFromText
EndOfFromText
置き換える前のテキストが始まる場所にあるタグ(テキスト)
置き換える前のテキストが終わる場所にあるタグ(テキスト)
置き換えた後のテキスト。 通常、タグも含む。
ToText
置き換えサンプル
StartOfFromText = "<Tag>", EndOfFromText = "</Tag>" とします。
ToText
置き換える前
置き換えた後
abc<Tag>123</Tag>def
<Tag>456</Tag>
abc<Tag>456</Tag>def
abc<Tag>123</Tag>def
456
abc456def
<Tag>
123
456
</Tag>
<Tag>
789
</Tag>
<Tag>
789
</Tag>
サンプル
Dim file
Set file = OpenForReplace( "file1.html", Empty )
file.ReplaceRange "<NewTopic>", "</NewTopic>", _
"<NewTopic>"+vbCRLF+ "new Topic" +vbCRLF+"</NewTopic>"
file = Empty
テスト
→ T_Replace_target.vbs # [T_OpenForReplaceRange]
関連
(src)
置き換える範囲は、複数行であってもかまいません。