このページでは、WSHでのファイル操作について実践的なTipsを紹介しています。 各命令の詳細などについてはここでは触れませんので、 各命令の構文などの仕様については、Microsoft社提供の JScriptリファレンスや、 WSHリファレンスを参照してください。
HTAにおけるファイル操作も基本は一緒ですので、このページも参考になると思います。
なおこのページでは、ActiveXオブジェクトの作成方法に
ActiveXObjectオブジェクトを使って説明しています。これはHTAでも利用可能な為です。
(例) var fs = new ActiveXObject("Scripting.FileSystemObject");
WSHでは、CreateObject メソッドも使用する事が出来ます。
(例) var fs = WScript.CreateObject("Scripting.FileSystemObject");
WSHではどちらの方法でも変わりはありません。
ファイルの移動は、 FileSystemObjectの MoveFile を使って行います。
例えば、"C:\test.txt"というファイルを、"C:\My Documents\"の下に移動したいとします。
その場合、
var fs = new ActiveXObject("Scripting.FileSystemObject");
var file = "C:\\test.txt";
fs.MoveFile(file, "C:\\My Documents\\");
とコードを書けばファイルを移動する事が出来ます。 C:\がC:\\となっているのは、\という文字がJavaScriptではエスケープ文字となっている為 そのままでは使用出来ないためです。 コードの流れとしては、変数fsにFileSystemObjectをロードして、 変数fileに、移動したいファイルのパスを、そして続いてFileSystemObjectのMoveFileを使い、 ファイルを移動する...という流れになっています。
さて、ここで問題になってくるのは、C:\My Documents というフォルダ名は Windowsのインストールの仕方によって変わってくるので、 全てのユーザーのマシンに C:\My Documents フォルダがあるとは限りません。 そこで、WScriptのWshShellオブジェクトを利用して ユーザーのマシンのMy Documentsフォルダに相当する部分を調べるとします。
var fs = new ActiveXObject("Scripting.FileSystemObject");
var WshShell = new ActiveXObject("WScript.Shell");
var file = "C:\\test.txt";
var mydoc = WshShell.SpecialFolders("MyDocuments");
fs.MoveFile(file, mydoc + "\\");
WshShellオブジェクトのSpecialFoldersは、 任意のWindowsにとって特別なシェルフォルダを返します。 ここでは "MyDocuments" を引数として、My Documentsフォルダ相当のフォルダを取得しています。
ファイルの削除は、 FileSystemObjectの DeleteFile を使って行います。
例えば、"C:\test.txt"というファイルを削除したいとします。その場合、
var fs = new ActiveXObject("Scripting.FileSystemObject");
var file = "C:\\test.txt";
fs.DeleteFile(file);
とコードを書けばファイルを削除する事が出来ます。 コードの流れとしては、変数fsにFileSystemObjectをロードして、 変数fileに、削除したいファイルのパスを、そして続いてFileSystemObjectのDeleteFileを使い、 ファイルを削除する...という流れになっています。
とこれだけだと短いので、せっかくですから、 ファイルの存在を確認して、ファイルが存在する場合のみ削除命令を行う様にします。 存在を確認する理由は、存在しないファイルを消そうとするとエラーが発生するためです。
var fs = new ActiveXObject("Scripting.FileSystemObject");
var file = "C:\\test.txt";
if(fs.FileExists(file)) {
fs.DeleteFile(file);
}
FileExists は、FileSystemObjectの命令の一つで引数で渡されたファイルが 存在するかどうか確認し、存在する場合は true 、しない場合は false を返します。 この様なファイルの確認、又はフォルダの確認などは、 ファイル操作を行う場合必ず行う様にした方がよいでしょう。
ファイルの移動(1)では、指定の一つのファイルを、 指定のフォルダの下に移動する方法の紹介でしたが、 ここでは、ワイルドカードによる複数のファイルを、 指定のフォルダの下に更に一つフォルダを掘って移動するプログラムを紹介します。
var fs = new ActiveXObject("Scripting.FileSystemObject");
var WshShell = new ActiveXObject("WScript.Shell");
var file = "C:\\test*.txt"; //ワイルドカードで指定
var mydoc = WshShell.SpecialFolders("MyDocuments");
var newfl = mydoc + "\\test\\"; //新しいフォルダ
if(!fs.FolderExists(newfl)) { //フォルダが存在していないか確認
fs.CreateFolder(newfl); //フォルダ生成
}
fs.MoveFile(file, newfl);
ほとんどファイルの移動(1)のプログラムと変化がありませんが、 ファイルの指定がワイルドカードになっているのと、 FileSystemObjectの CreateFolder を使用し、新しいフォルダを生成しています。 このプログラムを実行すると、test*.txtで指定されたファイル(test1.txt,test2.txt etc..) が My Documents フォルダの下に test フォルダを作成し、そこに移動します。
さてこのプログラムですが、MoveFileの行でエラーが発生する可能性があります。 これは、移動するファイル("C:\test.txt")が存在しなかった場合や、 移動先のフォルダ("C:\My Documents\test\")が存在しなかった場合などに エラーが発生してしまいます。 if文とFileExists/FolderExistsで一つずつチェックしていってもいいのですが、 これだと多少手間がかかります。 そこでJScript5.0から利用可能な try...catch文 を使えばエラー処理が楽に済むので紹介したいと思います。
var fs = new ActiveXObject("Scripting.FileSystemObject");
var WshShell = new ActiveXObject("WScript.Shell");
var file = "C:\\test*.txt"; //ワイルドカードで指定
var mydoc = WshShell.SpecialFolders("MyDocuments");
var newfl = mydoc + "\\test\\"; //新しいフォルダ
if(!fs.FolderExists(newfl)) { //フォルダが存在していないか確認
fs.CreateFolder(newfl);
}
try {
fs.MoveFile(file, newfl);
}
catch(e) {
WScript.Echo("ファイルの移動に失敗しました。\n原因:" +e.description); //エラー処理
}
MoveFile実行中に、エラーが発生するとcatchステートメントへと移ります。 そこでエラー処理として、移動失敗のメッセージを表示しています。
try...catch文はJavaやC++などの他の言語の知識がある方には周知だと思いますが、 try { ... }で囲まれたステートメント中にエラーが発生した場合、 例外を発生させて、その例外を catchステートメントで受け取る事が出来ます。 この様な場合このステートメントを利用するとエラー処理が楽になります。