今回はVBScriptで使用頻度の高いフォルダ操作、ファイル操作系のサンプルプログラムを紹介していきます。
フォルダやファイルの操作とは、例えばフォルダやファイルをコピーしたり消したり作成したり、新しくテキストファイルを作ったりといった操作を指します。
実はVBScript単体ではこれらの操作は実装されておらず、こういったフォルダやファイルの操作系処理は、Windowsが持っている「FileSystemObject」を利用して実現しています。
以下のリンク先はMicrosoft公式のVBA用リファレンスページですが、VBScriptでもほぼ同じ様に流用することが可能であり、FileSystemObjectの各メソッドなどの使い方や仕様はすべてこのリファレンスページで確認できます。
ただ、例のごとくMicrosoftのリファレンス系ページは翻訳が自動翻訳で日本語が怪しかったり、元々の記述が不親切で分りづらく、お世辞にも初心者向けとは言えません。
その為、VBScriptの初心者の人や、あの処理どう書くんだっけ?といちいち調べるのが面倒な人向けに、フォルダ操作、ファイル操作の主要な処理のサンプルプログラムをまとめて紹介していきます。
ファイル・フォルダ存在チェック
指定したファイルやフォルダが存在するかどうかをチェックします。
例えば、CSVデータを取り込む処理を実行する前に、取り込み対象のCSVファイルが想定しているフォルダに存在しているかを処理前にチェックしたり、逆にCSVファイルを出力する際に、出力先に指定したフォルダが存在しているかをチェックするといった処理で活用できます。
ファイル存在チェック
指定したフルパスに対象のファイルが存在するかをチェックします。
FileSystemObjectの「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」メソッドを使用します。
構文: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オブジェクト」を返します。
「Folderオブジェクト」は「Filesコレクション」と「Foldersコレクション」を持ち、そのコレクションに対して「For Each…Next」ステートメントを使用して、ファイル又はサブフォルダーの一覧を取得することができます。
下記のサンプルコードではサブフォルダ名やファイル名を取得していますが、16行目の objFile.Name や objSubFolder.Name のNameプロパティを変更することで、名前だけではなく、更新日時やファイルサイズなどの様々な情報を取得できます。
詳しくは以下のリンクからMicrosoftのレファレンスを参照してください。
特定のフォルダのファイル名を一覧で取得
指定した特定のフォルダ内のファイルの個数分ループしてファイル名の一覧を取得します。
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」メソッドを使用します。
構文: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」メソッドを使用します。
構文: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」メソッドを使用します。
構文: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」メソッドを使用します。
構文: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」メソッドを使用します。
構文: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」メソッドを使用します。
構文: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」メソッドを使用します。
構文: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」メソッドを使用します。
構文: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」メソッドを使用します。
構文: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」メソッドを使用します。
構文: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」メソッドなどを使用します。
構文: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」メソッドなどを使用して文字列を書き込みます。
構文: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
MicrosoftのVBAのリファレンスページの「OpenTextFileメソッド」のページでは、引数で「定数」を記載しています。
objFS.OpenTextFile("C:\test.txt" , ForWriting , true, TristateFalse )
ただ、VBScriptはこの定数は使用できないため、必ず「値」を引数に使用してください。
最後に
今回はVBScriptで「FileSystemObject」を使用した様々なファイル操作、フォルダ操作系のサンプルプログラムを紹介しました。
ウェブサイトの管理的には一つのサンプルプログラムごとに一つのページで作成した方が、サイト内のページが増えてPVの増加が見込めて良いのですが、個人的な思いとしては、当記事をブックマークに登録して、何度も見てもらいたいと思って一つのページにまとめています。
よって、そのような活用をしていただけますと嬉しいです。
それでは今回も読んでいただきましてありがとうございました。