(for Internet Explorer)
← ▼ ▲
↑
GetLineNumOfTemplateDifference
Function GetLineNumOfTemplateDifference( TargetString as string,
RegularExpressionPart as string, TemplateString as string ) as integer
指定した文字列の中で、テンプレートに一致しない場所の行番号を返します。
【引数】
TargetString
RegularExpressionPart
テンプレートが含まれる（はずの）文字列
テンプレート（複数行可）
TemplateString
テンプレートの書き方について、
→ 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: の場所の行番号
サンプル
テンプレートに一致しない場所の行番号。 0=すべて一致
返り値
テンプレートの中にあるキーワード。複数行不可
→ 正規表現
→ ToolsLib.vbs
ソース
→ T_fc.vbs
テスト
T_GetLineNumOfTemplateDifference
→ RunGetDifference (ReplaceTemplateClass)
関連
← ▼ ▲
CreateFile
Function CreateFile( path as string, text as string ) as string
指定のテキストを内容としたテキストファイルを作成します。
【引数】
path
text
作成するテキストファイルのパス
テキストファイルの内容
→ WaitForFile
(src)
text に指定した文字列の末尾に改行が自動的に入らないテキストが作成されます。
カレントフォルダに a.txt ファイルを作る
CreateFile "a.txt", "ABC"
返り値
作成したテキストファイルのフル・パス
path に相対パスを指定したとき、基準フォルダはカレント・フォルダになりますが、ワイルド
カードが含まれていると、テンポラリ・フォルダになります。 詳しくは、
start CreateFile( "*.xml", obj.xml )
→ GetTempPath
→ GetTempPath
xml
start
obj
obj の xml プロパティを、テンポラリファイルに出力して開く
→ OpenForWrite
関連
→ テキストファイルを作成する (VBS)
new_TextFileCharSetStack
を使うと、テキストファイルのフォーマットを指定できます。
→ T_File.vbs [T_CreateFile]
テスト
new_IsSafeFileUpdateStack
を使うと、内部で
を使います。
SafeFileUpdate
→ ファイル名、パス (Windows)
参考
→ Out of Writable 警告 [E_OutOfWritable]
→ FileT_create (clib)
mini (src)
→ T_File.vbs [T_CreateFile_Err]
サンプル
サンプル
サンプル
path = "_work.txt"
text = ReadFile( path )
'// ここで text を変更
Set cs = new_TextFileCharSetStack( ReadUnicodeFileBOM( path ) )
CreateFile path, text
cs = Empty
補足
ReadUnicodeFileBOM
new_TextFileCharSetStack
ReadFile
Unicode 形式かどうかを維持してファイルの内容を変更する
OpenForReplace の Text
注意
下記の方法より、
を変更する方が扱いやすいでしょう。
← ▼ ▲
この警告が出る最も多い原因は、ユーザが設定した場所に書き込み許可を設定しなかった
スクリプトのバグです。 スクリプト開発者は、
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"
スクリプトが想定していない場所に、ファイルを出力しようとしたとき、出力してよいかユーザに
確認を取ります。
コマンドプロンプトへの出力例：
確認ウィンドウ：
AppKeyClass::NewWritable
を使ってください。
vbslib を使ったスクリプトは、ダブルクリックした .vbs ファイルがあるフォルダ、または、ユーザが
設定した場所のフォルダのどちらかしか、ファイルを作成したり削除しないように作られます。
このルールが守られなかったとき、警告が出ます。
この機能は、スクリプト開発者のミスによって問題が起きないようにするためのものであり、
悪意のあるスクリプトは、この警告を出さないでファイルを壊すこともあります。
→ T_Writable
Out of 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 を有効にする
AppKeyClass::Watch
をばらまいてください。
Writable の状況を確認したいときは、
AppKeyClass::Ask
テンポラリ フォルダー
の中と、拡張子が .updating のパスについては、NewWritable を
使う必要はありません。
← ▼ ▲
NewWritable (AppKeyClass)
Function AppKeyClass::NewWritable( Pathes as variant ) as Writables
Sub Main( Opt, AppKey )
Set w_= AppKey.NewWritable( "." ).Enable()
'// 書き込み可能な範囲
w_ = Empty '// これを書かないときは、関数が終わるまでが範囲
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
書き込み可能なフォルダの設定オブジェクトを生成します。
【引数】
Pathes
書き込み可能なフォルダの
返り値
Writable 設定オブジェクト
通常は、サンプル１のように使い、NewWritable 関数の引数を調整します。
もしくは、使っているオブジェクトの
渡すと、書き込み可能なフォルダの設定を不正に変えられる可能性があります。
返り値である Writable 設定オブジェクトは、他の関数に渡すことができます。
AppKey は、なるべく他の関数に渡さないようにしてください。
Sub Main( Opt, AppKey )
Set w_= AppKey.NewWritable( Array("out1","out2") ).Enable()
'// 書き込み可能な範囲
End Sub
サンプル： 複数のフォルダを書き込み可能にする
Enable
AppKeyClass は、
→ Writables::Enable
NewWritable( "." )
(src)
。文字列、または文字列の配列
パス
→ ファイル名、パス
関連
→ Out of Writable 警告
→ SetWritableMode
サンプル： デスクトップに新規フォルダの作成を可能にし、新規フォルダの中だけ
書き込み可能にする。
新規フォルダを作成することができるフォルダのパスの後に \* を指定してください。
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 にあるフォルダの中は、上書きされないように、書き込み不可
になります。
Out of Writable 警告
が出ないようになります。
本関数を正しく使えば、
[ 親: Out of Writable 警告 ]
テスト
Program Files などの OS のシステムフォルダを NewWritable に指定すると、
System folder access の警告になります。 この警告を自動的に無視するときは、
NewWritable を呼び出す前に
SetWritableMode
に F_IgnoreIfWarn を指定して、
呼び出してください。
→ T_Writable フォルダ
→ [T_Writable] の説明
GetWritable メソッド
を使います。
の第2引数である AppKey のクラスです。
Main 関数
テンポラリ フォルダー
の中と、拡張子が .updating のパスについては、NewWritable
を使う必要はありません。
Cannot overwrite NOT NEW file
このエラーが発生したときは、次のいずれかがエラー メッセージに含まれます。
Cannot overwrite NOT NEW folder
← ▼ ▲
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
使用サンプル：
Function ClassA::GetWritable() as array of string
書き込み許可の設定が必要なフォルダーの一覧を取得します。
GetWritable メソッドは、それぞれのクラスで定義してください。
InPath
writable
writable
writable
NewWritable
定義サンプル：
Class ClassA
Public Function GetWritable()
GetWritable = Array( "Work" )
End Function
End Class
← ▼ ▲
InPath (AppKeyClass)
Function AppKeyClass::InPath( Paths as Array of string, EnablePath as string ) as boolean
サンプル：
Paths に指定したパスの集合が、EnablePath の中に含まれるかどうかを返します。
【引数】
Paths
EnablePath
パスの配列
許可しているパス
返り値
Paths の要素がすべて許可しているパスに含まれているかどうか
ファイル：
vbslib.vbs
(src)
→ GetWritable メソッド
← ▼ ▲
CheckWritable (AppKeyClass)
(src)
Sub AppKeyClass::CheckWritable( Path as string, Opt as variant )
指定したパスが、
【引数】
Path
Opt
チェックするパス
Empty または c.ForMkDir (*1)
Enable (Writables)
されているかどうかチェックします。
(*1)
Out of Writable 警告
Path が、Enable (Writables) されていなかったら、
が出ます。
Opt 引数に、g_VBS_Lib.ForMkDir を指定すると、Path に指定したパスの
フォルダーを作るために、Path の子フォルダー（Path より長いパス）だけが、
Enable (Writables) されていたときでも、チェックに引っかからなくなります。
g_AppKey.CheckWritable "C:\Users\user1\log.txt", Empty
サンプル
関連
→ mkdir_for
← ▼ ▲
Watch (AppKeyClass)
Sub AppKeyClass::Watch()
Writable の状態を echo 出力します。
サンプル
g_AppKey.Watch
g_AppKey は、公開キーとして用意されているグローバル変数です。
(src)
← ▼ ▲
Enable (Writables)
Function Writables::Enable() as WritablesStack
書き込み可能なフォルダを設定します。
【引数】
返り値
WritableStack オブジェクト
Writables は、
から取得できます。
AppKeyClass::NewWritable
返り値の WritableStack オブジェクトが、どこからも参照されなくなったら、書き込み
可能では無くなります。
１つ目の WritableStack が存在するときに、２つ目の Writable::Enable をすると、ネスト
して、２つ目の WritableStack のみ有効になります。 ２つ目の WritableStack が参照
されなくなったら、１つ目の 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)
→ Out of Writable 警告
関連
[ 親: Out of Writable 警告 ]
Dim w_:Set w_= AppKey.NewWritable( "." ).Enable()
← ▼ ▲
SetWritableMode
Sub SetWritableMode( Mode as integer )
で指定していないフォルダにライトしようとしたときの動きを設定します。
SetWritableMode F_ErrIfWarn
サンプル
F_AskIfWarn
ユーザにライトしていいかどうかを確認します（デフォルト）
F_ErrIfWarn
E_OutOfWritable エラーにします
F_IgnoreIfWarn
警告を無視します（AppKeyClass::SetWritableMode でのみ指定可能）
(src)
writable_path = env("%ProgramFiles%")+"\SampleApp"
Assert InStr( writable_path, "Program Files" ) > 0
AppKey.SetWritableMode F_IgnoreIfWarn
Set w_=AppKey.NewWritable( writable_path ).Enable()
SetWritableMode F_AskIfWarn
Sub AppKeyClass::SetWritableMode( Mode as integer )
NewWritable
→ Out of Writable 警告
関連
[ 親: Out of Writable 警告 ]
サンプル： F_IgnoreIfWarn には、AppKey が必要
Program Files に書き込み許可するときは、以下の手順が最も安全です。
・パスに Program Files が入っていることをチェック
・F_IgnoreIfWarn に設定して警告を抑制して書き込み許可を設定
・F_AskIfWarn に設定を戻す
← ▼ ▲
g_CurrentWritables.CurrentPathes
Dim g_CurrentWritables.CurrentPathes as array of string
現在書き込みを許可しているパスの配列。
→ Out of Writable 警告のデバッグ
関連
→ Code (ArrayClass)
← ▼ ▲
OpenForRead
Function OpenForRead( Path as string ) as TextStream
テキストファイルを開きます。（リード用＝ファイルから入力します）
【引数】
Path
返り値
開くファイルのパス
ファイルのストリーム
と異なり、エラーがあったら、
FileSystemObject::OpenTextFile
エラーメッセージに Path が付きます。
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
E_FileNotExist エラー
E_PathNotFound エラー
または
になります。
→ FileSystemObject::OpenTextFile
→ ReplaceTextFile
→ VBScript - テキストファイルの内容を読む (Read)
→ ファイル名、パス
→ T_File.vbs # [T_OpenFile]
関連
テスト
既定の文字コードを指定します
→ new_TextFileCharSetStack
→ ReadFile
文字コードを指定するときは、
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
→ StringStream クラス
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
サンプル
→ TextStream （VBScript）
ソース
→ vbslib.vbs
OpenForRead
← ▼ ▲
AnalyzeCharacterCodeSet
ファイルの文字 コード セットを判定します。
【引数】
Path
文字コードを判定するファイルのパス
Function AnalyzeCharacterCodeSet( Path as string ) as integer or string
返り値
文字 コード セット
MIME
や
new_TextFileCharSetStack
を使って開きなおしてください。
HTML
の charset によって、文字コードが指定される場合は、文字コードを調べて
XML宣言 (?xml)
の encoding="UTF-8" があるとき
c.No_BOM
c.UTF_8_No_BOM
先頭に BOM がなく、
先頭に BOM がなく、
(文字列)
の encoding があり、"UTF-8" 以外のとき
XML宣言 (?xml)
先頭に BOM がなく、
XML宣言 (?xml)
の encoding がないとき
new_TextFileCharSetStack が UTF-8 のとき
の encoding がなく、
XML宣言 (?xml)
先頭に BOM がなく、
返り値
サンプル
Set cs = new_TextFileCharSetStack( AnalyzeCharacterCodeSet( "File1.txt" ) )
CreateFile "File1.txt", "abc"
cs = Empty
同じ文字コードを使ってファイルを作成する
File1.txt
関連
→ new_TextFileCharSetStack
→ 文字エンコーディングの指定方法
→ Read_XML_Encoding
→ ファイル内の文字コードの指定
c.UTF_8
c.Unicode
先頭に UTF-8 の BOM (EF BB BF) があるとき
先頭に UTF-16 の BOM (FF FE) があるとき
テスト
ソース
→ vbslib.vbs
→ T_Binary.vbs
本関数は、バージョンによって解析の性能が異なります。
現在のバージョンは、以下の方法で解析しています。
WHITE SQUARE エンコーディング判定法 （独自）
の encoding
XML宣言 (?xml)
Unicode の BOM (ByteOrderMaker)
Empty
解析できないとき、Windows の OEMのとき、ファイルがないとき
T_AnalyzeCharacterCodeSet
→ vbslib_helper.c
ReadCharacterEncodingCharacterCommand
← ▼ ▲
ReadUnicodeFileBOM
ファイルの文字コードを判定するために、ファイルの先頭にある BOM を読みます。
【引数】
Path
文字コードを判定するファイルのパス
Function ReadUnicodeFileBOM( Path as string ) as integer
返り値
BOM の文字コード
テスト
→ T_File.vbs
T_ReadUnicodeFileBOM
ソース
→ vbslib.vbs
返り値
ファイルが無いとき
Empty
c.UTF_8
c.Unicode
先頭に UTF-8 の BOM (EF BB BF) があるとき
先頭に UTF-16 の BOM (FF FE) があるとき
Set c = g_VBS_Lib です。
c.No_BOM
BOM がないとき
関連
→ AnalyzeCharacterCodeSet
← ▼ ▲
GetStringFromCharacterCodeSet
vbslib の文字コード セットの数値から、文字列に変換します。
【引数】
in_CharacterCodeSetConstant
vbslib の文字コード セットの数値
Function GetStringFromCharacterCodeSet(
in_CharacterCodeSetConstant as integer or string ) as string
返り値
文字コード セットの文字列
サンプル
Assert GetStringFromCharacterCodeSet( g_VBS_Lib.Shift_JIS ) = "Shift_JIS"
c.No_BOM
詳細
c.Shift_JIS
"Shift_JIS"
vbslib の
文字コード
セットの数値
文字コード
セットの文字列
c.EUC_JP
"EUC-JP"
c.Unicode
"Unicode"
仕様の理由
Shift_JIS は、
HTML
の、META タグの charset 属性に指定できる値です。
c.UTF_8
"UTF-8"
c.UTF_8_No_BOM
"UTF-8-No-BOM"
c.ISO_2022_JP
"ISO-2022-JP"
Empty
"Shift_JIS"
"Shift_JIS"
テスト
→ T_File.vbs
T_GetStringFromCharacterCodeSet
ソース
→ vbslib.vbs
→ GetCharacterCodeSetFromString
関連
←
↓