【VBScript】フォルダ・ファイル操作関連 VBSサンプルプログラム集

Tips
スポンサーリンク

今回はVBScriptで使用頻度の高いフォルダ操作、ファイル操作系のサンプルプログラムを紹介していきます。
フォルダやファイルの操作とは、例えばフォルダやファイルをコピーしたり消したり作成したり、新しくテキストファイルを作ったりといった操作を指します。
実はVBScript単体ではこれらの操作は実装されておらず、こういったフォルダやファイルの操作系処理は、Windowsが持っている「FileSystemObject」を利用して実現しています。

以下のリンク先はMicrosoft公式のVBA用リファレンスページですが、VBScriptでもほぼ同じ様に流用することが可能であり、FileSystemObjectの各メソッドなどの使い方や仕様はすべてこのリファレンスページで確認できます。

FileSystemObject オブジェクト
Office VBA 言語リファレンス

ただ、例のごとくMicrosoftのリファレンス系ページは翻訳が自動翻訳で日本語が怪しかったり、元々の記述が不親切で分りづらく、お世辞にも初心者向けとは言えません。
その為、VBScriptの初心者の人や、あの処理どう書くんだっけ?といちいち調べるのが面倒な人向けに、フォルダ操作、ファイル操作の主要な処理のサンプルプログラムをまとめて紹介していきます。

ファイル・フォルダ存在チェック

指定したファイルやフォルダが存在するかどうかをチェックします。
例えば、CSVデータを取り込む処理を実行する前に、取り込み対象のCSVファイルが想定しているフォルダに存在しているかを処理前にチェックしたり、逆にCSVファイルを出力する際に、出力先に指定したフォルダが存在しているかをチェックするといった処理で活用できます。

ファイル存在チェック

指定したフルパスに対象のファイルが存在するかをチェックします。
FileSystemObjectの「FileExists」メソッドを使用します。

■FileExistsメソッド
構文:FileSystemObject変数.FileExists([pathname])
引数:
   pathname 絶対パス、又は相対パスでチェック対象のファイルパスを指定する。
戻り値:存在すればTrue、存在しなければFalse

 

Option Explicit

Dim objFS
Dim RtnVal

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'FileExistsメソッドにチェック対象のファイルパスを渡して実行します。
    RtnVal = objFS.FileExists("C:\test1.txt")

    'FileExistsの戻り値で処理を分岐します。
    If RtnVal Then
        msgbox "指定したファイルが存在します。"
    Else
        msgbox "指定したファイルが存在しません。"
    End If

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

フォルダ存在チェック

指定したパスのフォルダが存在するかをチェックします。
FileSystemObjectの「FolderExists」メソッドを使用します。

■FolderExistsメソッド
構文:FileSystemObject変数.FolderExists([pathname])
引数:
   pathname 絶対パス、又は相対パスでチェック対象のフォルダパスを指定する。
戻り値:存在すればTrue、存在しなければFalse

 

Option Explicit

Dim objFS
Dim RtnVal

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'FolderExistsメソッドにチェック対象のフォルダパスを渡して実行します。
    RtnVal = objFS.FolderExists("C:\test_folder")

    'FolderExistsの戻り値で処理を分岐します。
    If RtnVal Then
        msgbox "指定したフォルダが存在します。"
    Else
        msgbox "指定したフォルダが存在しません。"
    End If

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

特定のフォルダ内のサブフォルダ名又はファイル名を一覧で取得

特定のフォルダ内のサブフォルダ名やファイル名をループ処理で順に取得します。
ループ処理で対象のフォルダ内のファイルやサブフォルダを順に取得するためには、「GetFolder」メソッドを実行します。
GetFolderメソッドは戻り値として「Folderオブジェクト」を返します。

構文:FileSystemObject変数.GetFolder(フォルダパス文字列)
フォルダー オブジェクト
Office VBA リファレンス トピック

「Folderオブジェクト」は「Filesコレクション」と「Foldersコレクション」を持ち、そのコレクションに対して「For Each…Next」ステートメントを使用して、ファイル又はサブフォルダーの一覧を取得することができます。

Files コレクション
Office VBA リファレンス トピック
Folders コレクション
Office VBA リファレンス トピック

下記のサンプルコードではサブフォルダ名やファイル名を取得していますが、16行目の objFile.Name や objSubFolder.Name のNameプロパティを変更することで、名前だけではなく、更新日時やファイルサイズなどの様々な情報を取得できます。

詳しくは以下のリンクからMicrosoftのレファレンスを参照してください。

File オブジェクト
Office VBA リファレンス トピック

特定のフォルダのファイル名を一覧で取得

指定した特定のフォルダ内のファイルの個数分ループしてファイル名の一覧を取得します。

Option Explicit

Dim objFS
Dim objFolder
Dim objFile

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'ファイルシステムオブジェクトのGetFolderメソッドの戻り値をオブジェクト変数に代入します。
    Set objFolder = objFS.GetFolder("C:\test")

    '指定したフォルダ内のファイルの個数分ループします。
    For Each objFile in objFolder.files
        'メッセージボックスにファイル名を表示します。
        msgbox objFile.Name

    Next

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

特定のフォルダのサブフォルダ名を一覧で取得

指定した特定のフォルダ内のサブフォルダの個数分ループしてサブフォルダ名の一覧を取得します。

Option Explicit

Dim objFS
Dim objFolder
Dim objSubFolder

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'ファイルシステムオブジェクトのGetFolderメソッドの戻り値をオブジェクト変数に代入します。
    Set objFolder = objFS.GetFolder("C:\test")

    '指定したフォルダ内のサブフォルダの個数分ループします。
    For Each objSubFolder in objFolder.subfolders
        'メッセージボックスにサブフォルダ名を表示します。
        msgbox objSubFolder.Name

    Next

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 



ファイルやフォルダのコピー

特定のファイルやフォルダをコピーします。
例えば、ファイルやフォルダのバックアップ目的でコピーしたり、特定の条件に沿って大量のファイルやフォルダをコピーしたりと、事務作業の自動化において色々と活用が可能です。

ファイルのコピー

特定のファイルをコピーします。
FileSystemObjectの「CopyFile」メソッドを使用します。

■CopyFileメソッド
構文:FileSystemObject変数.CopyFile source , destination , [ overwrite ]
引数:
   source コピー元のファイルパスを指定します。※ワイルドカード使用可
   destination コピー先のファイルパス、又はコピー先フォルダパスを指定します。
   overwrite 省略可 True又はFalseを指定。同名ファイルが存在した場合の上書き可否を設定。
戻り値:無し

 

Option Explicit

Dim objFS

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'C:\test\test_1.txtをC:\test\test_2.txtにコピーします。
    objFS.CopyFile "C:\test\test_1.txt" , "C:\test\test_2.txt"

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

フォルダのコピー

特定のフォルダをコピーします。
尚、コピー元フォルダ内にファイルが存在すれば、それらもまとめてコピーします。
FileSystemObjectの「CopyFolder」メソッドを使用します。

■CopyFolderメソッド
構文:FileSystemObject変数.CopyFolder source , destination , [ overwrite ]
引数:
   source コピー元のフォルダパスを指定します。※ワイルドカード使用可
   destination コピー先のフォルダパスを指定します。
   overwrite 省略可 True又はFalseを指定。同名がフォルダがコピー先に存在した場合や同名ファイルが存在した場合に上書き可否を設定します。
戻り値:無し
Option Explicit

Dim objFS

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'C:\testフォルダをC:\test1へコピーします。
    objFS.CopyFolder "C:\test","C:\test1",True

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

ファイルやフォルダの移動

特定のファイルやフォルダを移動します。
事務作業を自動化したり、バッチ処理などを作成する場合は、特定のファイルやフォルダを特定の条件で別の場所に移動させるといった処理が必要になることは多々あります。

ファイルの移動

特定のファイルを移動します。
FileSystemObjectの「MoveFile」メソッドを使用します。

■MoveFileメソッド
構文:FileSystemObject変数.MoveFile source , destination
引数:
   source 移動元のファイルパスを指定します。※ワイルドカード使用可
   destination 移動先のファイルパス、又は移動先フォルダパスを指定します。
戻り値:無し

 

Option Explicit

Dim objFS

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'C:\test.txtファイルをC:\test\test.txtへ移動します。
    objFS.MoveFile  "C:\test.txt","C:\test\test.txt"

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

フォルダの移動

特定のフォルダを移動します。
FileSystemObjectの「MoveFolder」メソッドを使用します。

■MoveFolderメソッド
構文:FileSystemObject変数.MoveFolder source , destination
引数:
   source 移動元のフォルダパスを指定します。※ワイルドカード使用可
   destination 移動先のフォルダパスを指定します。
戻り値:無し

 

Option Explicit

Dim objFS
。
  
    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'C:\testフォルダをC:\test_testフォルダの配下に移動します。
    objFS.MoveFolder "C:\test","C:\test_test\"

    'ファイルシステムオブジェクトを破棄します  Set objFS = Nothing

 

ファイルやフォルダの削除

特定のファイルやフォルダを削除します。
ファイルやフォルダのコピーや移動処理と同様に、事務作業の自動化やバッチ処理による一括化などで削除も使用することは多々あります。

ファイルの削除

特定のファイルを削除します。
FileSystemObjectの「DeleteFile」メソッドを使用します。

■DeleteFileメソッド
構文:FileSystemObject変数.DeleteFile source , [force]
引数:
   source 削除先のファイルパスを指定します。※ワイルドカード使用可
   force 省略可 True又はFalseを指定。読み取り専用ファイルでも強制的に削除するか否かを設定します。
戻り値:無し

 

Option Explicit

Dim objFS

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'C:\test\test.txtを強制的に削除します。
    objFS.DeleteFile "C:\test\test.txt",true

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

フォルダの削除

特定のフォルダを削除します。
FileSystemObjectの「DeleteFolder」メソッドを使用します。

■DeleteFolderメソッド
構文:FileSystemObject変数.DeleteFolder source , [force]
引数:
   source 削除先のフォルダパスを指定します。※ワイルドカード使用可
   force 省略可 True又はFalseを指定。読み取り専用フォルダでも強制的に削除するかを設定。
戻り値:無し

 

Option Explicit

Dim objFS

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'C:\testを強制的に削除します。
    objFS.DeleteFolder "C:\test",true

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

指定されたフルパスからファイルの色々な名前を取得

Windowsにおける「ファイル名」とは”test.txt”というファイル名のファイルが存在した場合、
末尾の「.txt」が拡張子、拡張子を除いた「test」がベース名、拡張子を含む全体を「ファイル名」と呼びます。
対象のファイルパスから、そのパスを分解してそれぞれの名前を取得することができます。
ただ、これらの処理はファイルパスの存在チェックを行わず、純粋にファイルパスの文字列を分解して、指定した範囲のファイル名を取得する実装になっているので、そこを理解したうえで使用しましょう。

フルパスから拡張子を含むファイル名を取得

特定のファイルのフルパスから拡張子を含むファイル名を抜き出して取得します。
FileSystemObjectの「GetFileName」メソッドを使用します。

■GetFileNameメソッド
構文:FileSystemObject変数.GetFileName( pathname )
引数:
   pathname ファイルのフルパス文字列を指定します。※ファイルパスの存在チェックはしない
戻り値:ファイル名

 

Option Explicit

Dim objFS
Dim FileName

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'C:\test.txtのファイル名を取得します。
    FileName = objFS.GetFileName("C:\test.txt")

    msgbox FileName

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

フルパスから拡張子を除いたファイル名を取得

特定のファイルのフルパスから拡張子を除いたファイル名を抜き出して取得します。
FileSystemObjectの「GetBaseName」メソッドを使用します。

■GetBaseNameメソッド
構文:FileSystemObject変数.GetBaseName( pathname )
引数:
   pathname ファイルのフルパス文字列を指定します。※ファイルパスの存在チェックはしない
戻り値:拡張子を除いたファイル名

 

Option Explicit

Dim objFS
Dim FileName

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'C:\test.txtの拡張子を除いたファイル名を取得します。
    FileName = objFS.GetBaseName("C:\test.txt")

    msgbox FileName

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

フルパスからファイル名の拡張子のみを取得

特定のファイルのフルパスからファイル名の拡張子のみを抜き出して取得します。
FileSystemObjectの「GetExtensionName」メソッドを使用します。

■GetExtensionNameメソッド
構文:FileSystemObject変数.GetExtensionName( pathname )
引数:
   pathname ファイルのフルパス文字列を指定します。※ファイルパスの存在チェックはしない
戻り値:ファイル名の拡張子

 

Option Explicit

Dim objFS
Dim FileName

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    'C:\test.txtのファイル名の拡張子のみを取得します。
    FileName = objFS.GetExtensionName("C:\test.txt")

    msgbox FileName

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 



テキストファイルを新規作成、又は新規作成したファイルに書き込み

テキストファイルを作成する処理はファイルシステムオブジェクトにて実施しますが、テキストファイルを作成する「CreateTextFile」メソッドは戻り値として、作成したファイルをTextStreamオブジェクトで返します。
テキストファイルを作成した後で、更にそのファイルに書き込みをしたい場合はTextStreamオブジェクトの各メソッドを使用します。
新規テキストファイルを作成する処理単体ではあまり使用されないかも知れませんが、更に何らかの書き込み処理まで実施する処理であれば、ログ出力系の処理だったり、データベースのデータをカンマ区切り文字などで出力するなどと色々活用が可能です。
是非習得しておきましょう。

テキストファイルの新規作成

指定したファイルパスにテキストファイルを新しく作成します。
FileSystemObjectの「CreateTextFile」メソッドを使用します。

■CreateTextFileメソッド
構文:FileSystemObject変数.CreateTextFile filename , [overwrite] , [unicode]
引数:
   filename 作成先のファイルパスを指定します。
   overwrite 省略可 True又はFalseを指定。同じファイル名のファイルが存在した場合の上書き可否。
   unicode 省略可 True又はFalseを指定。UnicodeとASCIIのどいらで作成するかを指定。省略するとASCII
戻り値:TextStreamオブジェクト

 

Option Explicit

Dim objFS

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    '空のテキストファイルを作成します。
    objFS.CreateTextFile "C:\test.txt" , true

    'ファイルシステムオブジェクトを破棄します。
    Set objFS = Nothing

 

テキストファイルの新規作成し更に値を書き込む

指定したファイルパスにテキストファイルを新しく作成し、同時に値をテキストファイルに書き込みます。
テキストファイルを作成して、同時にテキストを書き込むには、上記サンプルプログラムで紹介した「CreateTextFile」メソッドの戻り値のTextStreamオブジェクトをオブジェクト変数として受け取り、そのTextStreamオブジェクトの「Write」メソッドや「WriteLine」メソッドなどを使用します。

■WriteLineメソッド
構文:TextStream変数.WriteLine string
引数:
   WriteLine 書き込む文字列を指定します。※末尾に改行が入り、空文字列を指定した場合は改行のみ入る。
戻り値:無し

 

Option Explicit

Dim objFS
Dim objStm

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    '空のテキストファイルを作成してTextStreemオブジェクトを生成します。
    Set objStm = objFS.CreateTextFile("C:\test.txt" , true)

    '末尾に改行コードを挿入して文字列を書き込みます。
    objStm.WriteLine "test string line 1"
    objStm.WriteLine "test string line 2"

    'オブジェクトを破棄します。
    Set objStm = Nothing
    Set objFS = Nothing

 

テキストファイル追記書き込み

既に存在しているテキストファイルを開き、そのテキストファイルに対して指定した文字列を追記で書き込みます。
文字列の書き込み処理は上記のサンプルプログラムと同様に「TextStreamオブジェクト」を利用します。
テキストファイルに追記で書き込みをする処理も実務では使用頻度が高く、よく使われるケースではバッチ処理などのログファイルの作成などがあります。

特定のテキストファイルを開いて追記で書き込み

指定したファイルパスにあるテキストファイルを開く、追記で文字列を書き込みます。
テキストファイルを開く処理はFileSystemObjectの「OpenTextFile」メソッドを使用します。
「OpenTextFile」メソッドの戻り値としてTextStreamオブジェクトが返されるため、そのオブジェクトをオブジェクト変数化し、TextStreamオブジェクトの「Write」メソッドや「WriteLine」メソッドなどを使用して文字列を書き込みます。

■OpenTextFileメソッド
構文:FileSystemObject変数.OpenTextFile( pathname , [iomode] , [create] , [format] )
引数:
  pathname 。開く対象のテキストファイルのパスを指定します。
  iomode 省略可 IOモードを指定します。
    値;1 ForReading 書き込み不可。読み取り専用モード。
    値;2 ForWriting 読み込み不可。上書き書き込み専用モード。
    値;8 ForAppending 読み込み不可。最終行に書き込む追記専用モード。
  create 省略可 True又はFalseを指定。Trueの場合、指定パスにファイルが自動無ければ自動作成。
  format 省略可 テキストファイルを開く際の文字コード形式を指定します。
    値;-2 TristateUseDefault システムの既定値の設定でファイルを開きます。
    値;-1 TristateTrue Unicode形式でファイルを開きます。
    値;0 TristateFalse ASCII形式でファイルを開きます。
戻り値:TextStreamオブジェクト

 

Option Explicit

Dim objFS
Dim objStm

    'ファイルシステムオブジェクトを生成します。
    Set objFS = CreateObject("Scripting.FileSystemObject")

    '既存のテキストファイルを開いてTextStreemオブジェクトを生成します。
    Set objStm = objFS.OpenTextFile("C:\test.txt" , 2 , true, 0 )

    '末尾に改行コードを挿入して文字列を書き込みます。
    objStm.WriteLine "test string line 1"
    objStm.WriteLine "test string line 2"

    'オブジェクトを破棄します。
    Set objStm = Nothing
    Set objFS = Nothing

 

VBScriptでは定数は使用不可
MicrosoftのVBAのリファレンスページの「OpenTextFileメソッド」のページでは、引数で「定数」を記載しています。

objFS.OpenTextFile("C:\test.txt" , ForWriting , true, TristateFalse )

ただ、VBScriptはこの定数は使用できないため、必ず「値」を引数に使用してください。

最後に

今回はVBScriptで「FileSystemObject」を使用した様々なファイル操作、フォルダ操作系のサンプルプログラムを紹介しました。
ウェブサイトの管理的には一つのサンプルプログラムごとに一つのページで作成した方が、サイト内のページが増えてPVの増加が見込めて良いのですが、個人的な思いとしては、当記事をブックマークに登録して、何度も見てもらいたいと思って一つのページにまとめています。
よって、そのような活用をしていただけますと嬉しいです。

それでは今回も読んでいただきましてありがとうございました。