QSスクリプト記述

QSスクリプトは、プログラムを起動する順序を記述したもので、手順を自動実行するために用いる。
同様の目的で用いられたTSスクリプトを代替するもので、バッチ的な性格の強かったTSスクリプトよりも、やや「言語的」性格が強い。

QSスクリプトを直接実行するプログラムは、QS.EXEQSC.EXEQSD.EXEQSE.EXE、 および QSMENU,EXEである。
また、スクリプト置換を含めたプログラムとして、一連のQSCALL.EXE系列のコマンドがある。

スクリプトを実行するプログラムについて簡単に説明する。

  1. QS.EXEは、テキストエディタを備え、対話的に実行する場合に用いる。
  2. QSC.EXEは、その場でスクリプトを実行する。スクリプトに特別な環境変数(QS_ARG...)を通じてスクリプトに引数を与えることが出来る。
  3. QSD.EXEも、その場でスクリプトを実行する。QSC.EXEと異なり、引数を環境変数に設定しない。スクリプトを獲得するためのコマンドラインのパラメータ展開は行う。コマンドラインパラメータ自体の解析はスクリプトの内部で行うこと。
  4. QSE.EXEも、その場でスクリプトを実行する。引数を環境変数に設定しない。QSD.EXEと異なり、コマンドラインのパラメータ展開も行わない。コマンドラインの解釈が必要な場合はスクリプト内部で行う。
  5. QSMENU.EXEは、QSスクリプトを包括したメニュースクリプトを用い、簡単なメニューでのスクリプト選択をする。
  6. QSCALL.EXE系列のプログラムは、スクリプト実行前に引数置換を行う。引数置換を単純に行う(QSCALL.EXE,QSCALLP.EXE)ものと、引数をシフトしながら置換/実行を繰り返す(QSCALLN.EXE,QSCALLNP.EXE)物に分類できる。また、標準出力の取り扱いから、パイプラインの中で使用できるもの(QSCALLP.EXE,QSCALLNP.EXE)と、使用できないもの(QSCALL.EXE,QSCALLN.EXE)に分類できる。

TSEXPRの関数の中にQSスクリプトを実行する関数があるので、コマンドラインのTSEXPR解釈機能を通じて、ほとんどのプログラムは潜在的にQSスクリプトの実行機能を備えている。また、QSスクリプトの実行機能を機能の一部として備えているものもある。

スクリプトの記法

スクリプトは、外部コマンド、内部コマンド(注釈行、空行を含む)からなる。 コマンド行を拡張する継続行を除き、いずれの場合も行頭の空白は取り除いて処理する。
外部コマンド行は、コマンドライン機能を用いてスクリプトからプログラムを実行する。内部コマンド行は、QSスクリプトに内蔵される特別な機能を呼び出す。
基本的には行単位で、先頭行から順に末尾行へ向って実行していく。コマンドには、複数行で構成できるものもある。これはコマンドによって異なる。

行の拡張の最初の方法は行頭に「+」「-」「|」の記号をつけてコマンドを拡張する。これを記号による継続行と呼ぶ。コマンド行自体を拡張する場合にはこの方法を取ることが多い。

もう一つの方法は、ラベルによる継続行である。ラベルを指定し、そのラベルが現れるまでの行を継続範囲とする。コマンドにデータを与えるために使用することが多い。

外部コマンド行

直接、コマンドラインを記述し、プログラムの連なりであるコマンドラインとして実行する。
通常はテキストの1行がコマンドラインの一行に相当する。
次の行が継続行(+-または|で始まる行)である場合は、以降の継続行を接続して一行として扱い、実行する。
さらに、その後にデータ行を書き、コマンドラインの標準入力とすることも出来る。
コマンドラインではコマンドのパイプライン接続(|)、 入出力のリダイレクト(<>>>)機能を提供している。 詳細はここを参照のこと。
[ ( 判別式 ) ] (top of) commandline
[{+|||-}part of commandline]*
[{<<|<<-} [^|~|=|:]label
[データ]*
label
]

外部コマンド行の拡張

外部コマンド行は通常一行で書くが、次の行の行頭の文字が「+」、「-」、あるいは、「|」であれば、一つのコマンドラインとして実行できる。この拡張した行を記号による継続行と呼ぶ。
さらに、続けて記号による接続行を書けば、それらはひとまとめにコマンド行と扱われる。
先頭に書く記号によって行を追加する方法が少し異なる。

行頭が「+」の場合は、その次の文字以降が先行行の末尾につながる。 先行行の最後の文字と継続行の間を区切るためには、先行行の行末か、「+」の後ろに意図的にスペースを挟む必要がある。

行頭が「-」の場合は先行行と現在行の間に復帰改行(\r\n)が挟まる。通常はこの形は使用しない。

行頭が「|」の場合は、「|」を含めて先行する行に連結される。(|は、多くの場合、そのまま、コマンドのパイプ連結記述として扱われる)

cat *.*
+ -p -r |eb
は、
 cat *.* -p -r |eb
と同じ。
cat *.* -p -r
|eb
も、
 cat *.* -p -r |eb
と同じ。

外部コマンドへ標準入力を与える

外部コマンド行のコマンドライン、あるいは記号による継続行の次の行の行頭に「<<」か、「<<-」があると以降の行を外部コマンドに標準入力として与えて実行する。
次のように書く。

<< label
....
....
label

labelだけの行(ラベル行)が現れる直前の行までを標準入力に与える。
labelを省略する空行がラベル行になる。 ファイル末に達した場合は、そこまでがデータの内容である。

次のようにlabelの前に「^」を書くと、各行をTSEXPRの式として評価し、各行ごとに結果に行末を加えてコマンドに標準入力する。

<< ^label
....
....
label

次のようにlabelの前に「~」を書くと、各行をバイナリの値を返すTSEXPRの式として評価し、結果を標準入力する。一般的には使用されない。

<< ~label
....
....
label

次のようにlabelの前に「=」を書くと、各行を引数置換した結果をコマンドに標準入力する。引数置換は一括して行う。

<< =label
....
....
label

次のようにlabelの前に「:」を書くと、各行を引数置換した結果をコマンドに標準入力する。引数置換は行単位で行う。

<< :label
....
....
label

<<」の代わりに、「<<-」で始めると、入力として与える業は、行頭の空白(タブなども含む)文字を取り除いたものになる。また、このとき、ラベル行の判定時も行頭の空白を除去して判定する。この記法を用いれば、入力データにインデントをつけて見やすく記述できる。

判別式

行頭に「(」「)」で囲んでTSEXPRによる判別式を書ける。
判別式は論理値を返す式で、戻り値が真ならば外部コマンドを実行する。偽ならば実行しない。

内部コマンド行

事前に用意された内部コマンドがある。
多くの場合、内部コマンド行は一行で完結するが、一部のコマンドは記号による継続行、ラベルによる継続行をサポートしている。

空行

空白以外の文字がない行は空行として、実行時には、何もせず、次の行へ制御を移す。
記号による継続行は空行があると終了する。

注釈行

注釈行は、「;」で始まる。
実行時には、何もせず、次の行へ制御を移す。
記号による継続行は注釈行があると終了する。 処理内容のメモや、解説に使用すると良い。

現在は、「+」、「-」、「#」、「:」 で始まる行も注釈行扱いしている。
行頭の「+」、「-」は継続行を表すので、継続行でない位置に現れた場合に注釈行扱いをしている。
#」で始まる行は多くのコンピュータ言語で注釈あるいは、 特別なオプションの指定のために使用されているので、踏襲して注釈扱いにしている。 将来、同様な機能を搭載するかもしれない。
:」で始まる行は QSMENU.EXEのメニュー記述コマンドである。 この行を注釈扱いすることで、QSMENU.EXEのメニュースクリプトを、QS.EXEなどで実行出来るようにしている。

内部コマンド

以下の内部コマンドが使用できる

終了処理 最も基本的なフロー制御は、終了処理である。
END [ ReturnCode [ Message [ Title [ Mark ] ] ] ]
この行で実行を終了する。
ReturnCode(戻り値)は自然数。 ReturnCode を記述しないと、現在の ReturnCode を返す。
Messageを記述すると終了の前にメッセージボックスを表示する。 titleはメッセージボックスのタイトル。省略すると、"QSSCRIPT"と表示する。Markはメッセージボックスに表示するアイコンで、"warn"、"info"、"qeustion"、"stop"のいずれかを指定する。指定しなければマークは表示しない。 ReturnCode / Message / Title / Mark!@^記述が可能。
繰り返し処理  繰り返し処理のために数種のコマンドが用意されている。これらは、範囲を明確にするために開始コマンド終了コマンドのペアで用いられる。
WHILE / ENDWHILE」「DO / UNTIL」「DO / WHILE」「FOR / ENDFOR」がそれである。 このループ内では「BREAK」コマンドを使って最も内側の繰り返し処理を中断できる。
WHILE boolexpr
......
ENDWHILE
boolexpr が真の間、WHILEENDWHILE の間を繰り返す。BREAK コマンドで繰り返しを中断し、ENDWHILE の次に制御を移す。
boolexpr は、TSEXPR の式。
DO
......
{UNTIL|WHILE} boolexpr
継続の判断がブロックの最後にある繰り返し。一度は実行しようとする。BREAK で繰り返しを中断する。
DO .... UNTIL boolexpr: 条件が成立するまでループ。
DO .... WHILE boolexpr: 条件が成立する間はループ。
boolexpr は、TSEXPR の式。
FOR paraname IN [ value ]*
......
ENDFOR

または
FOR paraname
......
ENDFOR

または
FOR paraname ON [ arrayname ]
......
ENDFOR

列挙の繰り返し。三種の記法があり、列挙するものが異なる

FOR IN の場合
IN の後の value を順次、環境変数 paraname に代入して FORENDFOR の間を実行する。

FOR の場合
IN 以降を省略すると QS_ARGn を順に環境変数に代入して繰り返す。

FOR ON の場合
TSEXPRの配列名(A-Z、SHELF,ARG)を指定し、その内容を環境変数に代入して繰り返す。配列名を省略すると、配列 ARG を使用する。

BREAK コマンドで繰り返しを中断する。
paraname以降は !@^ 記述が可能。
BREAK
WHILE / DO / FOR コマンドの繰返しを中断する。
条件分岐  条件分岐コマンドは、「IF / ENDIF」と「SWITCH / ENDSWITCH」がある。
IF boolexpr
......
[
ELSEIF boolexpr
......
]*
[
ELSE
......
]*
ENDIF
条件分岐処理。
boolexpr は、TSEXPR の式。
ELSEIF の代わりに ELIFENDIF の代わりに FIを使える。
SWITCH
[
CASE boolexpr; [boolexpr;]*
......
ENDCASE
]*
[
ELSE
......
ENDELSE
]
ENDSWITCH
多条件分岐。
CASE の後ろにある式のいずれかが真になると CASE ... ENDCASE の間の文を実行する。
CASE ... ENDCASE は順に評価され、最初に真になったものだけが実行される。 どの CASE ... ENDCASE も実行されない場合、ELSE .... ENDELSE があれば、それを実行する。 boolexpr は、TSEXPR の式。
サブルーチン  名称をつけたサブルーチンを呼び出せる。サブルーチンの名称は英字で始まり、英数字からなる文字列で表す。
SUB name
......
ENDSUB
サブルーチンを登録する。サブルーチンの最後の RETURN は書かなくても良い。
CALL name
サブルーチンを呼び出す。
RETURN

サブルーチンから戻る
外部スクリプト 指定のスクリプトを現在の環境で実行する機能がある。
SRC { filename +}
記号による継続行が使える。
{+|-} .....

指定のスクリプトを現在の環境で実行する。

複数のスクリプトを指定すると、順番に実行する。
指定のスクリプト内で指定した環境変数は、現在のスクリプトにも反映される。
指定のスクリプト内のサブルーチンを現在のスクリプトから呼び出すことは出来ない。

継続行が使用できる。
継続行の先頭が「+」のとき、先行行に何も挟まず連結する。
継続行の先頭が「-」のとき、先行行と継続行の間には行末(CRLF)を挟んで連結する。
filename!@^ 記述が可能。

SRCLINE { line +}
記号による継続行が使える。
{+|-} .....

パラメータをスクリプトとして現在の環境で実行する。

複数のパラメータを書くと行として順に連結してから実行する。
スクリプト内で指定した環境変数は、現在のスクリプトにも反映される。
スクリプト内のサブルーチンを現在のスクリプトから呼び出すことは出来ない。

継続行が使用できる。
継続行の先頭が「+」のとき、先行行に何も挟まず連結する。
継続行の先頭が「-」のとき、先行行と継続行の間には行末(CRLF)を挟んで連結する。
line!@^# 記述が可能。

式演算 TSEXPR 式を評価するだけの行を書ける。
_ [TSEXPR式;]*
先頭が「_」で始まる行は、TSEXPR の式として評価するが、式の値は利用しない。
式は末尾に「;」をつけて複数書くことが出来る
先頭に「_」がある行の連続は、先頭の「_」を取り除いて連結する。各行末には行末コード「LF 0x0a」を付加する。
TSEXPR での変数、配列、連想配列などはスクリプトのホストプログラムの範囲で有効なので、式代入やファイル操作などの 細かい部分を TSEXPR を使用して行える。
式の中では SPOOL() が使え、標準出力への直接出力を行う。
_<< [TSEXPR式;]*
[ [TSEXPR式;]*]*
_>>
先頭が「_<<」で始まる行から、「_>>」だけの行、または、ファイル末までの間はTSEXPR式の連続として扱う。
TSEXPR式は、「;」で区切って複数書ける。各行末には行末コード「LF 0x0a」を付加する。式は評価するのみ。
TSEXPR での変数、配列、連想配列などはスクリプトのホストプログラムの範囲で有効なので、式代入やファイル操作などの 細かい部分を TSEXPR を使用して行える。
式の中では SPOOL() が使え、標準出力への直接出力を行う。
パス操作 カレントフォルダーの設定、実行パスの設定に関わるもの
CD dirname
カレント・ディレクトリを切替える。
切替えることが出来ない場合は、エラーを表示して、実行を直ちに終了する。
dirname!@^ 記述が可能。
PATH path
パス(環境変数PATH)を設定する。
path!@^ 記述が可能。
ADDPATH {path}*
パス(環境変数PATH)を追加する。
path は一つ以上書く。path が既に存在すれば追加しない。既存のパスの後ろに追加する。
path!@^ 記述が可能。
環境変数 環境変数の設定、クリアなど
SETENV [ envname value ]+
または
SETENV :[prefix] [value]*
または
SETENV . [value]*

いずれの場合にも記号による継続行が使える。
{+|-} .....

環境変数をセットする。三種類の記法により機能が異なる。

SETENV [ envname value ]+

変数名、値の組で指定する書き方。複数組み指定できる。

SETENV :[prefix] [value]*

最初の引数が「:」で始まる場合は、一括指定モードとなる。 prefix で始まる名称に 1 から始まる数字をつけた名前の変数に、以降の引数の値をセットする。また、prefix に「C」をつけた変数に引数の数をセットする。
prefix を省略すると「QS_ARG」が prefix となる。

SETENV . [value]*

最初の引数が「.」一文字の場合には、その後方を間接展開するだけで何も行わない。

いずれの記法でも継続行を使用できる

継続行の先頭が「+」のとき、先行行に何も挟まず連結する。
継続行の先頭が「-」のとき、先行行と継続行の間には行末(CRLF)を挟んで連結する。
envnamevalueprefix!@^# 記述が可能。

SETVAR envname
または
SETVAR .

いずれの場合にも記号による継続行が使える。
{+|-} .....
SETVAR envname

TSEXPRの式を計算し、環境変数にセットする。
式の型が数値の場合は、その値を表わす文字列を設定。 論理値の場合は、TRUEFALSE の文字列を設定する。

SETVAR .

環境変数名を「.」とすると、式の評価のみを行い、環境変数へのセットは行わない。「.」と式の間のスペースは省略できる。

式の中では SPOOL() が使え、標準出力への直接出力を行う。
継続行の先頭が「+」のとき、先行行に何も挟まず連結する。
継続行の先頭が「-」のとき、先行行と継続行の間には行末(CRLF)を挟んで連結する。

SETARG [ value ]+

記号による継続行が使える。
{+|-} .....

環境変数QS_ARGnに順番に値をセットする。
与えた変数の数がQS_ARGCにセットされる。

継続行の先頭が「+」のとき、先行行に何も挟まず連結する。
継続行の先頭が「-」のとき、先行行と継続行の間には行末(CRLF)を挟んで連結する。
value!@^# 記述が可能。

UNSET [ envname ]+
環境変数をクリアする。
envname!@^ 記述が可能。
SETRESULT
現在の戻り値を環境変数 QS_RESULT に設定する。
この変数は、現在のスクリプトより上位からは見ることが出来ない。
SHIFT [ シフト数 ]
環境変数 QS_ARGnQS_ARGn+シフト数 の内容を移す。(nは1から…)
また、QS_ARGC は減算する。 QSC.EXE を実行しているときの引数シフターとして使用すると便利である。
シフト数を省略するとシフト数は 1 。
複数行の実行 スクリプトの行をそのまま、あるいは、TSEXPR式として評価してから標準入力に割り当てて外部コマンドを実行する場合や、複数行に渡ってコマンドラインを書くときに使用する。
現在は、通常のコマンド行で同じ機能を実現できるので、現在はあまり使用しない。
FEED command_line
[+データ]*
継続行を標準入力に割り当ててコマンドラインを実行する。
継続行はコマンド行の次に置き、行頭に+を書いた行の連続である。
継続行は行頭の+を除いた残りが標準入力の1行に相当する。
このコマンドは、外部コマンドの機能が強化されたため、現在ではほとんど使用しない。
FEEDEXPR command_line
[+TSEXPR]*
以下に連続する + で始まる行を TSEXPR として評価し、結果を標準入力に割り当て、コマンドラインを実行する。
+ で始まる行が続く限り、各行を式評価してその結果を行として改行コードを付加して標準入力に繰り込む。
このコマンドは、外部コマンドの機能が強化されたため、現在ではほとんど使用しない。
CMDBLK label top_of_command_line
[part of command_line]*
label
label だけでできる行が現れるまでコマンドラインを拡張し、実行する。
ラベルは、空白以外の文字の連続。
長いコマンドラインを複数行にまたがって記述しやすい。
HERE label command_line
[データ]*
label
以下に続く行をデータ行として標準入力に割り当て、コマンドラインを実行する。
データ行の行の終わりは、 label だけの行または、スクリプト末で示す。
ラベルは、空白以外の文字の連続。
このコマンドは、外部コマンドの機能が強化されたため、現在ではほとんど使用しない。
HEREEXPR label command_line
[TSEXPR]*
label
以下に続く行をTSEXPR式の行とする。各行を TSEXPR として評価し、標準入力と割り当て、コマンドラインを実行する。
TSEXPR 行の行の終わりは、 label だけの行または、スクリプト末で示す。
ラベルは、空白以外の文字の連続。
このコマンドは、外部コマンドの機能が強化されたため、現在ではほとんど使用しない。
HEREBLK label top_of_command_line
[part of command_line]*
label
[データ]*
label
label だけでできる行が現れるまでコマンドラインを拡張する。 さらに、以下に続く行を標準入力と割り当て、コマンドラインを実行する。
継続行の行の終わりは、label だけの行または、スクリプト末で示す。
ラベルは、空白以外の文字の連続。
外部コマンドの標準記法と大差がないが、長いコマンドラインはこちらの方が書きやすいかもしれない。
HEREEXPRBLK label top_of_command_line
[part of command_line]*
label
[TSEXPR]*
label
label だけでできる行が現れるまでコマンドラインを拡張する。 さらに、以下に続く各行をTSEXPRとして評価し、標準入力と割り当て、コマンドラインを実行する。
継続行の行の終わりは、label だけの行または、スクリプト末で示す。
ラベルは、空白以外の文字の連続。
外部コマンドの標準記法と大差がないが、長いコマンドラインはこちらの方が書きやすいかもしれない。
データの行記述 スクリプトの行をデータとして、ファイルや環境変数に保存できる。
TXT [:]name
[+データ]*
以下に続く +で始まる行を指定のファイルに保存する。
名称の先頭に「:」をつけると指定の環境変数に保存する。
データの先頭の +の次の文字から行末までを行として出力する。
スクリプト内でコマンドに与えるパラメータやスクリプト、あるいは初期データなどを記述する際に便利である。
name!@^ 記述が可能。
HERETXT label [:]name
[データ]*
label

または
HERETXT label (tsexpr) [ option ]*
[データ]*
label

以下に続くデータ行を処理する。処理は、ファイル出力、環境変数設定、TSEXPR 評価の三種類がある。
データ行の終わりは、label だけの行または、ファイル末で示す。
ラベルは、空白以外の文字の連続。 name(tesexpr)option#!@^ 記述が可能。

HERETXT label ファイル名

継続行の内容をファイルに出力する。

HERETXT label :環境変数名

継続行の内容を環境変数に設定する。
:」と環境変数名は間を明けずに書くこと

HERETXT label (TSEXPR) [ 引数 ]*

継続行の内容と引数を参照しながら、TSEXPR 式を評価する。
(tsexpr) は一つのパラメータとして指示するために、間に半角スペースなどを書けない。必要な場合は、引用符や複引用符で囲むこと。

名称機能番号関数表記変数表記説明
継続行内容 0 @(0) ??text データ行のすべて。各行の後ろには行末(0x0a)が付加されている。
引数の数 -1 &(-1) ??argc 式の後ろに書いた引数の数。
引数 n @(n) 式の後ろに書いた n 番目の引数。
式の中ではSPOOL()が使え、標準出力への直接出力を行う。
特殊な実行 Windows プログラムや、Dos コマンドを特殊な形で起動するコマンド
DI commandline
コマンドラインをそのまま実行する。
パラメータ展開機能を使用しないで、コマンドラインはそのままプログラムに引き渡される。
パイプライン連結などもサポートしない。
EX (top of) commandline
[{+|||-}part of commandline]*
[{<<|<<-} [^|~|=|:]label
[データ]*
label
]
コマンドラインをパラメータ展開してから実行する。
外部コマンドの実行と同様にコマンド行の連結や、データの繰り込みが出来る。
本システムのパラメータ展開機能を備えないプログラムを実行する際にパラメータ展開後のパラメータを与えることが出来る。
また、展開はスクリプト上で行われるので、スクリプト内の変数をコマンドに渡す際に使用できる。
展開は文字列単位で行われるが、文字列の中に、半角スペース、制御コード、あるいは「 '"」を含む場合と、 長さが0の場合には文字列全体を「"」で囲む。「"」は「""」に変換する。 commandline#!@^ 記述が可能。
EA (top of) commandline
[{+|||-}part of commandline]*
[{<<|<<-} [^|~|=|:]label
[データ]*
label
]
コマンドラインを引数置換してから実行する。
外部コマンドの実行と同様にコマンド行の連結や、データの繰り込みが出来る。
DOS commandline
DOS窓(CMD.EXE)を利用してコマンドラインをそのまま実行する。
パラメータ展開をせず、コマンドラインはそのまま DOS 窓のコマンドラインに引き渡される。
DOSEX commandline
DOS窓(CMD.EXE)を利用して、コマンドラインをパラメータ展開してから実行する。
DOS のコマンドラインをパラメータ展開で記述できる。
展開は文字列単位で行われるが、文字列の中に、半角スペース、制御コード、あるいは「 '"」を含む場合と、 長さが0の場合には文字列全体を「"」で囲む。「"」は「""」に変換する。 commandline#!@^ 記述が可能。

内部コマンド中のTSEXPR

  1. RESULT にはスクリプトの現在の RESULT が入っている

引数置換

  1. スクリプト上での引数置換において、番号パラメータ( %n )は n が負でなければ QS_ARGn の値を返す。n が負ならば、QS_ARGC の値(パラメータの数)を返す。

内部コマンド間接展開

いくつかの内部コマンドは、コマンドライン記述、すなわち、!記述、@記述、^記述が可能となっている。

引数に用いる特殊な環境変数

コマンドQSCは、スクリプトの後ろに書いた引数を環境変数を通じてスクリプトに引き渡す機能を持っている。このとき使用される環境変数は、QS_ARGで始まる一連の名称を持つ。
QS_ARGCは引数の数、QS_ARG0はスクリプト名、QS_ARG1は最初の引数、以下、QS_ARG2…と続く。
この引数を受けての、繰り返し処理を簡単にするために、内部コマンドSHIFTが設けられている。 例えば、引数のすべてに同一のファイル処理を施す場合は、次のように書けばよい。
	while isenv("QS_ARG1")
		cat !@QS_ARG1 | EB
		shift
	endwhile