プログラミング工房 > HSP > サンプルアプリケーション > execscr > 

main.hsp

/***********************************************************

	"execscr.exe" main script

***********************************************************/

/* 実行ファイル作成オプション */
#packopt name	"execscr"
#packopt hide	1
#packopt runtime	"hsp3c.hrt"

/* ヘッダファイル、定数マクロなど */
#define	NAME_BAT		"execscr.bat"	// スクリプト実行用バッチファイル名
#define	OPTION_PAUSE	"p"		// オプション:スクリプト実行後コンソールウィンドウを閉じない
#define	OPTION_MINIMIZE	"m"		// オプション:コンソールウィンドウを最小化状態で開く

/* 汎用モジュール */
#include "gm_rmquote.hsp"			// 文字列両端の引用符を削除
#include "gm_jconv_dll.hsp"			// 文字コード変換DLL

/* アプリケーション部品モジュール */
#include "m_cmdline_parser.hsp"		// コマンドライン文字列処理


	/**************/
	/* メイン処理 */
	/**************/

	/* コマンドライン引数を取得 */
	repeat
		arg = getarg(cnt)
		if arg="" {
			break
		}
		_args(cnt) = arg
	loop
	prm_mark	= _args(0)		// 引数指定マーク
	scr_path	= _args(length(_args)-1)	// 実行するスクリプトのパス
	rmquote	prm_mark, TYPE_DQUOTE@	// ""を除去
	rmquote	scr_path, TYPE_DQUOTE@


	/* スクリプト存在チェック */
	exist	scr_path
	if strsize=-1 {
		dialog "指定されたスクリプトが見つかりません。execscr.exeを終了します。", 1, "エラー"
		end
	}
	scr_dir	= getpath(scr_path, 32)	// ついでにスクリプトがあるフォルダのパスを取得しておく

	/* 指定されたスクリプトに埋め込まれた(スクリプト用の)引数を切り出す */
	notesel  buf
	noteload scr_path
	buf	= to_sjis(buf)
	repeat	notemax
		noteget	linestr, cnt
		if instr(linestr, 0, prm_mark)=0 {			// 引数指定マークが行頭にある
			getstr prms, linestr, strlen(prm_mark)	// 埋め込まれた引数を切り出す
			break
		}
	loop
	if prms!"" {
		_args(length(_args)) = prms		// コマンドライン項目の末尾に追加
	}


	/* バッチファイルの内容を作る */
	bat	= "@cd /d " + scr_dir + "\n@"
	repeat	length(_args)-1, 1
		bat += _args(cnt) + " "
	loop
	if chkopt(OPTION_PAUSE) {
		bat += "\n@pause"
	}

	/* バッチスクリプトに含まれている"%"記号を"%%"に変換 */
	notesel	bat
	repeat	notemax
		noteget linestr, cnt
		i	= 0
		newline	= ""
		repeat
			getstr tmpstr, linestr, i, '%'
			if strsize=0 {
				break
			}
			newline += tmpstr
			if strlen(tmpstr) ! strsize {
				newline += "%%"
			}
			i += strsize
		loop
	
		if newline!"" {
			noteadd newline, cnt, 1
		}
	loop

	/* バッチファイルとして保存して実行 */
	notesave	NAME_BAT
	if chkopt(OPTION_MINIMIZE) {
		execmode	= 2
	}
	else {
		execmode	= 0
	}
	exec	NAME_BAT, execmode
	end