標準機能で簡易ツールを作ろう


OS の標準機能だけで作る、簡易ツールの説明です。

簡易ツール / 開発言語 / バッチファイル / WSH / HTML Application / 戻る / トップページ


簡易ツール

ゲーム開発では、その内容の特異性からツールを用意することが良くあります。 優秀なミドルウェアやエンジンに付属のツールや、汎用のソフトウェアで 事足りることも増えては来ましたが、価格や使用している環境や 作り方にあわないために、内製ツールを作ることも少なくありません。
 
そのようなツールで、 複数のプロジェクトで少しずつバージョンアップを繰り返して 使われていく C 言語などで作った本格的なツールもありますが、 特定のプロジェクトだけで急に必要に迫られて作ることになり、 専任の担当者も割り当てられないためにプログラマやプランナーが 片手間で作るバッチレベルのツールというのもどうしてもあります。
 
ここではその後者のような、簡易ツール作成のノウハウについて まとめます (なお、Windows 環境を想定)。 別にゲーム用ツールに限った話でもないため、 役に立つことはある情報だと思います。

開発言語

ツールは作った本人だけでなく、他の人にも使って貰います。 この時、本格的なツールなら、事前にランタイムのインストール等を してもらうこともしょうがないですが、簡易なツールのためだけに 使用者に特定のパスにファイルを置いて貰ったり、 何かを別途インストールしてもらうのは得策ではありません。
 
利用者がパソコンの環境に詳しいとも限らず、 使うための下準備で躓いて、そのサポートに手間がかかってしまったり、 作成者と利用者のランタイムのバージョンが微妙に違っていて、 自分のところでは動くのに渡したら動かない、といった自体も 起こりうるためです。
 
そこで、ここでは OS さえインストールされていれば、 どのパスにツールを置こうとも、ショートカットを勝手に作られようとも 動作するツールを作ることを目指します。 また、作成環境も他の人でも触りやすいように、 コンパイル不要のものを取り上げます (もちろん C 言語等でちゃんとした ツールを作って責任を持って最後までサポートし続けられるなら、 このような手段を取る必要はないです)。
 
Windows インストール時点で、このような条件にあてはまる言語 (?) は、 バッチファイル、WSH (Windows Script Host)、Windows PowerShell が ありますが、まだ多く使われている Windows XP では PowerShell は標準では 入っていないため、ここでは除外します。

バッチファイル

バッチファイルは MS-DOS 時代に触っていて、 最近は触っていないようでしたら、印象が違うと思います。 最近のバッチファイルはそれなりに機能拡張されてます。
 
環境ごとに違う情報として、ドライブレター、パスに空白が含まれている可能性、 パスに日本語が含まれている可能性、に注意しましょう。 プログラムに慣れている人は空白パスや日本語パスを避ける人が多いですが、 デザイナーさんなど気にせずに使う人もいるため、 対応出来るようにしておくと親切です。
 
カレントパス
 
カレントパスの扱いは注意しましょう。 そのバッチファイルのパスがカレントであることを前提に作ると、 意外なところで躓きます。 Windows の仕様として、ドラッグ&ドロップで別ファイルを引き渡して プログラム (バッチファイルやショートカットを含む) を実行すると、 カレントパスは、ユーザーのホームフォルダ (環境変数 USERPROFILE が指す場所) になるためです。 バッチファイルの頭に、そのバッチファイルのあるフォルダを カレントにするコードを書いておくと良いです。
	@echo off
	cd /d "%~dp0"
バッチファイルがホームフォルダと違うドライブにある時に ドラッグ&ドロップすると、別ドライブで実行されるため、 cd コマンドに /d オプションが必要です。 またバッチファイルの置かれたフォルダに空白パスが含まれている可能性が ありうるので、%~dp0 はダブルクォーテーションでくくります。
 
環境変数
 
環境変数も OS によってはサポートされていないものもあるので、 注意しましょう。利用者が 2000 以降であれば、主要なものは問題なく使えます。 また、Windows 2000/XP 以降は、環境変数にシステム環境変数 (全員に共通の設定) とユーザー環境変数 (ユーザーごとの設定で、同名の設定があればシステム環境変数よりも優先される) に分かれている点に注意しましょう。
 
OS ごとの、環境変数
環境変数名 概要 98 SE 2000 XP 7
OS OSの種類 (サポートされている場合、Windows_NT となり、Windows7 などではないので注意) Windows_NT ×
TEMP 一時ファイルを置くフォルダ C:\DOCUME~1\Name\LOCALS~1\Temp / C:\WINDOWS\TEMP / C:\Users\Name\AppData\Local\Temp
COMPUTERNAME コンピューター名 MyComputer ×
HOMEDRIVE ホームフォルダのドライブ名 C: ×
HOMEPATH ホームフォルダのパス名 \ / \Documents and Settings\Name / \Users\Name ×
USERNAME 現在のユーザ名 Name ×
USERPROFILE 現在のユーザのユーザプロファイルフォルダ名 C:\Documents and Settings\Name / C:\WINNT\Profiles\Name / C:\Users\Name ×
APPDATA アプリケーションのデータフォルダ名 C:\Documents and Settings\Name\Application Data / C:\Users\Name\AppData\Roaming ×
ALLUSERSPROFILE 全ユーザ共有のユーザプロファイルフォルダ名 C:\Documents and Settings\All Users / C:\ProgramData ×
ProgramFiles Program Filesフォルダのパス名 C:\Program Files ×
COMSPEC シェルのパス名 C:\WINDOWS\COMMAND.COM / C:\WINNT\system32\cmd.exe / C:\WINDOWS\system32\cmd.exe / C:\Windows\system32\cmd.exe
NUMBER_OF_PROCESSORS プロセッサ数 1 / 8 ×
SystemDrive システムドライブ名 C: ×
SystemRoot Windowsフォルダのパス名 C:\WINDOWS / C:\WINNT / C:\Windows ×
WINDIR Windowsフォルダのパス名 C:\WINDOWS / C:\WINNT / C:\Windows
 
バッチファイル内で一時的な情報保持のために環境変数を使うと、 環境変数を汚してしまい、利用者の環境にしかない他のツールに 悪影響を与える可能性があります。 setlocal 命令をバッチファイルの頭で呼んでおくことで、 環境変数のローカルスコープ化をしておくと安全です。
	@echo off
	cd /d "%~dp0"
	setlocal

WSH

WSH は、すでに PowerShell によってその役目が取って代わられることが 決まっていますが、どの環境でも動くことを実現するためにあえて その枯れた技術を使います。
 
WSH は VBScript, JScript (≒ JavaScript) で書いたスクリプトを実行できます。 VBScript なら拡張子を .vbs に、JScript なら拡張子を .js にするだけです。 一般的には VBScript が使われているものが多いようですが、 Web 技術の発展で JavaScript を習得している人も増えてますし、 違うサンプルがあった方が良いと思うので、 ここでは JScript でサンプルを書きます。
 
デフォルトバージョン
 
OS ごとにデフォルトでインストールされているバージョンが違うので 注意して下さい。
 
OS ごとの、デフォルトでインストールされている WSH バージョン
OS WSH バージョン
Windows 98 WSH 1.0
Windows 98 SecondEdition WSH 5.1
Windows 2000 WSH 2.0
Windows 2000 SP3 WSH 5.1
Windows ME WSH 5.5
Windows XP WSH 5.6
Windows XP SP3 WSH 5.7
Windows Vista WSH 5.7
Windows 7 WSH 5.8
 
プログラム実行
 
プログラムを呼び出すには、WScript.Shell オブジェクトの Exec 関数を使います。
 
似た機能に Run 関数がありますが、 Run 関数は別プロセスの起動で他のプログラムを起動させるだけ、 Exec 関数は子プロセスの起動で他のプログラムの入出力を制御可能との 違いがあります。 Exec 関数は WSH 5.6 以降でサポートされているので、 Windows 2000 を除いて Windows XP 以降の環境のみ対応すれば良い場合に 限れるのであれば、使って問題ありません。
	function exec(command)
	{
		var shell=WScript.CreateObject("WScript.Shell");
		
		var exec=shell.Exec(command);
		while (exec.Status==0)
		{
			WScript.Sleep(100);
		}
		
		var out="";
		while (!exec.StdOut.AtEndOfStream)
		{
			out=out+exec.StdOut.ReadLine()+"\n";
		}
		var err="";
		while (!exec.StdErr.AtEndOfStream)
		{
			err=err+exec.StdErr.ReadLine()+"\n";
		}
		
		return out;
	}
 
テキストファイルの読み書き
 
テキストファイルの読み書きには、文字コード、改行コードの指定ができる ADODB.Stream オブジェクトを使うのがベターです。
	function loadSource(path)
	{
		var stream=WScript.CreateObject("ADODB.Stream");
		
		stream.Open();
		stream.Type=2;
		stream.Charset="utf-8";					// UTF-8 の文字コードのファイルを読み込む
		stream.LoadFromFile(path);
		stream.LineSeparator=10;				// 改行コードをLFに指定 (13:CR, -1:CR+LF)
		stream.Position=0;
		
		var source=stream.ReadText(-1);
		
		return source;
	}
	
	function saveDestination(path,result)
	{
		var stream=WScript.CreateObject("ADODB.Stream");
		
		stream.Open();
		stream.Type=2;
		stream.Charset="utf-8";					// UTF-8 の文字コードでファイルに書き込む
		stream.LineSeparator=10;				// 改行コードをLFに指定 (13:CR, -1:CR+LF)
		stream.Position=0;
		
		stream.WriteText(result);
		stream.SaveToFile(path,2);
		stream.Close();
	}

HTML Application

HTML Application は、HTML を使って Windows アプリケーションを作る仕組みで、 HTML ファイルの拡張子を .hta にするだけで使えます。 また、一部独自拡張もありますが、WSH と同様に WScript オブジェクト等を 介して各種機能が使え、環境に依存しない簡易的に GUI が作れます。
 
Internet Explorer 5 からの対応機能であるため、 Windows 98 SecondEdition, Windows 2000 以降であれば、 OS 標準で使える機能となります。

戻る