連載
» 2005年10月13日 00時00分 公開

Windows管理者のためのWindows Script Host入門:第10回 WSHスクリプトからのファイル操作(1) (1/3)

WSHには、標準ではファイル操作用のオブジェクトはない。しかし汎用のFSOオブジェクトを利用すれば、これが可能になる。

[海津 智宏,著]
運用 Windows管理者のためのWindows Script Host入門
Windows Server Insider

 

「運用 Windows管理者のためのWindows Script Host入門」のインデックス

連載目次


 これまではWindows Script Host(WSH)の各標準オブジェクトの紹介と、その基本的な使い方を解説してきた。今回と次回は、WSH標準オブジェクトではなく、汎用のCOMオブジェクトであるFileSystemObject(FSO)を取り上げる。FSOを利用すれば、WSHの標準オブジェクトだけでは不可能な、ファイルの取り扱いが可能になる。

FileSystemObjectオブジェクト

 いままで述べたとおり、FSOは、WSHの標準オブジェクトではなく、Active Server Pagesなど、WSH以外のスクリプティング環境からも利用できる汎用のCOMオブジェクトである。Webページ用のスクリプト言語として開発されたVBScriptやJScriptの言語仕様や、WSHの標準オブジェクトだけではファイルを扱うことはできない。しかしFSOを利用すれば、WSHスクリプトからのファイルの読み書きなどが可能になる。

FileSystemObject
FSOはWSH以外のスクリプティング環境からも利用できる汎用のCOMオブジェクトで、各種のファイル操作ができる。

 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が利用できる。これらの値は順にASCIIUnicode、システム・デフォルトに対応する。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


       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。