第10回 WSHスクリプトからのファイル操作(1):Windows管理者のためのWindows Script Host入門(1/3 ページ)
WSHには、標準ではファイル操作用のオブジェクトはない。しかし汎用のFSOオブジェクトを利用すれば、これが可能になる。
これまではWindows Script Host(WSH)の各標準オブジェクトの紹介と、その基本的な使い方を解説してきた。今回と次回は、WSH標準オブジェクトではなく、汎用のCOMオブジェクトであるFileSystemObject(FSO)を取り上げる。FSOを利用すれば、WSHの標準オブジェクトだけでは不可能な、ファイルの取り扱いが可能になる。
FileSystemObjectオブジェクト
いままで述べたとおり、FSOは、WSHの標準オブジェクトではなく、Active Server Pagesなど、WSH以外のスクリプティング環境からも利用できる汎用のCOMオブジェクトである。Webページ用のスクリプト言語として開発されたVBScriptやJScriptの言語仕様や、WSHの標準オブジェクトだけではファイルを扱うことはできない。しかしFSOを利用すれば、WSHスクリプトからのファイルの読み書きなどが可能になる。
WSHの標準オブジェクトでないとはいえ、CreateObjectメソッドでインスタンスを作成し、必要なメソッドを呼び出すという流れは、これまで紹介してきたWshShellオブジェクトやWshNetworkオブジェクトなどと同様である。FSOオブジェクトのプログラムIDは“Scripting.FileSystemObject”である。インスタンス作成のコードは次のようにする。
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
テキスト・ファイルの読み書き
FSOオブジェクトのOpenTextFileメソッドを使ってファイルを開くことで、テキスト・ファイルを読み書きすることができる。
Set objStream = objFSO.OpenTextFile(filename [, iomode] [, create] [, format])
パラメータの意味は以下のとおりである。
パラメータ | 型 | デフォルト | 意味 |
---|---|---|---|
第1パラメータ(filename) | 文字列 | − | 開くファイルの名前。省略不可 |
第2パラメータ(iomode) | 整数 | 1 | ファイル・オープン・モードを以下の数値のいずれかから指定する1=読み取りモード2=書き込みモード8=追加書き込みモード |
第3パラメータ(create) | Boolean | False | ファイルが存在しない場合、Trueならば新しいファイルを作成する。Falseならばエラーが発生する |
第4パラメータ(format) | 整数 | 0 | ファイルの文字コードがASCIIならば0、Unicode(UTF-16)ならば−1、システムのデフォルト・エンコードを使うならば−2を指定する |
第1パラメータでは、開くファイルの名前を指定する。ファイルのパスは絶対パス/相対パスいずれを使用してもよい。
第2パラメータは読み取りモードか書き込みモードかを指定する。この際、書き込みモード(2)を指定すると、既存のファイルを上書きする。これに対し既存ファイルの末尾に追記したければ、追加書き込みモード(8)を指定する。あらかじめ次のように定数を定義しておくと、コードが分かりやすくなる。
Const ForReading = 1, ForWriting = 2, ForAppending = 8
第3パラメータでは、ファイルが存在しなかった場合に、新しいファイルを作成するかどうかを指定する。パラメータを指定しなかった場合はFalseとなり、ファイルが存在しなければエラーとなる。書き込みモードの場合にも、新しいファイルを作成してデータを書き込む場合にはTrueを指定する必要がある(Falseの場合、存在しないファイルに書き込もうとするとエラーになる)。読み取りモードでTrueを指定した場合、ファイルが存在しなければ、サイズ0のファイルが作成されて開かれる。
第4パラメータでは文字コードを指定する。第2パラメータ同様整数値での指定だが、VBScriptの組み込み定数であるvbFalse、vbTrue、vbUseDefaultが利用できる。これらの値は順にASCII、Unicode、システム・デフォルトに対応する。FSOが対応している文字コードはASCIIとUnicodeのみだが、Shift_JISコードのファイルもASCIIとして処理してしまうことは可能である。また、手元の日本語版Windows XP環境で試したところ、システム・デフォルトを指定した場合は、ASCIIコードを指定した場合と同じ挙動となった。
OpenTextFileの戻り値はTextStreamオブジェクトであり、WScriptオブジェクトやWshScriptExecオブジェクトのStdIn、StdOut、StdErrプロパティと同じように、Read、ReadAll、ReadLine、Write、WriteLineなどのメソッドが利用できる(WScriptオブジェクトの標準入出力操作メソッドについては連載第3回を参照)。もちろん、読み取りモードで開いた場合には出力用のメソッドは使えないし、書き込みモードで開いた場合には入力用のメソッドは使えない。
開いたファイルはスクリプトの終了時に自動的に閉じられる(クローズされる)ので、通常はスクリプトで明示的にファイルを閉じる必要はない。ファイルを再読み込みしたり、削除したりする必要がある場合には、TextStreamオブジェクトのCloseメソッドを呼び出すことで、明示的にファイルを閉じることができる。
次の例は、text1.txtを読み込み、アルファベットをすべて大文字に変換してtext2.txtに出力するスクリプトである。
1: Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
2: Const ForReading = 1, ForWriting = 2, ForAppending = 8
3: Set objInput = objFSO.OpenTextFile("test1.txt", ForReading) ' text1.txtを読み取りモードで開く
4: Set objOutput = objFSO.OpenTextFile("test2.txt", ForWriting, True) ' text2.txtを書き込みモードで開く
5: Do Until objInput.AtEndOfStream ' 入力ファイルの終端まで繰り返し
6: strLine = objInput.ReadLine ' 入力ファイルを1行読み込む
7: objOutput.WriteLine UCase(strLine) ' UCase関数で大文字に変換し、出力ファイルに書き出す
8: Loop
9: objInput.Close
10: objOutput.Close
Copyright© Digital Advantage Corp. All Rights Reserved.