スーパーバッチBSL(BatchJob Scripting Language)仕様

Ver 1.02 (1999-11-20)

[先頭へ]

 1.概要
 2.書式・用語
  2.1 凡例
  2.2 語と文
  2.3 注釈
  2.4 引用符
   2.4.1 引用符の文法
   2.4.2 引用符を使用できる場所
   2.4.3 引用符の使用法に関する注意
  2.5 コマンドラインへの引渡し
  2.6 構造と節
  2.7 大文字と小文字
  2.8 名の構文規則
  2.9 セッション
  2.10 諸元
 3.変数・環境変数・関数
  3.1 変数
   3.1.1 変数の宣言
   3.1.2 変数の型
   3.1.3 変数の初期値
   3.1.4 変数の参照
   3.1.5 疑似配列
  3.2 環境変数
   3.2.1 環境変数の設定・削除
   3.2.2 環境変数の参照
  3.3 環境変数の有効範囲
   3.3.1 アプリケーションと環境変数
   3.3.2 サブスクリプトと環境変数
   3.3.3 BSLステーションと環境変数
  3.4 関数
   3.4.1 組込み関数とユーザ定義関数
   3.4.2 関数の参照・実行
  3.5 変数・環境変数・関数の評価の実行
   3.5.1 評価の時期と順序
   3.5.2 語の分離と評価の時期
   3.5.3 引用符と評価の時期
   3.5.4 構造制御子と評価の時期
 4.制御構造
  4.1 用語
   4.1.1 構造制御子
   4.1.2 構造制御文
   4.1.3 条件
   4.1.4 ワイルドカード
  4.2 選択実行の構造
   4.2.1 if 構造
   4.2.2 case 構造
  4.3 繰返し制御の構造
   4.3.1 while 構造
   4.3.2 until 構造
   4.3.3 do 構造
   4.3.4 for 構造
  4.4 サブルーチン
   4.4.1 sub 構造(サブルーチン)
   4.4.2 Call 文(サブルーチンの呼出し)
   4.4.3 Return 文(サブルーチンからの戻り)
  4.5 その他の構造制御文
   4.5.1 Break 文(繰返しの中止)
   4.5.2 Exit 文(スクリプトの終了)
   4.5.3 Stop 文(スクリプトの中止)
   4.5.4 Exec 文(コマンドの実行)
   4.5.5 Start 文(コマンドの並列実行)
 5.本システムの提供するコマンド文
  5.1 変数の取扱い
   5.1.1 Var 文(変数の宣言)
   5.1.2 Let 文(変数の代入)
   5.1.3 Set 文(環境変数の設定・削除)
   5.1.4 Comp 文(比較)
   5.1.5 Calc 文(演算)
  5.2 コンソール処理
   5.2.1 Put 文(文字列の表示)
   5.2.2 Get 文(文字列の表示と変数への値の読込み)
   5.2.3 Pause 文(文字列の表示と実行の停止)
   5.2.4 Cls 文
   5.2.5 Beep 文(ビープ)
  5.3 ファイル処理
   5.3.1 CD 文(カレントディレクトリの変更)
   5.3.2 CopyFile 文(ファイルの複写)
   5.3.3 MoveFile 文(ファイルの移動)
   5.3.4 DeleteFile 文(ファイルの削除)
   5.3.5 TruncFile 文(ファイルの切捨て)
   5.3.6 MakeFile 文(ファイルの作成)
   5.3.7 AddLine 文(テキストファイルへの書出し)
   5.3.8 MakeDir 文(ディレクトリの作成)
   5.3.9 DeleteDir 文(ディレクトリの削除)
  5.4 実行制御
   5.4.1 Trace 文(トレース)
   5.4.2 Sleep 文(実行の停止)
   5.4.3 Wait 文(待ち)
   5.4.4 GetPHandle 文(プロセスハンドルの取得)
   5.4.5 CloseHandle 文(ハンドルの開放)
   5.4.6 WaitProcess(プロセスの終了待ち)
   5.4.7 Nop 文(何もしない)
   5.4.8 SetRC 文(戻り値の設定)
   5.4.9 True 文(戻り値 0 の設定)
   5.4.10 False 文(戻り値 1 の設定)
  5.5 外部コマンド
   5.5.1 Shutdown.exe(シャットダウン)
 6.組込み関数
  6.1 基本サービス
   6.1.1 #P(パラメタ)
   6.1.2 #PC(パラメタ数)
   6.1.3 #Params(コマンドラインパラメタ)
   6.1.4 #RC(戻り値)
   6.1.5 #PId(プロセスID)
   6.1.6 #IsProcess(プロセスの存在の判定)
   6.1.7 #Date(システム日付)
   6.1.8 #Time(システム時刻)
   6.1.9 #IsVar(変数の存在の判定)
   6.1.10 #IsEnv(環境変数の存在の判定)
   6.1.11 #DrvSize(ドライブの総容量)
   6.1.12 #DrvFree(ドライブの空き容量)
   6.1.13 #UName(ユーザ名)
   6.1.14 #CName(コンピュータ名)
   6.1.15 #Ver(バージョン)
  6.2 文字列処理
   6.2.1 #Len(文字列の長さ)
   6.2.2 #Pos(文字列の検索)
   6.2.3 #RPos(文字列の右からの検索)
   6.2.4 #Rep(文字列の置換)
   6.2.5 #RRep(文字列の右からの置換)
   6.2.6 #Str(部分文字列)
   6.2.7 #RStr(右からの部分文字列)
   6.2.8 #Trim(左右の空白の除去)
   6.2.9 #LCase(小文字への変換)
   6.2.10 #UCase(大文字への変換)
   6.2.11 #Rept(文字列の繰返し)
   6.2.12 #Wid(文字列の幅)
   6.2.13 #Sep(文字列の分離)
   6.2.14 #QOn(引用符で囲む)
   6.2.15 #QOff(引用符を解決する)
   6.2.16 #IsNum(数値の判定)
   6.2.17 #IsInt(整数の判定)
  6.3 ファイル関係
   6.3.1 #CD(カレントディレクトリ)
   6.3.2 #FAttr(ファイルの属性)
   6.3.3 #FAge(ファイルのタイムスタンプ)
   6.3.4 #FSize(ファイルの大きさ)
   6.3.5 #FName(ファイル名の変換)
   6.3.6 #IsFile(ファイルの存在の判定)
   6.3.7 #IsDir(ディレクトリの存在の判定)
   6.3.8 #IsEmpty(ディレクトリが空かどうかの判定)
   6.3.9 #IniPrm( .INI ファイル参照)
  6.4 演算関数
   6.4.1 #Int(整数部の取出し)
   6.4.2 #Floor(切捨て)
   6.4.3 #Ceil(切上げ)
   6.4.4 #Round(四捨五入)
   6.4.5 #Abs(絶対値)
 7.実行
  7.1 バッチモードでの実行
  7.2 対話実行モードでの実行
  7.3 構文エラー・実行エラーについて
  7.4 トレース
  7.5 Ctrl+C
  7.6 Ctrl+Break

1.概要

名称: スーパーバッチBSL
概要: バッチ処理の簡潔・完全な記述を実現する構造化言語
特徴: シンプルで強力な言語構造を備え、高度なバッチプログラムを簡単に作成できます。
動作環境: Windows95/98/NT4.0 などの32bit Windows 環境

紹介: 
■DOSのバッチファイル( .BAT )に似たシンプルな構文で、高度な記述を可能にします。if, case による選択実行、while, until などの繰返し実行、for によるファイルリストの処理、そしてサブルーチンを備えています。( .BAT の上位互換ではありません。独自の制御構造を備えています。)
■DOS, Windows のアプリケーションを起動し、終了を待ち、戻り値を取得することができます。また複数のアプリケーションを同時に起動し、並列処理を行うこともできます。時間指定の起動やシャットダウン処理も可能です。
■環境変数の他、独自の変数を備え、自在に活用できます。
■コンソールベースのユーザインタフェースを備えていますので、簡潔な対話処理が簡単に実現できます。
■豊富な組込み関数により、必要なシステム情報を取得したり、文字列操作を行うことができます。
■強力なファイル操作機能を備えており、複雑なファイル操作を簡単に実現できます。
■変数の領域やネスティングの深さなど、あらゆる仕様について実体的な制限がありません。
■コンソール形式の対話実行モードを備えていますので、豊富な機能を直接活用できます。
■約 130KB というコンパクトなファイルサイズで、インストールも実行も簡単明瞭です。
■詳細な仕様書が添付されていますので、安心です。
■連動する強力なメニュツール「BSLステーション」が付属します。
■プロフェッショナルな業務レベルでの使用を視野に入れたタフな設計です。特にコマンドラインツールのコントロールに最適です。
■フリーソフトウェアですので、ソースプログラムが添付されています。仕様の分析、機能の追加や変更が可能であり、サンプルソースプログラムとしても活用できます。詳細は使用規定をご確認下さい。(本製品は Delphi 5.0 で記述されています。)
※ 1.0 版では、 0.94 版から若干の仕様変更がなされています。ご注意下さい。


2.書式・用語

2.1 凡例

 以下の記述の中で、[構造] [構文]として文法を示す場合、次のような表記をします。
 { } で囲まれた部分は、省略可能な構成要素をあらわします。
 ..は、直前の要素の任意の回数の繰返しをあらわします。
例) 要素..  要素の1回以上の繰返しをあらわします。
   { 要素 }.. 要素の0回以上の繰返しをあらわします。

 《 》で囲まれた記述は、将来の拡張仕様です。本バージョンではさボートされていません。

2.2 語と文

 スペース、タブ、改行によって区切られた文字の並びを「語」と呼びます。語の並びが「文」です。文は、本システムまたはオペレーティングシステムによって実行され、戻り値を返します。
 文は、改行またはあとの節で示す「構造制御子」によって区切られます。
 構造制御子は、語の中の特別なもので、文の構成要素とはならず、あとの節で示す「構造」を構成します。
 特に ;(セミコロン)は文の区切りだけを示す構造制御子で、いわゆるマルチステートメントを実現します。
 行中に :& で始まる語が現れた場合には、文は区切られないまま次行に続き、いわゆる継続行を実現します。( :& 以降の文字は注釈とみなされます。)
 《行中に :$ で始まる語が現れた場合には、文だけでなく、その行の直前の語と次行の最初の語をひとつづきの語として解釈し、文字列の継続を実現します。( :$ 以降の文字は注釈とみなされます。)(将来の拡張仕様です。本バージョンでは対応していません。)》

2.3 注釈

 :: で始まる語から行末までは、注釈とみなされます。
 《 :* で始まる語から *: で終わる語までは、注釈とみなされます。この間に改行が存在してもかまいません。(将来の拡張仕様です。本バージョンでは対応していません。)》

2.4 引用符

2.4.1 引用符の文法
 引用符には "(ダブルコーテーション)を用います。
 引用符は、語の中の任意の部分で使用することができます。 Windows のファイル名の記述における引用符の使用法と同様です。
例) Put "A B" ; Put A" "B :: どちらも「A B」と表示されます。

 引用符に囲まれた文字列中で " を使用したいときは、 "" と2つ続けて指定します。
 引用符に囲まれた文字列中に、改行を含めることはできません。

 引用符に囲まれた文字列中では、あらゆる構文解釈は行われず、文字列はそのままコマンド・関数に渡されます。
 語の区切りは解釈されず、全体がひと続きの文字列とみなされます。また、変数等の解決も行われません。注釈も処理されません。

2.4.2 引用符を使用できる場所
 本システムの提供するコマンドや関数で、文字列を処理対象とする場合には、引用符を用いて文字列を構成することができます。コマンドや関数の実行時点で引用符が解決されます。
 またファイル名には引用符を使用することができます。これは Windows の仕様と同様です。

 次の場合には語を引用符で処理することはできません。
 1) 語が数値を表すとき
 2) 語が構文上のキーワードを表すとき(コマンド名自身や比較文の比較演算子、 "/" で始まるスイッチなど)

 文が本システムによって実行されず、コマンドラインとしてオペレーティングシステムに渡される場合には、引用符は解決されずそのまま渡されます。実際に引用符がどのように扱われるかは、実行されるコマンドに依存します。

2.4.3 引用符の使用法に関する注意
 本システムの提供するコマンドや関数で、文字列を処理対象とする場合には、引用符を用いて文字列を構成することができます。逆にいえば、もし引用符で括られていた場合には、引用符を解決してから処理が行われます。
 テキストファイルを読み込んで処理するような場合、注意が必要です。テキスト中に引用符が含まれる可能性があるからです。引用符を含んだ文字列を保持している変数をコマンドの操作対象とした場合、コマンドの実行時点で、引用符が解決されてから処理されることになります。
 例えば、以下のコードは予期した動作をしてくれない可能性があります。

Var Text
for Text = /Read README.TXT do
Put &Text
enddo

 テキスト中に引用符が含まれていた場合、これが解決されて表示されてしまいます。ファイルの内容をそのまま表示させるには、以下のように変数の値をいったん引用符で括ってからコマンドに渡す必要があります。

Var Text
for Text = /Read README.TXT do
Put #QOn[(&text)]
enddo

※関数の内部では、特殊処理が行われ、いったん引用符で括られたような形で変数が解決され、関数に渡されますので、変数の内部の引用符が解決されてしまうようなことはありません。

2.5 コマンドラインへの引渡し

 本システムで定義されていない文がスクリプト中に現れた場合、この文はそのままコマンドラインとしてオペレーティングシステムに引き渡され、実行されます。

2.6 構造と節

 選択実行や繰返し実行など、文の実行の流れを制御する枠組みを、「構造」と呼びます。構造は、一連の「構造制御子」によって構成されます。
 構造の中で、特定の構造制御子から次の構造制御子までの間の文の並びを、「節」と呼びます。
例) [if 構造]
   if 条件
   then
    文..   :: これを then 節と呼びます。
   else
    文..   :: これを else 節と呼びます。
   endi

2.7 大文字と小文字

 本システムでは、コマンド名や関数名、構造制御子、変数名やサブルーチン名、そして "/" で指定されるコマンドオプションなどすべての構文要素について、半角英字の大文字と小文字は区別されません。
 ただしコマンドや関数の処理対象となる文字列では、文字列はそのまま処理されます。また文がコマンドラインとしてオペレーティングシステムに渡された場合のコマンドラインパラメタについては、解釈は実行されるコマンドに依存します。

2.8 名の構文規則

 変数名やサブルーチン名などの名前には、半角の英字・数字および _ (アンダスコア)と、すべての全角文字が使用できます。英字・数字およびアンダスコア以外の半角文字(記号類)は、使用できません。ただし、先頭の1文字は、半角の数字であってはなりません。
 半角の英字については、大文字と小文字は区別されません。
※本バージョンではこのチェックは行われていません。将来版ではチェックを実装する予定ですので、変数名やサブルーチン名についてはこの規則を守って下さい。
※環境変数の名については、オペレーティングシステムに依存します。

2.9 セッション

 本システムは、 Windows アプリケーションとして実行されます。このアプリケーションとしての実行単位を、本仕様書では「セッション」と呼びます。( Windows の用語「プロセス」とほぼ同義です。)
 スクリプトプログラムから呼び出されて実行されるサブスクリプトは、BSLインタープリタが同一のセッション内で実行します。一方 Start 文から実行されるBSLスクリプトは、別のBSLセッションが起動されて実行します。
 コンソール形式の対話実行モードでは、全体が1つのセッションになります。
 またメニュツール「BSLステーション」から呼び出して実行される「メニュ前スクリプト」は、BSLステーションが内蔵するBSLインタプリタがすべて同一セッション内で実行します。
 この「セッション」が、環境変数やハンドルなどの有効範囲となります。

2.10 諸元

 語や名の文字数、文中の語の数、文の長さ、構造中の文の数、構造のネスティングの深さ、変数・サブルーチンの数、スクリプト全体の長さなど、スクリプトを構成するすべての要素について、特別な制限はありません。オペレーティングシステムと 32 bit の範囲、そしてハードウェアだけに制限されます。(例えば、コマンドラインの文字数は最大 128 文字または 255 文字です。また環境変数の領域に関してはオペレーティングシステムに制限されます。)


3.変数・環境変数・関数

 本システムでは、独自の変数を使用することができます。また Windows 上の環境変数を参照・設定することができます。また組込み関数を使用することができます。変数・環境変数・関数の参照は、文字列への置換えとして行われます。これを変数・環境変数・関数の「解決」と呼びます。
 変数・環境変数は、「入れ子」にして使用することができます。すなわち、変数や環境変数名の一部として、変数や環境変数を使用することができます。
例) A = 1 ; B1 = BBBB ; Put &B(&A) :: BBBB と表示されます。

3.1 変数

3.1.1 変数の宣言
 変数は、宣言しなければ使用できません。宣言は Var 文で行います。変数名の構文については、名の構文規則によります。
 Var 文は実行文です。 Var 文が実行された時点で、変数が作成されます。

3.1.2 変数の型
 変数は型を持ちません。変数の保持する値は、一般的に文字列として処理されますが、次の場合には整数部14桁、小数部4桁の数値として処理されます。
 1) Calc 文で、数値演算の対象となったとき。
 2) 比較文および Case 構造における比較で、両辺ともに数値として評価できる文字列を保持している場合。
 また、変数に "TRUE" "FALSE" といった文字列を代入することにより、論理変数のように取り扱うことができます。
例) if &A >= 0 then B = True else B = False endi ; if &B then put "A> = 0" else put "A < 0" endi

3.1.3 変数の初期値
 変数の初期値は、空値(長さ 0 の文字列、 "" )です。空値は数値として評価される場合は 0 とみなされます。

3.1.4 変数の参照
 変数の値を参照する場合には、 (& と ) で囲みます。 (&変数名) となります。
 変数の参照は、文中の任意の位置に書くことができます。文字列の途中であってもかまいません。変数の参照は文の実行前に解決され、変数が保持している文字列に置き換えられます。
 変数の参照が独立した語となっている場合には、前後の ( ) は省略できます。
例) Mes = (&Prg)の実行を開始します。 ; Put &Mes

3.1.5 疑似配列
 変数や環境変数は、入れ子にして使用することができます。この機能により、疑似的な配列処理が可能です。
例) Var i
   for i = 1 to 100 do
    Var N(&i)
    N(&i) = &i
   endd
 &i を添字とする 100 個の要素を持つ配列を宣言し、さらに配列要素に i を値として設定します。

3.2 環境変数

3.2.1 環境変数の設定・削除
 環境変数の設定・削除は、 Set 文で行います。環境変数は、宣言は不要です。

3.2.2 環境変数の参照
 環境変数の値を参照する場合には、 (% と ) で囲みます。 (%環境変数名) となります。
 環境変数の参照は、文中の任意の位置に書くことができます。文字列の途中であってもかまいません。環境変数の参照は文の実行前に解決され、環境変数が保持している文字列に置き換えられます。
 環境変数の参照が独立した語となっている場合には、前後の ( ) は省略できます。
※ DOS 式の、 %環境変数名% という書式での参照はできません。

3.3 環境変数の有効範囲

3.3.1 アプリケーションと環境変数
 Windows 環境では、環境ブロック(環境変数を保持するエリア)はアプリケーションごとに保持されます。一般には、アプリケーションの起動時に起動元の環境ブロックを引き継いで生成されます。このため、親プロセスから子プロセスへの環境変数の引渡しはできますが、その逆はできません。
 本システムも、 Windows アプリケーションとして起動されますので、あらかじめ設定されていた環境変数は本システムに引き継がれますが、本システム中で設定した環境変数を呼び元に返すことはできません。
 一方、本システムで設定された環境変数は、本システムから起動されたアプリケーションに引き渡されます。

3.3.2 サブスクリプトと環境変数
 スクリプトプログラムから呼び出されて実行されるサブスクリプトは、すべて本システムが同一プロセス(=同一セッション)の中で実行しますので、環境変数は共有されます。すなわち、サブスクリプト中で設定された環境変数は、呼び元に制御が戻されたあとでも有効です。環境変数はこの範囲でグローバルな変数として作用します。(ただし Start 文から呼び出されて実行されるBSLスクリプトは、別プロセス=別のBSLセッションとして実行されますので、環境変数は引き継がれますが共有されません。)
 一方本システムが提供する変数は、サブスクリプトとして呼び出された場合でもスクリプトプログラムごとに独立に保持されますので、スクリプトプログラムごとにローカルであるといえます。

3.3.3 BSLステーションと環境変数
 メニュツール「BSLステーション」から呼び出して実行される「メニュ前スクリプト」は、BSLステーションが内蔵するBSLインタプリタが同一プロセス(=同一セッション)内で実行しますので、環境変数を共有します。この場合環境変数は、メニュシステム全体にとってグローバルであるといえます。
 すなわち、「メニュ前スクリプト」で設定した環境変数は、以降BSLステーションから起動されるすべてのBSLスクリプト、およびアプリケーションに対して有効となります。

3.4 関数

3.4.1 組込み関数とユーザ定義関数
 現バージョンでは、組込み関数だけがサポートされます。《将来バージョンにおいて、ユーザ定義関数をサポートする予定です。》

3.4.2 関数の参照・実行
 関数を参照・実行する場合には、 (# と ) で囲みます。 (#関数名) となります。
 関数の参照は、文中の任意の位置に書くことができます。文字列の途中であってもかまいません。関数の参照は文の実行前に実行・解決され、関数が与える文字列に置き換えられます。
 関数の参照が独立した語となっている場合には、前後の ( ) は省略できます。

3.5 変数・環境変数・関数の評価の実行

3.5.1 評価の時期と順序
 変数・環境変数・関数は、文の実行の直前に評価・解決されます。
 評価は、先頭の語から後ろの語に向けて、順に実行されます。一つの語の中では、もっとも内側のものから外側に向けて、同一レベルの中では先頭から順に、実行されます。
例) A = 1 ; B1 = BBBB ; Put &B(&A) :: BBBB と表示されます。

3.5.2 語の分離と評価の時期
 変数・環境変数・関数の評価・解決は、語を分離した後に実行されます。したがって変数・環境変数・関数が解決された後の文字列が空値であったり、スペースを含んでいたとしても、それは一つの語として処理されます。ただし、文がコマンドラインとしてオペレーティングシステムに渡された場合には、語としての拘束力は失われます。

3.5.3 引用符と評価の時期
 引用符で囲まれた文字列中では、変数・環境変数・関数の評価は実行されません。変数・環境変数・関数の評価が文の実行の直前に行われるのに対し、引用符の解決は文の実行時に行われます。
例) A = 12 ; Put "(&A)"の値は(&A)です。 :: 「(&A)の値は12です。」と表示されます。

3.5.4 構造制御子と評価の時期
 構造制御子の解釈は、変数・環境変数・関数の評価よりも前に実行されます。したがって、変数・環境変数・関数が解決された文字列が、制御構造子を表現することはできません。


4.制御構造

4.1 用語

4.1.1 構造制御子
 構造制御子は、あらゆる語に優先して解釈され、スクリプトプログラムの実行構造を制御します。これらはつねに文の区切りとみなされるため、文の構成要素となることはできません。これらと同一の文字列をパラメタとしてコマンドに渡したいようなときには、引用符で囲んでおくか、変数に代入する必要があります。引用符が邪魔になるときは関数 #QOff を使用してください。
 構造制御子には、次のものがあります。(本仕様書ではこれらを小文字で表記します。)
  ; if then elseif else endi endif case when endc endcase
  while until for do endd enddo sub ends endsub
※ endi と endif 、endc と endcase 、 endd と enddo 、 ends と endsub はそれぞれ同等の意味を表します。どちらを使ってもかまいません。

4.1.2 構造制御文
 構造制御文は、独立した文として実行されますが、スクリプトプログラムの実行構造を動的に制御するために用いられる点で、一般の文とは区別されます。
 構造制御文は、一般の文と同じように、戻り値を返します。
 構造制御文には、次のものがあります。
 Break 《 Continue 》 Call Return Exec Start Exit Stop (本バージョンでは Continue 文は未対応です。)

4.1.3 条件
 条件は、文の戻り値であらわされます。文が正常終了(戻り値 = 0 )した場合は真、異常終了した場合(戻り値 > 0 )は偽と評価されます。通常、条件をあらわすには比較文( Comp 文)、または "#Is" で始まる関数(条件関数)を使用します。これら以外の一般の文を用いることもできますが、スクリプトのわかりやすさという点からはお薦めできません。

4.1.4 ワイルドカード
 case 構造・ for 構造において文字列を比較するとき、文字列の部分一致を表現するために用いられます。
 * (アスタリスク)は、0文字以上の任意の長さの任意の文字列を表現します。
 ? (クエッション)は、任意の1文字をあらわします。(全角文字も1文字とみなされます。)
 * も ? も、文字列中の任意の位置に何度でも使用することができます。

4.2 選択実行の構造

4.2.1 if 構造
[構造] if 条件 then 文..
   { elseif 条件 then 文.. }..
   { else 文.. }
    endi
 ( endi は endif と書いてもかまいません。)
 条件が真のとき、 then 節の文が実行され、その後構造が終了して endi の次の文に制御が移ります。
 条件が偽のときは、次の elseif 節、else 節、または endi の次の文に制御が移ります。
 通常、条件をあらわすには比較文( Comp 文)、または "#Is" で始まる関数(条件関数)を使用します。
例) if &Ans == E then Break endi

4.2.2 case 構造
[構造] case 文字列
    when 文字列.. then 文..
   { when 文字列.. then 文.. }..
    endc
 ( endc は endcase と書いてもかまいません。)
 case 節の文字列と when 節の文字列とを順に比較し、どれかが一致したときに then 節の文が実行されます。
 when 節の文字列には、ワイルドカードが使用できます。大文字と小文字は区別されません。また when 節の文字列には、 "," (半角のカンマ)で区切った複数の文字列の並びを指定することもできます。いわゆるCSV形式です。
 比較元、比較先の文字列の両方が数値として解釈可能な場合には、数値同志として比較されます。ただしどちらかでも引用符で囲まれている場合には、文字列同士として比較されます。
 ワイルドカード自身や空白などの特殊文字列を比較文字列として渡したい場合には、引用符で囲みます。
※ただし本バージョンでは、仕様上の制約により ? を比較文字列としてわたすことはできません。 ? は、引用符に囲まれた場合でも、任意の1文字を表すワイルドカードとして処理されます。この制約は、将来解決される可能性があります。
※本バージョンでは、文字列が ? を含むかどうかを判定するような場合には、 #Pos 関数を使用して下さい。
※「その他の場合」を表す else 句は、本バージョンではサポートされていません。 when * then 文.. と書くことで、同様の処理が可能です。
例) case &Ans
   when E END then Break
   when * then Call 処理ルーチン
   endc

4.3 繰返し制御の構造

4.3.1 while 構造
[構造] while 条件 do 文.. endd
 ( endd は enddo と書いてもかまいません。)
 条件が真であるあいだ、 do 節の文を繰り返し実行します。
 条件は、 do 節に入る前に評価されます。条件が最初から偽なら、 do 節の文は1回も実行されません。
例) Get Count 0 回数=
   n = 1
   while &n =< &Count do
    Call 処理ルーチン ; Calc n + 1
   endd

4.3.2 until 構造
[構造] until 条件 do 文.. endd
 ( endd は enddo と書いてもかまいません。)
 条件が真になるまで、 do 節の文を繰り返し実行します。
 条件は、 do 節に入る前に評価されます。条件が最初から真なら、 do 節の文は1回も実行されません。
例) Get Count 0 回数=
   n = 0
   until &n >= &Count do
    Calc n + 1 ; Call 処理ルーチン
   endd

4.3.3 do 構造
[構造]
[書式1] do 文.. endd
[書式2] do 文.. while 条件 endd
[書式3] do 文.. until 条件 endd
 ( endd は enddo と書いてもかまいません。)
 書式1では、 do 節の文を繰り返し実行します。 do 節の内部で Break 文などが実行されない限り、繰返しは終了しません。
 書式2では、条件が真であるあいだ、 do 節の文を繰り返し実行します。
 書式3では、条件が真になるまで、 do 節の文を繰り返し実行します。
 書式2と3では、条件は do 節の文を実行した後に評価されます。 do 節の文は、かならず1回は実行されます。
例) do
    Get Param E パラメタは?(終了=E)
    if &Param == E then Break endi
    Call 処理ルーチン
   endd

4.3.4 for 構造
[構造] for 変数名 = {スイッチ} 文字列.. do 文.. endd
 ( endd は enddo と書いてもかまいません。)
[書式1](自動判定)     for 変数名 = 文字列.. do 文.. endd
[書式2](ファイル検索)   for 変数名 = /{F}{D}{A}{S}{:{N}{L}} 文字列.. do 文.. endd
[書式3](文字列の代入)   for 変数名 = /Value 文字列.. do 文.. endd
[書式4](数値の順代入)   for 変数名 = { /Step } 始値 to 限界 { step 増分 } do 文.. endd
[書式5](ファイルの読込み) for 変数名 = /Read 文字列.. do 文.. endd

 変数に順に値を代入しながら、 do 節の文を繰り返し実行します。複数の文字列が指定できる場合は、先頭の文字列から順に処理されます。さらに文字列には、 "," (半角のカンマ)で区切った複数の文字列の並びを指定することもできます。いわゆるCSV形式です。
 代入すべき文字列がなくなったら、繰返しを終了します。このとき、戻り値として 1 を返します。また変数には空値が設定されます。
 代入すべき文字列がはじめから存在しないときには、 do 節の文は1回も実行されません。

[書式1]
 書式1では、書式2、書式3、または書式4の機能が自動的に選択され、実行されます。
 文字列のならびが、書式4に適合する場合は、数値の順代入機能として解釈され、実行されます。
 それ以外のとき、文字列にワイルドカードが含まれれば書式2のファイル検索機能として、含まれなければ書式3の文字列代入機能として解釈され、実行されます。この判定は文字列ごとに行われます。またファイル検索機能が適用されたときには、スイッチ "/F:N" が指定されたのと同様の動作、すなわち「通常ファイルの検索結果をファイル名でソートして出力」という機能として動作をします。

[書式2]
 文字列に一致するファイル名を検索します。文字列にはワイルドカードが使用できます。文字列にワイルドカードが含まれない場合、一致するファイル名が存在しなければ変数への代入は行われません。
 ファイル名の指定には、相対パスまたは絶対パスを指定することができます。これらの場合、生成されるファイル名にもパスが付加されます。
 変数に代入すべきファイル名のリストは、繰返しの最初にすべて生成されます。以降は、生成されたリストから順にファイル名が取り出されます。
 各スイッチの機能は次のとおりです。
 F : ファイルの検索を指定します。
 D : ディレクトリの検索を指定します。
 A : 隠し属性、システム属性のファイルも検索の対象とします。
 S : サブディレクトリも検索します。
 N : ファイル名でソートして取り出します。
 L : ソートせずに取り出します。
※ F, D, A, S の各機能文字の指定順序は自由です。
※ F, D の両方が省略された場合は、 "F" を仮定します。 F, D の両方が指定されたときは、指定された順に検索されます。
※ソートオプションの指定が省略されたときは、 "N" が仮定されます。
※ワイルドカードの解釈は、ベース名(ファイル名から拡張子を除いた部分)と拡張子部分について独立に処理されます。各部の解釈の仕様は Case 文と同様です。( Dos プロンプトでの Dir コマンド、 Windows の「検索」、 WindowsAPI の FindFirstFile などは、それぞれこのワイルドカードの解釈に関してときどき奇妙な動作をするようですが、本システムでは独自に解釈しています。)
※拡張子の指定が省略された場合は、 ".*" が指定されたものと見なされます。拡張子のないファイル名を指定する場合は、ファイル名の最後に "." を附加します。

例) for File = *. do Put &File endd :: 拡張子のないファイルを検索します。
   for File = /S \*.txt do Put &File endd :: カレントドライブ内を検索し、拡張子が ".txt" のファイルを表示します。

[書式3]
 文字列を単純に変数に代入します。

[書式4]
 始値から限界まで、増分ずつ値を増やしながら代入します。( Basic の For 文と同様です。)
 増分にはマイナスの値を指定することもできます。
 Do 節の中で変数の値を変更しても、制御には影響しません。次の代入では、現在の値を無視して、もともと代入される予定だった次の値が代入されます。

[書式5]
 テキストファイルの各行を順に読み込みます。
 ファイルは、繰返しの最初にすべて読み込まれます。以降は、順に各行が取り出されます。

4.4 サブルーチン

4.4.1 sub 構造(サブルーチン)
[構造] sub サブルーチン名
     文..
    ends
 ( ends は endsub と書いてもかまいません。)
 Call 文で呼び出されるサブルーチンを構成します。サブルーチン名の構文は、名の構文規則によります。
 サブルーチンは、メインプログラムよりも後に書かなければなりません。
 サブルーチン名は、スクリプトプログラムの実行に先立って解釈されます。したがってサブルーチン名に変数、環境変数、関数などを含むことはできません。

4.4.2 Call 文(サブルーチンの呼出し)
[構文] Call サブルーチン名
 サブルーチンを呼び出します。
 サブルーチン中で最後に設定された戻り値を返します。

4.4.3 Return 文(サブルーチンからの戻り)
[構文] Return {戻り値}
 サブルーチンの呼び元に戻ります。
 戻り値を、呼び元に返します。戻り値を省略した場合は、 0 を返します。

4.5 その他の構造制御文

4.5.1 Break 文(繰返しの中止)
[構文] Break {戻り値}
 while、 until、 do、 for の各構造による繰返し実行を中止し、構造の外に抜け出します。現在実行中のもっとも内側の繰返し構造にだけ作用します。
 指定された戻り値を返します。戻り値を省略した場合は、 0 を返します。

4.5.2 Exit 文(スクリプトの終了)
[構文] Exit {戻り値}
 スクリプトプログラムの実行を終了します。サブスクリプトとして呼び出されていたスクリプトの場合は、そのスクリプトの実行を終了し、呼び元のスクリプトに戻ります。
 指定された戻り値を、スクリプトプログラム自身の終了コードとして、呼び元に返します。戻り値を省略した場合は、 0 を返します。

4.5.3 Stop 文(スクリプトの中止)
[構文] Stop {戻り値}
 スクリプトプログラムの実行を完全に終了します。サブスクリプト中から実行された場合でも、スクリプトのすべてのネストを強制的に終了し、本システム自体が終了します。メニュから実行された場合には、メニュに戻ります。
 指定された戻り値を、スクリプトプログラム自身の終了コードとして、呼び元に返します。戻り値を省略した場合は、 0 を返します。

4.5.4 Exec 文(コマンドの実行)
[構文] {Exec {スイッチ}} コマンド名 {パラメタ文字列}..
    スイッチ: /Min /Max /Res

 コマンドを実行し、その終了を待ちます。コマンド名 Exec は省略できます。
 文の先頭のコマンド名が本システムで定義されたコマンドと一致しないとき、 Exec 文として解釈されます。
 コマンドにはサブスクリプト、外部コマンド、内部コマンドが指定できます。
 外部コマンド、または内部コマンドを実行する場合、スイッチにより、実行されるコマンドのウィンドウの表示状態を指定することができます。
 /Min : 指定されたコマンドを、最小化状態(タスクバーに収納された状態)で起動します。
 /Max : 指定されたコマンドを、最大化状態(ウィンドウが画面一杯に広がった状態)で起動します。
 /Res : 指定されたコマンドを、通常の大きさで起動します。
 サブスクリプトを実行する場合は、スイッチを指定することはできません。

[サブスクリプト]
 まずコマンド名をサブスクリプト名として解釈しようとします。
 サブスクリプト名にパスが指定されているとき、そのパス内が検索されます。拡張子 .bsl は省略できません。
 サブスクリプト名にパスが指定されていないとき、カレントディレクトリおよび環境変数 Path に設定されたディレクトリがこの順に検索されます。拡張子は省略できます。アプリケーションの起動ディレクトリ、 Windows ディレクトリおよび Windows のシステムディレクトリは検索の対象となりません。
 上記の検索により実行すべきスクリプトファイル .bsl が見つからないとき、または .bsl 以外の拡張子が指定されたときには、外部コマンドまたは内部コマンドの実行が指定されたものとみなされます。
 サブスクリプトは、すべて本システムが同一プロセスの中で解釈実行します。このため、環境変数はこの範囲でグローバルなものとなります。
 本システムが提供する変数は、各スクリプトプログラムごとにローカルに保持されます。
 サブスクリプトが設定した値を、戻り値として受け取ります。

[外部コマンド/内部コマンド]
 コマンド名がサブスクリプト名として解釈できないとき、外部コマンドの実行が指定されたものとみなされ、コマンド名以下は、そのままコマンドラインとしてオペレーティングシステムに引き渡されます。
 実行形式ファイルが発見されなかった場合には、実行エラーとなります。
 実行形式ファイルが発見された場合には、これを起動し、終了を待ちます。
 実行形式ファイルが設定した値を、戻り値として受け取ります。
※ただし、ここで起動できるコマンドには次の制限があります。
 1) ファイル拡張子を省略できるのは、 .EXE だけです。 .COM 、 .BAT は省略することができません。
 2) 内部コマンドを直接起動することはできません。内部コマンドを実行したい場合は、先頭に * をつけて
   *内部コマンド { パラメタ文字列 }..
  のように記述してください。これは実際にはコマンドインタープリタ( COMMAND.COM または CMD.EXE )を経由して次のように実行されます。
 COMMAND.COM /C 内部コマンド { パラメタ文字列 }..
 または
 CMD.EXE /C 内部コマンド { パラメタ文字列 }..
※この場合コマンドインタープリタがつねに戻り値 0 を返しますので、内部コマンドそのものの終了状態を識別することはできません。
※内部コマンドの呼出しを直接実装できないのも、この理由によります。呼び出そうとしたコマンドが存在しない場合でも、コマンドインタープリタはつねに戻り値 0 を返すため、スクリプトプログラムの信頼性を確保することができなくなってしまうからです。
※また SET 文、 CD 文をコマンドインタープリタ経由で呼び出した場合、別の DOS セッション内でコマンドが実行され、無意味になってしまうことに注意してください。
※対話実行モードでは、内部コマンドを直接呼び出すことができます。ただし上記の制約は変わりません。 SET 、 CD は本システムが解釈・実行します。
※コマンドインタープリタは、 %COMSPEC% から取得されます。

4.5.5 Start 文(コマンドの並列実行)
[構文] Start {スイッチ} コマンド名 {パラメタ文字列}..
    スイッチ: /Min /Max /Res
 コマンドを実行しますが、終了を待ちません。
 コマンド名は、まずスクリプトファイル名として解釈されます。
 スクリプトファイルが見つかったとき、別のBSLセッションが起動され、スクリプトが実行されます。
 スクリプトファイルが見つからないとき、コマンド名以下はコマンドラインとしてオペレーティングシステムに引き渡されます。
 起動されるコマンドがコンソールアプリケーションの場合は、新しいコンソールが生成されます。
 スイッチにより、実行されるコマンドのウィンドウの表示状態を指定することができます。
 /Min : 指定されたコマンドを、最小化状態(タスクバーに収納された状態)で起動します。
 /Max : 指定されたコマンドを、最大化状態(ウィンドウが画面一杯に広がった状態)で起動します。
 /Res : 指定されたコマンドを、通常の大きさで起動します。
 コマンドの検索や実行の仕方は、 Exec 文と同様です。
 つねに戻り値 0 を返します。
※ Start 文で起動した外部コマンドについて、 GetPHandle 文でプロセスハンドルを取得することができます。このハンドルを用いて、 WaitProcess / #IsProcess / #RC[] の各文・関数により、コマンドの終了状態を取得することができます。ハンドルは CloseHandle 文により開放します。
※ また、関数 #PId でプロセスIDを取得することができます。プロセスIDはシステムを通じて一意なものですので、例えばプロセスごとに一意な名称を持つファイルを作成したい場合などに使用できます。


5.本システムの提供するコマンド文

5.1 変数の取扱い

5.1.1 Var 文(変数の宣言)
[構文] Var 変数名 {変数名}..
 変数を宣言します。変数名の構文は、名の構文規則によります。
 変数には型はありません。文字列、または整数部14桁、小数部4桁の数値をあらわす文字列を保持します。
 つねに戻り値 0 を返します。
※変数名に、 & をつけてはなりません。変数の解決が行われてしまいます。

5.1.2 Let 文(変数の代入)
[構文] { Let } 変数名 = 文字列
 変数に値を代入します。コマンド名 Let は省略できます。
 つねに戻り値 0 を返します。
※変数に空値を代入したいときには、文字列に "" を指定します。
※変数名に、 & をつけてはなりません。変数の解決が行われてしまいます。
※語数が 3 で、 2 番目の語が "=" の文が発見されると、文の先頭に "Let" が補われます。この処理は変数・環境変数・関数の評価より前に行われます。したがってそのような形式の文を直接コマンドラインとしてオペレーティングシステムに渡したい場合は、 2 番目の語に変数を使用するなどの工夫が必要になります。

5.1.3 Set 文(環境変数の設定・削除)
[構文] Set 環境変数名 = {文字列}
 環境変数に値を設定します。文字列を省略した場合は、環境変数が削除されます。
 処理が成功したときには 0 、失敗したときには 1 を戻り値として返します。
※環境変数に "" (空値)を代入することはできません。環境変数が削除されてしまいます。
※環境変数名に % をつけてはなりません。環境変数の解決が行われてしまいます。
※この Set 文は、本システムが独自に解釈・実行しています。したがって各パラメタの間のスペースを省略することはできません。また環境変数の一覧を表示したい場合には、あとの節で述べる内部コマンドの呼出しを使用して、 *SET のようにしてください。

5.1.4 Comp 文(比較)
[構文] { Comp } 文字列 比較演算子 文字列
     比較演算子: == <> >< << < >> > <= =< >= =>
 ( << と < 、>> と > はそれぞれ同じ意味です。)
 文字列・数値の比較を行います。コマンド名 Comp は省略できます。
 両辺がともに数値とみなせる場合には、数値同士として比較を行います。それ以外の場合には、文字列同士として比較します。(大文字と小文字も区別されます。)数値であっても、引用符で囲んだ場合は文字列とみなされます。
 比較結果が真の場合には 0 、偽の場合には 1 を戻り値として返します。
※比較文は、一般に条件をあらわす文として if 、 while 、 until などの構造の中で使用されます。
※両辺が等しいことをあらわす比較演算子は、 "==" です。 "=" を使用すると、代入文とみなされます。
※語数が 3 で、 2 番目の語が比較演算子のどれかに等しい文が発見されると、文の先頭に "Comp" が補われます。この処理は変数・環境変数・関数の評価より前に行われます。したがってそのような形式の文を直接コマンドラインとしてオペレーティングシステムに渡したい場合は、 2 番目の語に変数を使用するなどの工夫が必要になります。

5.1.5 Calc 文(演算)
[構文] Calc 変数名 演算子 数値
    演算子: + - * /
 変数に、数値があらわす値を演算処理します。単項演算の形です。演算結果は、数値として整形して格納されます。
 変数にあらかじめ格納されている値は、数値をあらわす文字列、または空値でなければなりません。
 つねに戻り値 0 を返します。
例) A = 001 ; Calc A + 0 ; Put &A :: 1 と表示されます。

5.2 コンソール処理

5.2.1 Put 文(文字列の表示)
[構文] Put {文字列}..
 文字列をコンソール(標準出力)に表示します。文字列と文字列の間にはスペースが空けられます。文字列を省略した場合は、改行だけが行われます。
 つねに戻り値 0 を返します。

5.2.2 Get 文(文字列の表示と変数への値の読込み)
[構文] Get 変数名 既定値 {文字列}..
 文字列を表示し、行末で入力を受け付けます。入力された文字列を変数の値として設定します。入力された文字列が空値の場合には、既定値が変数に代入されます。
 つねに戻り値 0 を返します。
※変数名に、 & をつけてはなりません。変数の解決が行われてしまいます。

5.2.3 Pause 文(文字列の表示と実行の停止)
[構文] Pause {文字列}..
 文字列を表示し、行末で入力を受け付けます。
 つねに戻り値 0 を返します。

5.2.4 Cls 文
[構文] Cls
 コンソールをクリアします。
 つねに戻り値 0 を返します。
※本バージョンでは、この文は内部的にコマンドインタープリタを経由して実行されます。すなわち *Cls と書いたのと同様に動作します。

5.2.5 Beep 文(ビープ)
[構文] Beep {周波数 {ミリ秒}}
 ビープ音を鳴らします。周波数、ミリ秒を省略した場合は、それぞれ 440Hz 、 100ms を仮定します。
 ただし Windows95 では、周波数・ミリ秒の指定は無視されます。
 つねに戻り値 0 を返します。

5.3 ファイル処理

5.3.1 CD 文(カレントディレクトリの変更)
[構文] CD {ディレクトリ名}
 カレントディレクトリを変更します。ディレクトリ名の指定を省略した場合には、カレントディレクトリを表示します。ディレクトリ名には "\" をつけてもつけなくても構いません。
 処理が成功したときには 0 、失敗したときには 1 を戻り値として返します。
※この CD 文は、本システムが独自に解釈・実行しています。したがってコマンドとパラメタの間のスペースを省略することはできません。( DOS のコマンドラインで許されるような "CD\" といった書き方はできません。)
※ DOS の CD とは異なり、ドライブ付きで指定した場合にはカレントドライブも変更されます。
※またカレントドライブのみ変更する X: というコマンドには対応していません。(内部コマンドとしてコマンドインタープリタ経由で実行しても、コマンドインタープリタ終了時にもとに戻ってしまうため、変更されません。)

5.3.2 CopyFile 文(ファイルの複写)
[構文] CopyFile コピー元ファイル名 コピー先ファイル名
 ファイルを単純にコピーします。ワイルドカードなどの処理は行われません。コピー先に同名ファイルがあるとき、上書きします。
 処理が成功したときには 0 、失敗したときには 0 以外の値を戻り値として返します。

5.3.3 MoveFile 文(ファイルの移動)
[構文] MoveFile 移動元ファイル名 移動先ファイル名
 ファイルを名称変更・移動します。ファイルだけでなく、ディレクトリも名称変更・移動できます。ただし、異なるドライブ間のディレクトリの移動はできません。移動先に同名ファイルがあるとき、移動に失敗します。
 処理が成功したときには 0 、失敗したときには 0 以外の値を戻り値として返します。

5.3.4 DeleteFile 文(ファイルの削除)
[構文] DeleteFile ファイル名..
 ファイルを削除します。複数のファイルが指定できます。
 すべてのファイルの削除に成功したときには 0 、どれかひとつでも失敗したときには 0 以外の値を戻り値として返します。
 ただし、削除すべきファイルがもともと存在しないときには、削除は成功したものとみなされます。

5.3.5 TruncFile 文(ファイルの切捨て)
[構文] TruncFile ファイル名..
 ファイルの内容を切り捨て、大きさを 0 バイトにします。複数のファイルが指定できます。
 すべてのファイルの切捨てに成功したときには 0 、どれかひとつでも失敗したときには 0 以外の値を戻り値として返します。

5.3.6 MakeFile 文(ファイルの作成)
[構文] MakeFile ファイル名..
 ファイルを作成します。複数のファイルが指定できます。
 作成されたファイルのサイズは、 0 バイトになります。同名ファイルがすでに存在するとき、作成に失敗します。
 すべてのファイルの作成に成功したときには 0 、どれかひとつでも失敗したときには 0 以外の値を戻り値として返します。
※この仕様により、このコマンドは排他制御に使用できます。

5.3.7 AddLine 文(テキストファイルへの書出し)
[構文] AddLine ファイル名 文字列
 テキストファイルに文字列を追加します。ファイルが存在しないときは、ファイルを作成して書き出します。
 処理が成功したときには 0 、失敗したときには 1 を戻り値として返します。

5.3.8 MakeDir 文(ディレクトリの作成)
[構文] MakeDir ディレクトリパス
 ディレクトリを作成します。ディレクトリパスに沿って、すべてのディレクトリをまとめて作成します。
 ディレクトリ名には "\" をつけてもつけなくても構いません。
 処理が成功したときには 0 、失敗したときには 1 を戻り値として返します。
 ただし、作成すべきディレクトリがもともと存在しているときには、処理は成功したものとみなされます。

5.3.9 DeleteDir 文(ディレクトリの削除)
[構文] DeleteDir ディレクトリ名
 ディレクトリをその内容ごと削除します。ディレクトリ中に存在するファイル、サブディレクトリもすべて削除します。
 ディレクトリ名には "\" をつけてもつけなくても構いません。
 削除に成功したときには 0 、失敗したときには 1 を戻り値として返します。
 ただし、削除すべきディレクトリがもともと存在しないときには、削除は成功したものとみなされます。
※このコマンドは、無警告でディレクトリの内容をすべて削除します。充分に注意して下さい。
※ディレクトリの中が空で、削除しても安全かどうかを確認するには、 #IsEmpty 関数を使用します。

5.4 実行制御

5.4.1 Trace 文(トレース)
[構文] Trace {モード}
    モード: /On /Off /Step
 スクリプトプログラムのデバグのための、トレースモードを切り替えます。
 /On : トレースを実行するモードです。1ステップごとに実行内容が表示されます。
 /Off : トレースを抑止するモードです。通常のモードです。
 /Step : 1ステップごとに停止しながら実行するモードです。
 モード指定を省略すると、 /On を指定したとみなされます。
 起動時には /Off のモードになっています。
 つねに戻り値 0 を返します。

※ステップ実行のモードでは、実行に介入してコマンドを投入する事ができます。ただし構造制御子や構造にかかわる行が表示されたステップでは、介入はできません。介入が可能なのは、通常の実行文です。介入可能なときには、行の後ろに " > " が表示されます。ここで、任意の1文を実行させる事が可能です。
 投入された文は、表示された文が実行される前に実行されます。ここで Trace 文を投入すれば、トレースモードを切り替える事ができます。 Put 文により変数の内容を確認する事もできます。また Stop 文を投入すれば、実行を中止する事ができます。

5.4.2 Sleep 文(実行の停止)
[構文] Sleep {秒数}
 指定された秒数の間、実行を停止します。秒数には、小数も指定できます。
 つねに戻り値 0 を返します。

5.4.3 Wait 文(待ち)
[構文] Wait {日付} 時刻
 指定日の指定時刻まで、実行を停止します。日付を省略した場合には、現在の日付を仮定します。
 つねに戻り値 0 を返します。

5.4.4 GetPHandle 文(プロセスハンドルの取得)
[構文] GetPHandle 変数名
 直前の Start 文で起動したアプリケーションのプロセスハンドルを取得します。取得は1回しかできません。
 取得したハンドルは、1回のBSLセッションの中で有効です。
 取得したハンドルは、不要になった時点で CloseHandle 文により開放します。開放を忘れた場合でも、BSLセッションの終了時には自動的に開放されますので、短期的なセッションではあまり気にする必要はないかもしれません。しかしながら常駐するスクリプトでアプリケーションの起動を繰り返すような場合には、開放を怠るとメモリの圧迫を招くものと思われます。
 処理が成功したときには 0 、取得すべきプロセスハンドルが存在しないときには 1 を戻り値として返します。

5.4.5 CloseHandle 文(ハンドルの開放)
[構文] CloseHandle プロセスハンドル
 GetPHandle 文で取得したプロセスハンドルを開放します。
 処理が成功したときには 0 、失敗したときには 1 を戻り値として返します。

5.4.6 WaitProcess(プロセスの終了待ち)
[構文] WaitProcess プロセスハンドル
 プロセスハンドルで指定されたプロセスの終了を待ちます。指定されたプロセスが存在しない場合、戻り値 1 を返します。プロセスが終了したとき、戻り値 0 を返します。

5.4.7 Nop 文(何もしない)
[構文] Nop
 何もしません。
 つねに戻り値 0 を返します。

5.4.8 SetRC 文(戻り値の設定)
[構文] SetRC {戻り値}
 何もしませんが、指定された戻り値を設定します。戻り値を省略した場合は、 0 を設定します。
 この文は、通常は使用することはありません。戻り値の設定は、 Break 、 Return 、 Exit 、 Stop などの文で行います。

5.4.9 True 文(戻り値 0 の設定)
[構文] True
 何もしませんが、戻り値 0 を設定します。
 この文の用途は、やや特殊です。 #IsNum などの論理関数の値として設定され、内部的に実行されます。また変数に "True" "False" といった文字列を代入することにより、論理変数のように使用することができます。

5.4.10 False 文(戻り値 1 の設定)
[構文] False
 何もしませんが、戻り値 1 を設定します。
 この文の用途は、やや特殊です。 #IsNum などの論理関数の値として設定され、内部的に実行されます。また変数に "True" "False" といった文字列を代入することにより、論理変数のように使用することができます。

5.5 外部コマンド

5.5.1 Shutdown.exe(シャットダウン)
[構文] Shutdown {スイッチ{:Force}} {オプション}..
    スイッチ: /LogOff /Shutdown /PowerOff /Reboot
    オプション: /Wait /Msg1 /Msg2
 Windows のシャットダウン処理を行います。

 /LogOff : カレントユーザーをログオフさせます。
 /Shutdown : システムをシャットダウンし、 電源を切っても安全な状態にします。
 /PowerOff : システムをシャットダウンし、 電源を切ります。
 /Reboot : システムをシャットダウンした後、 システムを再起動します。
 Force : アプリケーションの終了に関するダイアログを省略し、強制的にシャットダウン処理を実行します。通常指定してはなりません。
 /Wait:秒数 : 処理開始までの待ち時間(既定値は2秒)
 /MSG1:文字列 : 処理待機中のメッセージ
 /MSG2:文字列 : 処理開始時のメッセージ

 スイッチを省略した場合、ダイアログが起動されます。
※BSLスクリプト中から Shutdown.exe を呼び出した場合、すみやかににスクリプトを終了させるようにして下さい。 Shutdown.exe が終了処理を開始しようとしたとき、BSLが終了していないと、これを終了させることができません。

※ Win32 API には上記のように記されていますが、環境によって動作は異なるようです。以下にテスト結果を示します。
 テスト環境: Panasonic Let's note CF-A44 / Pentium-MMX 266MHz / Windows 98 4.10.1998 
 テスト結果: /LogOff:ログオフ /Shutdown:電源断 /PowerOff:ログオフ /Reboot:リブート

 つねに戻り値 0 を返します。


6.組込み関数

 本システムでサポートされている組込み関数を、以下に示します。
 関数が引数をもつときは、 [ ] で囲んで指定します。
 引数が複数あるときは、引数のあいだを ,(半角のカンマ)で区切ります。
 関数の参照は、全体がひと続きの文字列でなければなりません。途中に空白があると、そこで語の区切りが認識されてしまうからです。空白や "," を含んだ文字列を指定したいときは、引用符で囲んで下さい。

6.1 基本サービス

6.1.1 #P(パラメタ)
[書式] #P[整数]
 スクリプトプログラムにコマンドラインで渡された整数番目のパラメタを参照します。整数 = 0 のとき、スクリプトプログラム自身の名称を参照します。

6.1.2 #PC(パラメタ数)
[書式] #PC
 スクリプトプログラムにコマンドラインで渡されたパラメタの数を参照します。

6.1.3 #Params(コマンドラインパラメタ)
[書式] #Params
 コマンドラインで渡されたすべてのパラメタを一括して参照します。

6.1.4 #RC(戻り値)
[書式1] #RC
 直前に設定された戻り値を参照します。

[書式2] #RC[プロセスハンドル]
 プロセスハンドルで指定されたプロセスの終了コードを取得します。( Start 文で起動し GetPHandle 文でプロセスハンドルを取得したプロセスに対して使用できます。)
※プロセスが終了していないときは 259 を返します。プロセスが存在しない場合 1 を返します。
※この関数は、 WaitProcess 文または #IsProcess 関数によりプロセスが終了していることを確認したあとに使用して下さい。この関数を、プロセスの終了判定に使ってはいけません。プロセスが戻り値として 259 を設定した場合、終了していないとみなされてしまいます。

6.1.5 #PId(プロセスID)
[書式1] #PId
 直前の Start 文で起動したアプリケーションのプロセスIDを返します。

[書式2] #PId[SELF]
 自分自身のプロセスIDを返します。

※プロセスIDは、プロセスの識別に使うことのできるグローバルなプロセス識別子です。この値はプロセスの作成時から終了時まで有効です。このプロセスIDを使用することで、例えばプロセスごとに一意な名前を持つファイルを作成することができます。

6.1.6 #IsProcess(プロセスの存在の判定)
[書式] #IsProcess[プロセスハンドル]
 プロセスハンドルで指定されたプロセスが存在するかどうかチェックします。プロセスが存在する場合 "TRUE" を、プロセスがすでに終了している場合、または指定されたハンドルが不正の場合、 "FALSE" を返します。

6.1.7 #Date(システム日付)
[書式] #Date
 システム日付を参照します。形式は、 "YYYY-MM-DD" となります。

6.1.8 #Time(システム時刻)
[書式] #Time
 システム時刻を参照します。形式は、 "HH:MM:SS" となります。

6.1.9 #IsVar(変数の存在の判定)
[書式] #IsVar[変数名]
 指定された変数が存在するかどうかを判定します。存在するとき、 "TRUE" を返します。そうでないとき、 "FALSE" を返します。

6.1.10 #IsEnv(環境変数の存在の判定)
[書式] #IsEnv[環境変数名]
 指定された環境変数が存在するかどうかを判定します。存在するとき、 "TRUE" を返します。そうでないとき、 "FALSE" を返します。

6.1.11 #DrvSize(ドライブの総容量)
[書式] #DrvSize{[ドライブ名]}
 ドライブ名の指定方法は、ドライブ名のみ、ドライブ名+ ":" 、ドライブ名+ ":\" のどれでもかまいません。
 ドライブ名を省略したときは、カレントドライブが仮定されます。
 ドライブの総容量のバイト数を返します。エラーが発生したときは、 -1 を返します。
※ FAT32 では正常に動作しない場合があります。

6.1.12 #DrvFree(ドライブの空き容量)
[書式] #DrvFree{[ドライブ名]}
 ドライブ名の指定方法は、ドライブ名のみ、ドライブ名+ ":" 、ドライブ名+ ":\" のどれでもかまいません。
 ドライブ名を省略したときは、カレントドライブが仮定されます。
 ドライブの空き容量のバイト数を返します。エラーが発生したときは、 -1 を返します。
※ FAT32 では正常に動作しない場合があります。

6.1.13 #UName(ユーザ名)
[書式] #UName
 ユーザ名を返します。

6.1.14 #CName(コンピュータ名)
[書式] #CName
 コンピュータ名を返します。

6.1.15 #Ver(バージョン)
[書式] #Ver
 本システムのバージョン番号を返します。

6.2 文字列処理

6.2.1 #Len(文字列の長さ)
[書式] #Len[文字列]
 文字列の長さを返します。全角文字も1文字と数えられます。

6.2.2 #Pos(文字列の検索)
[書式] #Pos[文字列,検索文字列{,{検索開始位置}{,検索オプション}}]
    検索オプション: C
 文字列中の検索文字列の文字位置を返します。検索は、検索開始位置から開始されます。検索開始位置が省略された場合、先頭から検索します。一致する文字列が存在しない場合には、 0 を返します。
 検索オプションが省略された場合、半角英字の大文字と小文字は区別されません。
 検索オプション "C" が指定された場合、半角英字の大文字と小文字は区別されます。
 全角文字も1文字と数えられます。

6.2.3 #RPos(文字列の右からの検索)
[書式] #RPos[文字列,検索文字列{,{検索開始位置}{,検索オプション}}]
    検索オプション: C
 文字列中の検索文字列の右からの文字位置を返します。検索は、右から左へ、右から数えた検索開始位置から行われます。検索開始位置が省略された場合、右端から検索します。一致する文字列が存在しない場合には、 0 を返します。
 検索オプションが省略された場合、半角英字の大文字と小文字は区別されません。
 検索オプション "C" が指定された場合、半角英字の大文字と小文字は区別されます。
 全角文字も1文字と数えられます。

6.2.4 #Rep(文字列の置換)
[書式] #Rep[文字列,検索文字列,置換文字列{,{検索開始位置}{,検索オプション}}]
    検索オプション: C
 文字列中の検索文字列に一致する文字列を、置換文字列に置き換えた文字列を返します。検索は検索位置から開始され、置換は1回だけ行われます。検索開始位置が省略された場合、すべての検索対象文字列が置換されます。
 検索オプションが省略された場合、半角英字の大文字と小文字は区別されません。
 検索オプション "C" が指定された場合、半角英字の大文字と小文字は区別されます。
 全角文字も1文字と数えられます。

6.2.5 #RRep(文字列の右からの置換)
[書式] #RRep[文字列,検索文字列,置換文字列{,{検索開始位置}{,検索オプション}}]
    検索オプション: C
 文字列中の検索文字列に一致する文字列を、置換文字列に置き換えた文字列を返します。検索は、右から左へ、右から数えた検索開始位置から行われ、置換は1回だけ行われます。検索開始位置が省略された場合、すべての検索対象文字列が置換されます。(この場合の動作は #Rep と同様です。)
 検索オプションが省略された場合、半角英字の大文字と小文字は区別されません。
 検索オプション "C" が指定された場合、半角英字の大文字と小文字は区別されます。
 全角文字も1文字と数えられます。

6.2.6 #Str(部分文字列)
[書式] #Str[文字列,開始位置{,終了位置}]
 文字列の開始位置から終了位置までの部分文字列を取り出します。終了位置が省略されたときは、末尾までの文字列を取り出します。
 終了位置が文字列の末尾よりも後ろを指している場合、必要な長さの半角の空白が補われます。
 全角文字も1文字と数えられます。

6.2.7 #RStr(右からの部分文字列)
[書式] #RStr[文字列,開始位置{,終了位置}]
 文字列の右から数えた開始位置から終了位置までの部分文字列を取り出します。終了位置が省略されたときは、先頭までの文字列を取り出します。
 終了位置が文字列の先頭よりも前を指している場合、必要な長さの半角の空白が補われます。
 全角文字も1文字と数えられます。

6.2.8 #Trim(左右の空白の除去)
[書式] #Trim[文字列{,オプション}]
    オプション: L R
 オプションが省略されたとき、文字列の左右の空白を除去した文字列を返します。
 オプション "L" が指定されたとき、文字列の左側の空白を除去した文字列を返します。
 オプション "R" が指定されたとき、文字列の右側の空白を除去した文字列を返します。

6.2.9 #LCase(小文字への変換)
[書式] #LCase[文字列]
 文字列を小文字に変換した文字列を返します。全角文字は変換の対象となりません。

6.2.10 #UCase(大文字への変換)
[書式] #UCase[文字列]
 文字列を大文字に変換した文字列を返します。全角文字は変換の対象となりません。

6.2.11 #Rept(文字列の繰返し)
[書式] #Rept[文字列,繰返し数]
 文字列を指定回数だけ繰り返した文字列を返します。繰返し数がゼロのときには、空値を返します。

6.2.12 #Wid(文字列の幅)
[書式] #Wid[文字列]
 文字列の幅(バイト数)を返します。全角文字は2バイトと数えられます。

6.2.13 #Sep(文字列の分離)
[書式] #Sep[文字列,整数{,区切り文字}]
 文字列から、区切り文字で区切られた整数番めの文字列を取り出します。区切り文字が省略されたときは、 "," (半角のカンマ)が指定されたと見なします。
 検索対象文字列に引用符が含まれる場合、引用符の内部は区切り文字の検出の対象となりません。CSV形式の文字列の解析などに使用することができます。

6.2.14 #QOn(引用符で囲む)
[書式] #QOn[文字列]
 文字列を引用符で囲みます。文字列中に引用符自身が含まれるときは、これを引用符2つに変換します。

6.2.15 #QOff(引用符を解決する)
[書式] #QOff[文字列]
 引用符で囲まれた文字列をもとに戻します。文字列中に引用符自身が2つ続けて発見されたら、これを引用符1つに変換します。

6.2.16 #IsNum(数値の判定)
[書式] #IsNum[文字列]
 文字列が数値をあらわすかどうかを判定します。文字列が数値をあらわすとき、 "True" を返します。そうでないとき、 "False" を返します。
例) if #IsNum[(&Ans)] then Call 処理ルーチン else Pause 入力値が不正です。 endi

6.2.17 #IsInt(整数の判定)
[書式] #IsInt[文字列]
 文字列が整数をあらわすかどうかを判定します。文字列が整数をあらわすとき、 "True" を返します。そうでないとき、 "False" を返します。

6.3 ファイル関係

6.3.1 #CD(カレントディレクトリ)
[書式] #CD
 カレントディレクトリを参照します。

6.3.2 #FAttr(ファイルの属性)
[書式] #FAttr[ファイル名]
 ファイルの属性をあらわす文字列を返します。以下の文字の組合せです。
 R: 読出し専用 H: 隠し S: システム V: ボリューム D: ディレクトリ A: アーカイブ

6.3.3 #FAge(ファイルのタイムスタンプ)
[書式] #FAge[ファイル名]
 ファイルのタイムスタンプを返します。 "YYYY-MM-DD HH:MM:SS" の形式です。

6.3.4 #FSize(ファイルの大きさ)
[書式] #FSize[ファイル名]
 ファイルの大きさ(バイト数)を返します。

6.3.5 #FName(ファイル名の変換)
[書式] #FName[ファイル名,オプション]
 ファイル名(パス指定を含む)を、以下のオプションにしたがって変換します。
 Drv : ファイル名から、ドライブ名を取り出します。
 Path : ファイル名から、パス部分( \ または : まで)を取り出します。
 Name : ファイル名からパス部分を取り除き、ファイル名本体を取り出します。
 Base : ファイル名からパス部分と拡張子を取り除いたベース名を取り出します。
 Ext : ファイル名から拡張子部分を取り出します。( "." を含みます。)
 Full : ファイル名を絶対パスに変換します。
 Rel : ファイル名を相対パスに変換します。
※これらの変換は、単に文字列に対する処理として行われます。対応するパスやファイルが存在するかどうかなどはチェックされません。

6.3.6 #IsFile(ファイルの存在の判定)
[書式] #IsFile[ファイル名]
 ファイル名で指定されたファイルが存在するかどうかを判定します。ファイルが存在するとき、 "TRUE" を返します。そうでないとき、 "FALSE" を返します。

6.3.7 #IsDir(ディレクトリの存在の判定)
[書式] #IsDir[ディレクトリ名]
 ディレクトリ名で指定されたディレクトリが存在するかどうかを判定します。ディレクトリ名には "\" をつけてもつけなくても構いません。ディレクトリが存在するとき、 "TRUE" を返します。そうでないとき、 "FALSE" を返します。

6.3.8 #IsEmpty(ディレクトリが空かどうかの判定)
[書式] #IsEmpty[ディレクトリ名]
 ディレクトリが空かどうかを判定します。ディレクトリ名には "\" をつけてもつけなくても構いません。
 ディレクトリの下にサブディレクトリだけが存在し、そのすべての階層についてファイルが存在しない場合、ディレクトリは空であるとみなされます。
※この関数は、 DeleteDir コマンドによってディレクトリを丸ごと削除しても安全かどうかを調査するために使用することができます。
 ディレクトリが空とみなされるとき、 "TRUE" を返します。そうでないとき、 "FALSE" を返します。

6.3.9 #IniPrm( .INI ファイル参照)
[書式] #IniPrm[INI形式ファイル名,セクション名,パラメタ名]
 .INI 形式のファイルから指定されたパラメタを参照します。
 読み込んだ行が [ ] で囲まれた文字列であれば、セクション名と解釈します。
 指定されたセクションが発見されたあと、読み込んだ行の "=" より左側が指定されたパラメタと等しければ、 "=" より右側の文字列を返します。
 セクション名に空値を指定した場合、最初のセクション名が発見されるまでの行を検索します。
 指定されたファイル、セクション、パラメタが発見されない場合は、空値を返します。

6.4 演算関数

6.4.1 #Int(整数部の取出し)
[書式] #Int[数値]
 数値の整数部を返します。(ゼロの方向に切り捨てます。)
例) Put #Int[-1.5] :: -1 と表示されます。

6.4.2 #Floor(切捨て)
[書式] #Floor[数値]
 数値を負の無限大の方向に切り捨てます。
例) Put #Floor[-1.5] :: -2 と表示されます。

6.4.3 #Ceil(切上げ)
[書式] #Ceil[数値]
 数値を正の無限大の方向に切り上げます。
例) Put #Ceil[-1.5] :: -1 と表示されます。

6.4.4 #Round(四捨五入)
[書式] #Round[数値]
 数値を四捨五入します。(ゼロの方向に対して処理されます。)
例) Put #Round[-1.5] :: -2 と表示されます。

6.4.5 #Abs(絶対値)
[書式] #Abs[数値]
 数値の絶対値を返します。


7.実行

7.1 バッチモードでの実行

[構文1] BSL スクリプトファイル名 {パラメタ}..
 スクリプトファイル名にパスが指定されているとき、そのパス内が検索されます。拡張子 .bsl は省略できません。
 スクリプトファイル名にパスが指定されていないとき、カレントディレクトリおよび環境変数 Path に設定されたディレクトリがこの順に検索されます。拡張子は省略できます。アプリケーションの起動ディレクトリ、 Windows ディレクトリおよび Windows のシステムディレクトリは検索の対象となりません。

[構文2] BSL 文 {; 文}..
 BSLスクリプトの、任意の文を実行します。マルチステートメントも記述可能です。
 実際は、BSLインタープリタにコマンドラインから渡されるパラメタ文字列は、BSLスクリプトの1行として解釈実行されますので、記述方法はBSLにしたがいます。構文1も同様に実行されています。

7.2 対話実行モードでの実行

[構文] BSL
 スクリプトファイル名を省略すると、コンソール形式の対話実行モードで起動されます。次のようなプロンプトが表示されます。
 ディレクトリパスの最終ディレクトリ名>
 対話実行モードでは、本システムのすべての機能が使用できます。
 入力された文は、すぐに実行されます。ただし、次の場合には実行が保留されます。
  1) 継続行の指定があるとき
  2) 構造が完結していないとき
 バッチモードと異なるのは、内部コマンドの実行に関してです。対話実行モードでは、本システムで解釈されず、かつ実行形式ファイルが発見されなかったなかった文は、そのままコマンドインタープリタ( COMMAND.COM または CMD.EXE )に渡されます。したがって、先頭に * をつけなくても内部コマンドが実行できます。

7.3 構文エラー・実行エラーについて

 構造のエラーについては、スクリプトプログラムを読み込んだ時点でチェックされます。エラーが発見された場合はスクリプトプログラムの内容がエラー箇所まで表示され、エラー内容が報告されます。スクリプトプログラム自身は実行されません。
 実行時にエラーが発見された場合は、原因を報告し、処理を中止します。エラーのチェックはなるべく厳密に行うように設計されています。スクリプトプログラム中から呼び出されたサブスクリプト中でエラーが検出された場合も、スクリプトプログラム自体の実行を中止します。

7.4 トレース

 スクリプトプログラムの動作内容を監視し、点検するために、トレース機能が提供されています。
 トレースは Trace 文によりトレースモードを切り替えることで実行できます。 Trace 文はスクリプトプログラム中の任意の位置で実行することができます。また対話実行モードからスクリプトを実行する場合は、コマンドラインから Trace 文を実行しておいてからスクリプトを実行することができますので、スクリプトプログラム自身を書き換えることなく、トレースモードを設定することが可能です。
 また次の項で述べる、 Ctrl+C による割込みによって、トレースモードを設定することも可能です。

 トレースには2つのモードがあります。ひとつは、たんに実行中の文を逐次表示するモードです。もうひとつは、実行する文を表示すると同時に入力を受け付ける、ステップ実行のモードです。
 ステップ実行のモードでは、表示された実行文が実行される前に、操作者が投入したコマンドを実行させることができます。 Trace 文によりトレースモードを切り替えたり、 Put 文により変数の内容を確認したり、 Stop 文によりスクリプトプログラムの実行を中止したりすることができます。

 トレース機能の活用方法のひとつとして、トレース内容をファイル出力する方法があります。BSLの起動時に

C:\>BSL スクリプト名 > Trace.log

 のようにリダイレクトを使用することで、実行の経過を完全に記録することができます。このログファイルを分析すれば、スクリプトプログラムの動作を追跡することができます。

7.5 Ctrl+C

 スクリプトプログラムの実行中に Ctrl+C ( [Ctrl] キーを押しながら "C" を押すこと)を投入することで、スクリプトの実行を安全に中断することができます。
 スクリプトプログラムの実行中に Ctrl+C が投入されると、トレースモードが一時的にステップ実行モードに切り替えられたように動作します。介入可能な実行文の後ろに " > " を表示して停止しますので、任意の1文を投入することができます。そのまま実行を継続することもできます。ここで Trace 文を投入してトレースモードを設定したり、 Stop 文によって処理を中止することもできます。
 この Stop 文による処理の中止は、メモリ資源の喪失を引き起こさない、安全な強制終了の方法です。

7.6 Ctrl+Break

 スクリプトプログラムの実行中に Ctrl+Break ( [Ctrl] キーを押しながら [Break] キーを押すこと)を投入すると、スクリプトプログラムの実行が中止されます。
 この場合は、 Ctrl+C による中断とは異なり、無条件に強制的に終了されます。メモリ資源はできるだけ開放しようとしますが、動的に確保された資源は開放できませんので、場合によってはメモリ資源の喪失が発生します。
 通常は Ctrl+Break ではなく Ctrl+C を使用するべきです。