(for Internet Explorer)
← ▼ ▲
↑
SkipLine (TextStream)
Sub TextStream::SkipLine()
テキストストリームを１行スキップします。
(Web)
指定した行へ移動するサンプル：
path = "a.txt"
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set f = g_fs.OpenTextFile( path )
Do Until f.AtEndOfStream
line = f.ReadLine()
If line = "point" Then
i_line = f.Line - 1 '// 行番号を取得。(*1)
Exit Do
End If
Loop
WScript.Echo "i_line = " & i_line
Set f = g_fs.OpenTextFile( path )
For i=1 To i_line - 1 : f.SkipLine : Next '// 行へジャンプ
WScript.Echo f.ReadLine() '// "point" が書いてある行
f = Empty
g_fs = Empty
(*1) ReadLine した後なので、line の行番号は f.Line 行目ではなく f.Line-1 行目
← ▼ ▲
Line (TextStream)
Property Get TextStream::Line() as integer
テキストストリームの現在の行番号。（１〜）
次にアクセスする行番号。
(Web)
１行目をリード/ライトしたら、Line = 2 になります。
ファイルの最後の行をリードしたときは、＋１されません。
関連
→ GetLineCount
← ▼ ▲
AtEndOfStream (TextStream)
Dim TextStream::AtEndOfStream as boolean
ストリームの最後なら True
(Web)
Shell:Exec で起動したプログラムから出力される標準出力ストリームに
バッファリングされた文字がないときは、False を返します。
標準入力ストリームにバッファリングされた文字がないときは、待ち状態に
入ります。改行文字がバッファリングされ、改行文字の前に文字が入力されて
いなかったら True、文字が入力されていたら False を返します。
ファイルの最後が改行文字のとき、その改行文字をリードしたら、AtEndOfStream
= True になります。
end (Return)
f.AtEndOfStream = False
ReadLine = "end"
f.AtEndOfStream = True
ファイル
メソッドの結果
リードした内容が入っている変数が無効かどうかではなく、最後の行かどうかです。
変数 = Null にしておけば、空行である "" と一致しません。
変数 = Empty にしておけば、空行である "" と一致します。
Do Until file.AtEndOfStream
line = file.ReadLine()
Loop
サンプル
補足
← ▼ ▲
Write (TextStream)
Sub TextStream::Write( Text as string )
テキストストリームに出力します。
(Web)
← ▼ ▲
WriteLine (TextStream)
Sub TextStream::WriteLine( Text as string )
テキストストリームにテキストと改行を出力します。
← ▼ ▲
WriteBlankLines (TextStream)
(Web)
Sub TextStream::WriteBlankLines( LengthOfLine as integer )
テキストストリームに複数の改行を出力します。
← ▼ ▲
Shell::Exec で実行すると、pause ができない
'********************************************************************************
' <<< [EchoStream] echo supported No vbCRLF >>>
'********************************************************************************
Dim g_EchoStreamBuf
Sub EchoStream( StreamIn, StreamOut )
Dim s, c
Do Until StreamIn.AtEndOfStream
c = StreamIn.Read(1)
If g_EchoStreamBuf="続行するには何かキーを押してください . . ." Then
Stop
End If
If c <> vbCR and c <> vbLF Then _
g_EchoStreamBuf = g_EchoStreamBuf + c
If c = vbLF Then
WScript.Echo vbCR + g_EchoStreamBuf : g_EchoStreamBuf = ""
Else
StreamOut.Write c
End If
Loop
End Sub
Shell::Exec
で起動したコマンドライン・プログラムでは、バッチファイルの pause が正しく
動きません。
WshScriptExec::StdIn.ReadLine を呼ぶと、改行コードが入力されるまで戻ってきません。
WshScriptExec::StdIn.AtEndOfStream や、Read、ReadAll もなぜか戻ってきません。
このため、pause で表示される「続きを実行するとき…」のメッセージは表示されません。
１文字ずつ表示しても、文字の終了が AtEndOfStream で判定しようとすると戻ってこなく
なるので、使えません。
１文字ずつ表示する echo だが、AtEndOfStream で止まることの実証コード：
2&>1 で標準エラー出力を標準出力にリダイレクトすると、止まらないことがあります。
← ▼ ▲
ファイルコピーの引数
CopyFile
CopyFolder
MoveFile
MoveFolder
CopyFile、MoveFile
dst 引数
src 引数
ファイル a.txt
コピー先フォルダ C:\dst_folder が存在するとき
動作
C:\dst_folder
エラー 800A0046 書き込みできません
C:\dst_folder\a.txt
dst_folder に a.txt をコピーします
C:\dst_folder\b.txt
ファイル名を b.txt に変えてコピーします
CopyFolder、MoveFolder
エラー 800A004C パスが見つかりません
C:\dst_folder\bb\cc
フォルダ aa を dst_folder の中にコピーします
C:\dst_folder\aa
フォルダ aa の内容を dst_folder にコピーします
C:\dst_folder
動作
フォルダ aa
src 引数
dst 引数
コピー先フォルダ C:\dst_folder が存在するとき
に指定するパスがどうなっているかどうかで、
どのような動きをするかをまとめています。
C:\dst_folder\c\d.txt
エラー 800A004C パスが見つかりません
フォルダ名を bb に変えてコピーします
C:\dst_folder\bb
ワイルドカードは、コピー先にマッチしないときに限り使えます。
フォルダ名を変えることはできません。
ワイルドカード
C:\dst_folder
dst_folder にファイルをコピーします
フォルダはコピーしません
C:\dst_folder\c
エラー 800A004C パスが見つかりません
ワイルドカード
C:\dst_folder
フォルダを dst_folder の中にコピーします
copy
なお、vbslib の
ありません。
は、指定したパスがどうなっているかどうかによって動きが変わることは
src にワイルドカードがあるときは、dst はフォルダーとして処理します。
dst がフォルダーとして存在するときは、そのフォルダーの中にコピーします。
そうでないときは、dst がファイルとして処理します。
← ▼ ▲
Set fs = CreateObject("Scripting.FileSystemObject")
fs.CopyFolder "public", "dst\public", True
Set fs = Nothing
フォルダをコピーする
新しくできるフォルダ名
または、上書きするフォルダ名まで含める
WinCE = "C:\WINCE420"
If MsgBox( "coredllをインストールします。"+Chr(13)+WinCE+"\platform\SG2_VR5500\drivers\ipLib\ipLibCom\ipLib-com.h" _
+Chr(13)+WinCE+"\private\WINCEOS\COREOS\CORE\DLL"+Chr(13)+_
WinCE+"\public\common\cesysgen\Makefile"+Chr(13)+_
"を上書きし、"+Chr(13)+_
WinCE+"\PLATFORM\SG2_VR5500\INC\ipLibCom.h などを作成します。"+Chr(13)+_
"よろしいですか？ （ドライブは合っていますか？）"+Chr(13)+_
"（リビルドするときや他の環境で使うときは、アンインストールしてください。）" ,_
vbYesNo + vbExclamation, "上書き確認" ) = vbYes Then
Set fs = CreateObject("Scripting.FileSystemObject")
fs.CopyFolder "platform", WinCE+"\platform", TRUE
fs.CopyFolder "private", WinCE+"\private", TRUE
fs.CopyFolder "public", WinCE+"\public", TRUE
Set fs = Nothing
Set sh = WScript.CreateObject("WScript.Shell")
sh.Run WinCE+"\PLATFORM\SG2_VR5500\DRIVERS\ipLib\ipLib-Headers-maker.vbs",1,True
Set sh = Nothing
MsgBox "インストールが完了しました。"
End If
Sub main()
Set args = WScript.Arguments
If args.Count <> 2 Then MsgBox "This is update files copy script" _
+vbCR+"ex) WScript.exe xcopy_pb.vbs c:\folder1 c:\folder2", vbOKOnly, "xcopy_pb" : Exit Sub
Set fs = CreateObject( "Scripting.FileSystemObject" )
Set folder1 = fs.GetFolder( args(0) )
Set folder2 = fs.GetFolder( args(1) )
For Each file In folder1.Files
fname1 = args(0) + "\" + file.Name
fname2 = args(1) + "\" + file.Name
Set file1 = fs.GetFile( fname1 )
On Error Resume Next
Set file2 = fs.GetFile( fname2 )
On Error Goto 0
If IsEmpty( file2 ) Then
fs.CopyFile fname1, fname2
ElseIf file1.DateLastModified > file2.DateLastModified Then
fs.CopyFile fname1, fname2
End If
Next
End Sub
main
新しいファイルのみコピーする
（サブフォルダはコピーしません）
← ▼ ▲
ファイル一覧
Dim g_fs, folder, file
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set folder = g_fs.GetFolder( "C:\folder" )
For Each file In folder.Files
file.Name, file.Path '// ここに処理を書く
Next
folder = Empty
g_fs = Empty
Dim g_fs, folder, sub_folder
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set folder = g_fs.GetFolder( "C:\folder" )
For Each sub_folder In folder.SubFolders
sub_folder.Name, sub_folder.Path '// ここに処理を書く
Next
folder = Empty
g_fs = Empty
サブフォルダ一覧 （１段下のみ）
Dim g_fs
Set g_fs = CreateObject("Scripting.FileSystemObject")
EnumSubFolders_ g_fs.GetFolder( "C:\folder" )
Sub EnumSubFolders_( folder )
Dim file, sub_folder
For Each file In folder.Files
echo file.Path '// ここに処理を書く
Next
For Each sub_folder In folder.SubFolders
EnumSubFolders_ sub_folder
Next
End Sub
サブフォルダにあるファイル一覧 （再帰、ネスト）
サンプル：
SubFolders.vbs.lzh
サブフォルダのすべてのファイルにコマンドを実行し、
標準出力をファイルに出力します。
ファイルの存在
フォルダの中にあるファイルの一覧です。
フォルダの中のフォルダについては、
→ サブフォルダ一覧 （１段下のみ）
フォルダの中にあるフォルダの一覧です。
フォルダの中のファイルについては、
→ ファイル一覧
ファイル一覧、存在
→ FileSystemObject::FileExists
→ FileSystemObject::FolderExists
存在しないファイルを開く
Dim i
For i = 1 To 9999
If i<9999 Then On Error Resume Next 'try
If i=1 Then : Test_LogFName = "test_log.txt"
Else : Test_LogFName = "test_log" & i & ".txt" : End If
Set g_log = g_fs.CreateTextFile( Test_LogFName, True, False )
e.Copy( Err ) : On Error GoTo 0 : If e.num <> 0 Then 'catch
If e.num <> 70 Then e.Raise
Else
Exit For
End If
Next
→ Folder オブジェクト
→ Folder オブジェクト
→ ファイル一覧
関連
← ▼ ▲
ファイル内アクセス（テキスト）
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set file = g_fs.CreateTextFile( path ******, True, False )
file.Write "改行なし。"
file.WriteLine "ファイル= " & path '// 最後に 0x0D, 0x0A を出します
file.WriteBlankLines 1 '// ブランク行を1行書き込む
file.Close '// 必要
file = Empty
g_fs = Empty
テキストファイルを作成する (Write)
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set f = g_fs.OpenTextFile( path ******,,,-2 )
Do Until f.AtEndOfStream
line = f.ReadLine() '// 改行(vbCR+vbLF)は含まない
Loop
f.Close '// 必要
f = Empty
g_fs = Empty
テキストファイルの内容を読む (Read)
↑上書き、非Unicode
Set g_fs = CreateObject( "Scripting.FileSystemObject" )
Set f = g_fs.OpenTextFile( read_path1 ****** )
t = f.ReadAll
f = Empty '// 無くてもよい（ガベージコレクタでクローズされるため）
Set f = g_fs.OpenTextFile( read_path2 ****** )
t = t + f.ReadAll
f = Empty
Set f = g_fs.CreateTextFile( write_path ******, True )
f.Write t
f = Empty
テキストファイルを結合する
→ テキストファイルを作成する (Write)
→ テキストファイルの内容を読む (Read)
→ base64.zip (VBS)
バイナリファイルは扱えないようです。
CreateTextFile の返り値は、TextStreamオブジェクトです。
ADOのStreamを使えばできるらしい
→ CreateTextFile メソッド (Web)
→ テキストファイルを結合する
→ FileSystemObject::OpenTextFile
Dim g_fs, f
Set g_fs = CreateObject( "Scripting.FileSystemObject" )
Const ForAppending = 8
Set f = g_fs.OpenTextFile( path ******, ForAppending, True, False )
f.WriteLine "A"
テキストファイルに追記する (Appending Write)
→ テキストファイルに追記する (Appending Write)
ReadLine
OpenTextFile
OpenTextFile
CreateTextFile
CreateTextFile
Set g_fs = WScript.CreateObject( "Scripting.FileSystemObject" )
Set f = g_fs.OpenTextFile( path ****** )
t = ""
On Error Resume Next
t = f.ReadAll()
en = Err.Number : ed = Err.Description : On Error GoTo 0
If en = E_EndOfFile Then en = 0
If en <> 0 Then Err.Raise en,,ed
f = Empty
ReadAll を使う場合
テキストファイルの一部を置き換える
→ テキストファイルの一部を置き換える
→ TextStream
Set g_fs = CreateObject( "Scripting.FileSystemObject" )
Dim rf, wf, line, src_path, dst_path
src_path = folder_path + "\sample.c"
dst_path = folder_path + "\sample.c_"
If Not g_fs.FileExists( dst_path ) Then
mkdir g_fs.GetParentFolderName( dst_path )
Set rf = g_fs.OpenTextFile( src_path )
Set wf = g_fs.CreateTextFile( dst_path, True )
Do Until rf.AtEndOfStream
line = rf.ReadLine()
line = Replace( line, "from", "to" )
wf.WriteLine line
Loop
rf = Empty : wf = Empty
copy dst_path, src_path
del dst_path
End If
folder_path + "\sample.c"
folder_path + "\sample.c_"
to
from
Replace
CreateTextFile
OpenTextFile
→ ReadAll
関連
→ OpenForRead (vbslib)
→ OpenForWrite (vbslib)
関連
→ ADODB.Stream
← ▼ ▲
DeleteFolderR
'***********************************************************************
' <<< [DeleteFolderR] リードオンリーファイルを含むフォルダでも削除する >>>
'************************************************************************/
Sub DeleteFolderR( path )
Set fs = CreateObject( "Scripting.FileSystemObject" )
If fs.FolderExists( path ) Then Exit Sub
path2 = path ' 末尾の \ 記号を取る
If Right( path2, 1 ) = "\" Then path2 = Left( path2, Len( path2 ) - 1 )
nFolder = 1
ReDim folderPathes(nFolder)
folderPathes(nFolder) = path2
' サブフォルダを列挙する
iFolder = 1
While iFolder <= nFolder
Set fo = fs.GetFolder( folderPathes(iFolder) )
For Each sub in fo.SubFolders
nFolder = nFolder + 1
ReDim folderPathes(nFolder)
folderPathes(nFolder) = sub.Path
Next
Set fo = Nothing
iFolder = iFolder + 1
WEnd
' すべてのサブフォルダにあるファイルのリードオンリー属性を外す
For iFolder = 1 To nFolder
Set fo = fs.GetFolder( folderPathes(iFolder) )
For Each f in fo.Files
Set file = fs.GetFile( f.Path )
file.Attributes = file.Attributes And Not ReadOnly
Set file = Nothing
Next
Set fo = Nothing
Next
' フォルダを削除する
fs.DeleteFolder( path )
Set fs = Nothing
End Sub
CreateFolder
→ FileSystemObject::CreateFolder
← ▼ ▲
変数、Empty、型、配列
Option Explicit
Dim v1, v2
Set v1 = CreateObject(...)
:
fs = Empty
Option Explicit は、変数宣言が必要である
ようにします。
Set する前に Dim で宣言する必要があります。
If IsEmpty( var ) Then
Dim var して、初期化していないときは、Empty
→ Dim の詳細
Set a = Nothing
If a is Nothing Then
Empty は、変数に何も値が入っていないことを示します。 未初期化と同じです。
Null は、変数に何も値が入っていないことを示します。 初期化済みとは区別できます。
Null と比較すると、演算結果は常に Null （False として分岐）になります。 If Empty <> 0 Then
は True として分岐しますが、If Null <> 0 Then は False として分岐するので注意してください。
Nothing は、何も無いことを示すオブジェクトです。
返り値がオブジェクトのときは、呼び出し側が Set を使うので、
Nothing を返したほうがいいでしょう。
→ 配列、Redim Preserve
Empty などの比較は、次のようになります。
Empty = "" '// True, 真
not Empty '// -1, 真
Null = "" '// Null, 偽
Null <> "" '// Null, 偽
If IsObject( b ) Then Set a = b Else a = b
下記のようにすれば、オブジェクトでもそうでなくても代入できます。
a = Null
If IsNull( a ) Then
Is 演算子
２つの変数が参照しているオブジェクトが同じ１つのオブジェクトかどうかを
比較します。 メンバ変数の値が全く同じでもオブジェクトが異なるときは、
False となります。 is 演算子の意味は、クラスの is-a 関係とは異なります。
C言語における、ポインタの値の比較に相当します。
Empty, Nothing, Null
Set 命令
→ Set 命令
オブジェクトを代入します
オブジェクトを代入します。 左辺がオブジェクト型かどうかではなく、右辺がオブジェクト
型なら、Set 命令を使ってください。 Set 命令を使わなければ、右辺の Value プロパティの
値が代入されます。 なお、VBScript の変数には型がないので、そもそも左辺がオブジェクト型
かどうかは判定できません。
→ Empty, Nothing
「無い」値
→ Is 演算子
→ 型の判定
同一オブジェクトの判定
変数に入っている値の型
→ 単体と配列の共用変数
Nothing はオブジェクトなので Set が必要
Nothing かどうかは、is で判定
Null は値なので Set が不要
If objs(i) is obj Then ...
キーワード：
IsEmpty, IsNull
キーワード：
IsObject
← ▼ ▲
Dim の詳細
Dim は、グローバルで実行するとグローバルスコープに、
プロシージャで実行するとローカルスコープになります。
グローバルスコープとローカルスコープの両方で宣言すると、ローカルスコープの変数だけ
見えますが、グローバルスコープの変数も別に存在します。
プロシージャの中で Execute してインクルードしたコードは、ローカルスコープになります。
Dim した後で、同じ変数名を Dim したときは、すでに使えるので無視され、
エラーにもなりません。
Dim は実行フェーズで評価されます。 文法解析時は評価しません。
Dim していない変数であるというエラーは、変数を評価するときに発生します。
→ Dim ステートメント (Web)
←
↓