2008年9月19日金曜日

文房具としてのWSH(追補)

きのうの WSH についてのエントリーですが、会社からの帰りがてらにw-zero3のメーラで書いていたこともあって、実際どんなふうに書いたのかをぜんぜん示すことができませんでした。

あとでコメントで補足しますなんて断りを入れましたが、コメントじゃちょっと書ききれないので、エントリーとしてアップします。

なんでこんなことしてるのかという経緯についてはきのうのエントリーを見てください。

さて、いろんな書き方があるんですが、ぼくは XML 形式で書きました。

<?XML version="1.0" standalone="yes" encoding="shift-jis"?>
<package>
<job>
<script language="JScript">//<![CDATA[

// ここに書く

//]]></script>
</job>
</package>

この方法で書くと、いろいろいいことがあるみたいですよ。今回はちっとも関係ないんですけどね。このあたりについては、下記を参照してください。

Windows スクリプト ファイル (.wsf) を使用する / msdn

これにファイル操作をやるためのコードを書いて、*.wsf として保存します。クリックすると実行されます。

ファイル操作を行うためには、まず、Scripting.FileSystemObject のインタンスをつくり、カレントフォルダを参照するオブジェクトを取得します。こうです。

var fso    = new ActiveXObject( "Scripting.FileSystemObject" );
var folder = fso.getFolder( "." );

このあと、folder.files ってやると、カレントフォルダにある複数ファイルのコレクションにアクセスできます。しかし、このコレクションっていうのが、たんなる配列じゃなくて、folder.files[0] なんてしてもファイルにアクセスできない。

そこで、Enumerator というイテレータオブジェクト経由で扱います。

var i = new Enumerator( folder.files );

こうすると、

for ( ; !i.atEnd(); i.moveNext() ) {

WScript.Echo( "ファイル名は" + i.item().name + "です。" );
WScript.Echo( "フルパスは" + i.item().path + "です。" );

}

なんてかんじでファイルの属性や内容にアクセスできるようになります。

ただですね、読み込みたいファイルの文字コードが utf-8 の場合は、さらにADODB.Stream っていうのを使わなくちゃいけないんですね。

var input     = new ActiveXObject('ADODB.Stream');
input.type = 2; // ascii モード
input.charset = 'utf-8'; // 文字コード指定
input.open();
input.loadFromFile( filepath ); // ファイルの内容を読み込んで ...
var alllines = inputs.readText( -1 ); // 取り出します。
// 引数に -1 を渡すと、
// 全行を一括して取り出せます。
inputs.close();

という具合。これで alllines に、ファイルの内容がごっそり入りました。

実は、Scripting.FileSystemObject にも OpenTextFile というメソッドがあって、流れからいっても、そっちを使ってファイルの内容を読み込むのが素直ってもんなんですが、これだと、sjis と utf-16 しか扱えないらしいんですね。ADODB.Stream を使えば、いろいろな文字コードを指定することができます。

さて、読み込んだ内容を処理しやすいように一行ごとに分割して配列に入れます。

var lines = alllines.split("\n");

そして、各行に for ループで 1 行ずつあたって、必要なテキスト操作を行います。

var newlines = "";
for ( var i = 0; i < lines.length; i++ ) {

lines[j] = lines[j].replace(/foo/,"bar");
newlines = newlines + lines[j] + "\n";

}

なんてかんじですね。

終わったら、出力します。出力も utf-8 にしたいので、ADODB.Stream を使います。

var output       = new ActiveXObject('ADODB.Stream');
output.type = 2;
output.charset = 'utf-8';
output.open();
output.writeText( newlines ); // テキスト操作後のデータを書き込んで ...
outputs.saveToFile( outfilepath, 2 ); // 出力ファイルに保存します。
outputs.close();

以上です。

ね、やりたいことにくらべてなんて大げさなってかんじではないですか。

それで、きのうの話になるわけです。失礼しました。


0 件のコメント: