(for Internet Explorer)
Function  TextStream::ReadAll() as string
テキストストリームから全て取り出します。
【引数】
返り値
テキストストリームから取り出した内容
2MB 以上であっても取得できます。

返り値は、Len でサイズを取得してもファイルサイズではありません。
0x0D 0x0A を 0x0D に変換しません。
0x00 も取得できます。
0xEAEB は、0x8145 に変わります。
Sub  TextStream::Skip( n as integer )
テキストストリームを指定した文字数だけスキップします。
Sub  TextStream::SkipLine()
テキストストリームを1行スキップします。
  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 行目
Property Get  TextStream::Line() as integer
テキストストリームの現在の行番号。(1〜)
次にアクセスする行番号。
1行目をリード/ライトしたら、Line = 2 になります。
ファイルの最後の行をリードしたときは、+1されません。
関連
Dim  TextStream::AtEndOfStream  as boolean
ストリームの最後なら True
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
サンプル
補足
Sub  TextStream::Write( Text as string )
テキストストリームに出力します。
Sub  TextStream::WriteLine( Text as string )
テキストストリームにテキストと改行を出力します。
Sub  TextStream::WriteBlankLines( LengthOfLine as integer )
テキストストリームに複数の改行を出力します。
'********************************************************************************
'  <<< [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
で起動したコマンドライン・プログラムでは、バッチファイルの pause が正しく
動きません。
WshScriptExec::StdIn.ReadLine を呼ぶと、改行コードが入力されるまで戻ってきません。
WshScriptExec::StdIn.AtEndOfStream や、Read、ReadAll もなぜか戻ってきません。
このため、pause で表示される「続きを実行するとき…」のメッセージは表示されません。
1文字ずつ表示しても、文字の終了が AtEndOfStream で判定しようとすると戻ってこなく
なるので、使えません。
1文字ずつ表示する echo だが、AtEndOfStream で止まることの実証コード:
2&>1 で標準エラー出力を標準出力にリダイレクトすると、止まらないことがあります。
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 の中にコピーします
なお、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
サブフォルダのすべてのファイルにコマンドを実行し、
標準出力をファイルに出力します。
フォルダの中にあるファイルの一覧です。
フォルダの中のフォルダについては、
フォルダの中にあるフォルダの一覧です。
フォルダの中のファイルについては、
  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
→ ファイル一覧
関連
    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
    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
↑上書き、非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
→ base64.zip (VBS)
バイナリファイルは扱えないようです。
CreateTextFile の返り値は、TextStreamオブジェクトです。
ADOのStreamを使えばできるらしい
    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"
    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 を使う場合
    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
関連
関連
'***********************************************************************
'  <<< [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



 
Option Explicit
Dim  v1, v2
Set  v1 = CreateObject(...)
  :
fs = Empty
Option Explicit は、変数宣言が必要である
ようにします。
Set する前に Dim で宣言する必要があります。
If IsEmpty( var ) Then
Dim var して、初期化していないときは、Empty
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 を返したほうがいいでしょう。
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
2つの変数が参照しているオブジェクトが同じ1つのオブジェクトかどうかを
比較します。 メンバ変数の値が全く同じでもオブジェクトが異なるときは、
False となります。 is 演算子の意味は、クラスの is-a 関係とは異なります。
C言語における、ポインタの値の比較に相当します。
オブジェクトを代入します
オブジェクトを代入します。 左辺がオブジェクト型かどうかではなく、右辺がオブジェクト
型なら、Set 命令を使ってください。 Set 命令を使わなければ、右辺の Value プロパティの
値が代入されます。 なお、VBScript の変数には型がないので、そもそも左辺がオブジェクト型
かどうかは判定できません。
「無い」値
同一オブジェクトの判定
変数に入っている値の型
Nothing はオブジェクトなので Set が必要
Nothing かどうかは、is で判定
Null は値なので Set が不要
If objs(i) is obj Then ...
キーワード:
キーワード: