第26話:WSHを利用したローカルアプリケーション
目次
マンガ







マンガ台詞
説明
この章では、『WSHを利用したローカルアプリケーション』について学びます。
Windowsパソコンには、JavaScriptを使ってローカルアプリケーションを作成する仕組みが用意されています。それが『WSH』です。この『WSH』を利用したアプリケーションの作成には、これまで学んだJavaScriptの知識を利用することができます。
Windows専用のものなので、作成するプログラムの文字コードはShift_JISになります。
それでは以下、『WSH』を利用したアプリケーションの作成方法を紹介していきます。
『WSH』とは?
『WSH』(Windows Script Host)は、テキストファイルに書いたプログラムを実行する、Windows上の環境です。
『WSH』では、『VBScript』と『JavaScript』(正確にはJScript)が標準で利用できます。
本講座では、JavaScriptでプログラムを行っていきます。
『WSF』とは?
Windowsでは、拡張子『.js』のファイルをダブルクリックすることで、JavaScriptで書かれた『WSH』のプログラムを実行できます。
しかし、この拡張子『.js』のファイルは、正しく実行できないことがあります。これは、インストールしているソフトによって、関連付けが変更されているのが原因です。
関連付けというのは、どの拡張子のファイルを、どのソフトで開くかという設定です。Windowsでは、拡張子とソフトを対応させています。そして、ファイルをダブルクリックすると、特定のソフトで開くようにしています。
そのため、関連付けが変更されると、ファイルを実行しても、意図した動作にならないことがあります。拡張子『.js』のファイルは、Webサイト構築ソフトなどによって、関連付けが変更されていることがよくあります。
本講座では、この拡張子『.js』のファイルではなく、XML形式(HTMLのようにタグが付いたテキストファイル)でスクリプトを記述する『WSF』(Windows Script File)を利用します。
『WSF』では、ファイルの拡張子を『.wsf』とします。このファイルをダブルクリックしたり、このファイルに他のファイルをドロップすることで、『WSH』のプログラムを実行できます。
『WSF』の書き方
『WSF』のファイルは、『
<job id="main"> <script language="JavaScript"> // プログラム </script> </job>
また、文字化けなどで正しく動作しない場合は、文字コードを明示的に指定することもできます。
<?xml version="1.0" encoding="shift-jis" ?>
<job id="main">
<script language="JavaScript">
// プログラム
</script>
</job>
『WSH』のテンプレート
マンガで出てきた『WSH』のテンプレートについて解説を行います。以下、『sample.wsf』のソースコードです。
<job id="main"> <script language="JavaScript" src="cmnFunc.js"></script> <script language="JavaScript"> // グローバル変数 var args; // 引数 var dropFilePath = ""; // ドロップ ファイルのパス var dropFileStr = ""; // ドロップ ファイルの中身の文字列 // メイン ルーチン init(); // 初期化処理 main(); // メイン処理 // 初期化処理 function init() { args = WScript.Arguments; // 引数のオブジェクト if (args.length >= 1) { dropFilePath = args(0); dropFileStr = cmnFunc.readFile(dropFilePath); } } // メイン処理 function main() { if (dropFilePath == "") { WScript.Echo("ドロップ ファイルなし"); } else { WScript.Echo(dropFilePath + "\n" + dropFileStr); } } </script> </job>
先ほど説明したとおり、全体を『<job id="main">~</job>』と囲い、その中に『<script>』タグを使ってプログラムを書いています。
『src="cmnFunc.js"』として読み込んでいる『cmnFunc.js』は、本講座用に用意した共通関数を収録した、外部JavaScriptファイルです。このファイルには、ファイルの入出力を行うための関数を収録しています。
それでは以下、起動してから行われる処理を順番に見て行きます。
ダブルクリック、もしくはファイルのドロップで起動した『sample.wsf』は、『メイン ルーチン』の2つの関数を実行します。まずは『init』という初期化処理を行う関数を実行します。そして次に、『main』というメイン処理を行う関数を実行します。
初期化処理
『init』内で行う初期化処理では、『WScript.Arguments』という、引数を表すオブジェクトを、変数『arg』に入れています。
これまで出てきた『関数の引数』は、関数のあとの括弧内に書かれる変数でした。『ファイル実行時の引数』は、実行ファイルにドロップした『ファイルのパス』になります。『sample.wsf』に『紹介.txt』というファイルをドロップした場合は、『紹介.txt』のフルパス(完全なパス)が、引数になります。
この引数の数が1以上の場合は、『ファイル実行時の引数』が存在します。そこで、『if (args.length >= 1)』と引数の数を確認して、『1』以上ならば『dropFilePath = args(0)』として、引数を取り出しています。そして、このファイルのパスを元にして、『cmnFunc.readFile』メソッドを利用して、ファイルの中身を変数『dropFileStr』に読み込んでいます。
メイン処理
メイン処理では、ドロップファイルのパスがあるかどうかで、処理を分岐させています。
ドロップファイルのパスが空の場合は、ダイアログを開いて、『ドロップ ファイルなし』と表示させています。また、ドロップファイルのパスが存在する場合は、ダイアログを開いて、ドロップファイルのパスと、その中身の文字列を表示させています。
ここで注意するのは『WScript.Echo』メソッドです。『WSH』のプログラムでは、Webページのプログラムと違って『window』オブジェクトが存在しません。そのために『window.alert』メソッドもありません。また、『window.document』といったオブジェクトも利用できません。
『WSH』のプログラムでは、『window』オブジェクトの代わりに『WScript』オブジェクトを利用します。このオブジェクトには『Echo』という、『alert』のようにダイアログを表示するメソッドが用意されています。そこでこの『Echo』メソッドを利用して、ダイアログを表示します。
『cmnFunc.js』
『cmnFunc.js』についても、ソースを示します。こちらは少し高度ですので、理解できない場合は読み飛ばしても構いません。この『cmnFunc.js』のように、外部JavaScriptファイルとして利用するプログラムは、中身を理解していなくても利用できます。
var cmnFunc = new function() {
// オブジェクトの作成
this.createObject = function(name) {
return WScript.CreateObject(name);
};
// WScriptのシェル
// ファイル システム オブジェクト
// 実行ファイルのパス
// ルート ディレクトリ
this.wshell = this.createObject("WScript.Shell");
this.fs = this.createObject("Scripting.FileSystemObject");
this.rootPath = WScript.ScriptFullName;
this.rootDir = this.fs.GetFile(this.rootPath).ParentFolder;
// ファイルに文字列を書き込み
this.writeFile = function(path, data) {
var stream = this.fs.CreateTextFile(path, true);
stream.Write(data);
stream.Close();
};
// ファイルから文字列を読み込み
this.readFile = function(path) {
if (this.fs.FileExists(path) == 0) return "";
var stream = this.fs.OpenTextFile(path, 1);
var rdStr = "";
try {rdStr = stream.ReadAll();} catch(e){}
stream.Close();
return rdStr;
};
}
以下、プログラム自体の解説は高度になるので、使い方だけを示します。
『<script language="JavaScript" src="cmnFunc.js"></script>』としてファイルを読み込んだあと、以下のメソッドを利用することができます。
| 書き方 | 引数 | 戻り値 | 説明 |
|---|---|---|---|
| cmnFunc.readFile(path) | 『path』は、読み込むファイルのパス | 読み込んだ ファイルの文字列 |
ファイルを文字列 として読み込む |
| cmnFunc.writeFile(path, data) | 『path』は、書き込むファイルのパス 『data』は、書き込む内容 |
なし | ファイルに文字列を 上書きする |
また、『cmnFunc』では、以下のプロパティを利用できます。
| 書き方 | 説明 |
|---|---|
| cmnFunc.rootPath | 『cmnFunc.js』のフルパス |
| cmnFunc.rootDir | 『cmnFunc.js』の保存されているディレクトリ |
| cmnFunc.wshell | OSのシェルを操作するオブジェクト |
| cmnFunc.fs | ファイル システム オブジェクト |
『WScript』と『ActiveXObject』
『WSH』のプログラミングでは、OSの機能を利用したり、ファイルの入出力を行ったりできます。また、『ActiveX』と呼ばれる一連のオブジェクトを利用して、様々な処理を行えます。
『WSH』では、『WScript』が、Webページのプログラミングでの『window』のような、基本のオブジェクトになっています。
例えばダイアログ表示は、Webページでは『window.alert』でしたが、『WSH』では『WSH.Echo』になります。
// Webページ window.alert("message"); // 『WSH』 WSH.Echo("message");
『WScript』から呼び出せる様々なオブジェクト
こういった違いの他に、『WSH』のプログラミングでは、様々なオブジェクトを『WScript』から呼び出せます。
var wshell = WScript.CreateObject("WScript.Shell"); var fs = WScript.CreateObject("Scripting.FileSystemObject");
1行目のプログラムでは、『WScript』を利用して『WScript.Shell』という、シェル(OS)を操作するオブジェクトを呼び出しています。
2行目のプログラムでは、同様に『Scripting.FileSystemObject』という、ファイルを操作するオブジェクトを呼び出しています。
『ActiveX』オブジェクト
オブジェクトの呼び出しは、『WScript』以外から行われることもあります。『ActiveX』と呼ばれる一連のオブジェクトを利用する場合は『new ActiveXObject()』として呼び出します。
var ado = new ActiveXObject("ADODB.Stream");
『WSH』で利用できるオブジェクトは無数にあります。行いたい処理に合わせて、どんなオブジェクトを利用できるか、ネットや本で調べてください。
『WSH』を利用したアプリケーションの実例
以下、『WSH』を利用して、Yahoo!ニュースのRSSをダウンロードするプログラムの実例を示します。参考にして、各自便利なプログラムを作成してください。
以下、『sample2.wsf』のソースコードです。『sample2.wsf』をダブルクリックすれば、Yahoo!ニュースのRSS『https://dailynews.yahoo.co.jp/fc/rss.xml』を取得して、ローカルに保存します。また、保存したフォルダをExplorerで開きます。
少し高度になりますが、このプログラムの意味が全て分かれば、JavaScriptの腕前はかなりのレベルに到達していると言えるでしょう。
<job id="main">
<script language="JavaScript" src="cmnFunc.js"></script>
<script language="JavaScript" src="cmnFunc.exec.js"></script>
<script language="JavaScript" src="cmnFunc.download.js"></script>
<script language="JavaScript">
// メイン ルーチン
main(); // メイン処理
// メイン処理
function main() {
var resText = cmnFunc.download(
"https://news.yahoo.co.jp/pickup/rss.xml",
"dailynews_yahoo_rss.xml"
);
WScript.Echo("取得した文字列の長さ : " + resText.length);
cmnFunc.run("explorer.exe", cmnFunc.rootDir);
}
</script>
</job>
以下、『cmnFunc.js』です。
var cmnFunc = new function() {
// オブジェクトの作成
this.createObject = function(name) {
return WScript.CreateObject(name);
};
// WScriptのシェル
// ファイル システム オブジェクト
// 実行ファイルのパス
// ルート ディレクトリ
this.wshell = this.createObject("WScript.Shell");
this.fs = this.createObject("Scripting.FileSystemObject");
this.rootPath = WScript.ScriptFullName;
this.rootDir = this.fs.GetFile(this.rootPath).ParentFolder;
// ファイルに文字列を書き込み
this.writeFile = function(path, data) {
var stream = this.fs.CreateTextFile(path, true);
stream.Write(data);
stream.Close();
};
// ファイルから文字列を読み込み
this.readFile = function(path) {
if (this.fs.FileExists(path) == 0) return "";
var stream = this.fs.OpenTextFile(path, 1);
var rdStr = "";
try {rdStr = stream.ReadAll();} catch(e){}
stream.Close();
return rdStr;
};
}
以下、『cmnFunc.run.js』です。
// 先に『cmnFunc.js』を読み込んでおく
if (typeof(cmnFunc) != "undefined") {
// EXEを実行
// 引数1:『path』実行ファイルのパス。もしくは、開きたいファイル
// 引数2:『option』引数1で実行ファイルを指定した場合の起動オプション
// 引数3:『wait』0なら待機なし、1なら待機あり、デフォルト0
cmnFunc.run = function(path, option, wait) {
if (wait != 0 && wait != 1) wait = 0;
try {
var runPath = '"' + path + '"';
if (option != "") runPath += ' "' + option + '"';
this.wshell.Run(runPath, 10, wait);
} catch(e) {
var runPath = path;
if (option != "") runPath += ' ' + option;
this.wshell.Run(runPath, 10, wait);
}
}
}
以下、『cmnFunc.download.js』です。
// 先に『cmnFunc.js』を読み込んでおく
if (typeof(cmnFunc) != "undefined") {
// EXEを実行
// 引数1:『url』ダウンロードするファイルのURL
// 引数2:『path』保存ファイル名、もしくはパス、空時は保存なし
// 戻り値:テキストの場合は文字列、失敗時は『err』
cmnFunc.download = function(url, path) {
var progIDs = [
"Msxml2.ServerXMLHTTP.6.0",
"Msxml2.ServerXMLHTTP.5.0",
"Msxml2.ServerXMLHTTP.4.0",
"Msxml2.ServerXMLHTTP.3.0",
"Msxml2.ServerXMLHTTP",
"Microsoft.ServerXMLHTTP",
"Msxml2.XMLHTTP.6.0",
"Msxml2.XMLHTTP.5.0",
"Msxml2.XMLHTTP.4.0",
"Msxml2.XMLHTTP.3.0",
"Msxml2.XMLHTTP",
"Microsoft.XMLHTTP"
];
var xmlHttp;
var resText;
var resBody;
for (var i = 0; i < progIDs.length; i ++) {
try {
xmlHttp = new ActiveXObject(progIDs[i]);
if (typeof(xmlHttp) == "undefined") break;
} catch(e){}
}
if (typeof(xmlHttp) == "undefined") return "err";
try {
xmlHttp.open("GET", url, 0); // 0 : 同期処理
xmlHttp.send("");
resText = xmlHttp.responseText;
resBody = xmlHttp.responseBody;
} catch(e){}
xmlHttp = null;
if (path == "") return resText;
var ado;
try {
ado = new ActiveXObject("ADODB.Stream");
ado.Type = 1; // 1 : バイナリ
ado.open()
ado.write(resBody)
ado.saveToFile(path, 2); // 2 : 上書き保存
ado.close();
ado = null;
} catch(e){
if (ado != null) {
try {ado.close();} catch(e){}
ado = null;
}
return "err";
}
return resText;
}
}
サンプルの入手
以下は、今回出てきたサンプルです。
ZIPでまとめてダウンロード (右クリックから保存してください)
『sample.wsf』(テンプレート)(右クリックから保存してください)
『cmnFunc.js』(共通関数)(右クリックから保存してください)
『sample2.wsf』(ニュースのRSSをダウンロード)(右クリックから保存してください)
『cmnFunc.run.js』(ファイルを実行関数)(右クリックから保存してください)
『cmnFunc.download.js』(ダウンロード関数)(右クリックから保存してください)
プログラムの中身を見たい場合は、それぞれのHTMLファイルをブラウザで開いたあと、右クリックをして『ソースの表示』を選択してください。
メモ帳で、ファイルの中身を見ることができます。





