エラーメッセージ

2021/05/18 05:59 Macro::macro 仕様

エラー出力

エラー用サンプル

Tera Term のエラーメッセージ出力用に、以下のサンプルを実行しました。

ファイル名:err.ttl
unknowncmd 'test'

ダイアログボックス

Tera Term マクロを実行していて、仕様に沿わない記述等があるとサンプルのようなダイアログボックスが出力されます。

Unknown command
表示されるダイアログボックスの例

出力情報の説明

上記ダイアログボックスに番号を付与して、出力情報を説明します。

Unknown command guide
説明用番号を付与したダイアログボックス

対照表
該当番号表示内容出力情報の意味
unknown commandエラーメッセージです。
意味は、下のエラーメッセージ表を参照してください。
err.ttl:1.該当マクロファイル名と、エラー対象の行番号です。
<<<unknowncmd '>>>test'<<< >>> で囲われた部分がエラーメッセージの対象です。
マクロ停止(S)実行中マクロの停止ボタンです。
続行(C)実行中マクロの続行ボタンです。
ヘルプ(H)ヘルプを表示します。

サンプルエラーの要約

上記の内容から、ダイアログボックスは次のようにエラーを報告しています。
現在の Tera Term バージョンではサポートされていないコマンドを使ってない?
エラー対象は err.ttl の 1 行目にある unknowncmd だよ。

マクロの実行について、停止するか、続行するか、ヘルプを参照するか選んでね。

エラーメッセージ

以下 Tera Term が出力するエラーメッセージと、その意味になります。
Tera Term エラーメッセージ
エラーメッセージ意味
Can't call sub.サブルーチンを呼べない。
サブルーチンは別のファイルにある。
Can't link macro.MACRO と Tera Term の間のリンクに失敗。
Can't open file.インクルードファイルが存在しないか、インクルードの階層が深すぎる。
")" expected.カッコが閉じていない。
"*/" expected.コメントが閉じていない。
Link macro first. Use 'connect' macro.MACRO と Tera Term の間のリンクが確立してないため、コマンドが実行できない。
Divide by zero.0で割ろうとした。
Invalid control."else", "elseif", "endif" の誤った使用。
Label already defined.ラベル名の多重使用。
Label required.ラベルが見つからない。
Stack overflow.サブルーチン、"for-next" ループ、"while-endwhile" の階層が深すぎる。
Syntax error.コマンドの形式が間違っている。
Too many labels.ラベルの数が多すぎる。
(最大512個)
Too many variables.変数の数が多すぎる。
(整数型、文字列型、整数配列型、文字列配列型それぞれ最大256個ずつ)
Type mismatch.定数または変数の型が間違っている。
Variable not initialized.初期化されてない変数を参照した。
Index out of range.定義された配列変数の要素数を超えるインデックスを参照した。
"]" expected.配列のカッコ "]" が閉じていない。
Can't allocate memory.メモリの確保に失敗。
Unknown command.マクロコマンドは現在のTera Termバージョンではサポートされていない。

文字・数字の表現(定数)

2021/05/18 05:26 Macro::macro 仕様

文字と数字の表し方

Tera Term マクロにおいて、文字や数字を表現するのに、定数と言う言葉を用いています。
C言語における定数が、データの種類と書き方を表しているので、その流用みたいです。

C 言語の定数 (参考)

C言語における定数としては、以下の書き方をしていました。
データの種類書き方備考
整数12310進数で int 型となっています。
01738進数 (10進数で 123) を表します。
0x7B16進数 (10進数で 123) を表します。
符号なし整数1234u
1234U
long型整数1234l
1234L
実数3.14f
3.14F
double型実数12.3456
文字'a'1 byte 文字を表します。
文字列"a"
"abc"
いずれも文字列として扱います。

Tera Term 言語の定数

Tera Term マクロ言語の定数をまとめると、以下のようになります。
データの種類書き方備考
整数12310進数で int 型となっています。
なお、負の整数は、0-x のように 0 からマイナスするか、一旦変数へ代入して利用します。
$7B16進数 (10進数で 123) を表します。
文字#123# から始まる整数で指定します。
文字 #123 および #$7B は、どちらも ASCII コードにおける { を意味します。
ただし ASCII コード 0 の文字 (NUL) は、文字に含められません。
#$7B
文字列'a'どちらのクォーテーションでも、文字列を表します。
"a"
#123'a'#125いずれも、文字列 {a} を表します。
#$7B'a'#$7D
#123"a"#125
#$7B"a"#$7D
実数-Tera Term において、浮動小数点は未サポートです。

なお、このサイト全体としては、定数を「最初に宣言し、値の変化しない変数」の意味で扱っています。

整数型定数

整数型定数の表現

マクロファイルにおける整数型定数は、10 進数または "$" で始まる16進数で表現します。
Tera Term は、浮動小数点が未サポートです。
例:
    123
    -11
    $3a
    $10F

負の整数定数についての注意

コマンドのパラメータに負の整数定数を使用する場合、以下のような問題が発生する場合があります。

例えば、次のコマンドは文法エラーとなります。
for i -10 0
これは、2番めのパラメータが "i" ではなく、"i-10" とみなされるからです。

この問題を防ぐには以下のいずれかの方法をとります。
  1. "-" の前に "0" をつける。
    for i 0-10 0
    
  1. 負の整数定数を変数に代入してから使用する。
    A = -10
    for i A 0
    

文字列型定数

文字列型定数の表現

Tera Term マクロにおいて文字列型定数を表現する方法は、クォーテーションで文字列を囲んで使用するものと、文字をコードで指定するものの 2 つ存在します。
クォーテーションで文字列を囲む方法
値となる文字列の両端を ' か " で囲みます。
文字列の両端には、同じ文字を使用してください。

文字列を構成する文字は、表示可能で囲み文字と異なる文字ならば何でもかまいません。
例:
    'Hello, world'
    "I can't do that"
    "漢字も可能"
なお、どうしても囲み文字と同じ文字を利用したい場合がありますが、Tera Term では囲み文字を \ 等でエスケープすることができません。
このような時は、ASCII コードと組み合わせて対応します。
詳細は、下記項目「組み合わせ」を参照してください。
文字をコードで指定する方法
1 文字を ASCII (または JIS ローマ字、Shift-JIS) コード (10 進数または $ で始まる 16 進数) で表現し、先頭に "#" をつけます。
ASCII コード 0 の文字 (NUL) は文字列定数に含めることができません。
例:
    #65     文字 "A"
    #$41    文字 "A"
    #13     CR 文字
ASCII コードの各数値は ASCII コード を参照してください。
組み合わせ
「クォーテーションで文字列を囲む方法」と「文字をコードで指定する方法」は、組み合わせることが可能です。
例:
    'cat readme.txt'#13#10
    'abc'#$0d#$0a'def'#$0d#$0a'ghi'
囲み文字とASCIIコードの間に、スペースを入れてしまうとシンタックスエラーになります。


・利用例 1 (シングルクォーテーションを利用する)
msg = 'Single quotation '#39'Used'#39
messagebox msg 'Quotation test'

シングルクォーテーション例
シングルクォーテーション例

シングルクォーテーションは、16進数 (#$27) でも利用可能です。

・利用例 2 (ダブルクォーテーションを利用する)
msg = "Double quotation "#34"Used"#34
messagebox msg 'Quotation test'

ダブルクォーテーション例
ダブルクォーテーション例

ダブルクォーテーションは、16進数 (#$22) でも利用可能です。

・利用例 3 (各種コマンド)
send 'cat /etc/hosts'#13#10

fileopen  fhandle 'c:\test.txt' 
filewrite fhandle '---------cut here---------'#13#10
fileclose fhandle
なお、上記の記述方法は、以下の記述方法と同じになります。
sendln 'cat /etc/hosts'

fileopen    fhandle 'c:\test.txt' 
filewriteln fhandle '---------cut here---------'
fileclose   fhandle

式と演算子

2021/05/18 05:52 Macro::macro 仕様

式と演算子

if 等で扱う条件式は、以下の仕様となっています。

式の表現

式は、定数・変数・演算子・カッコで表現します。

式で扱う定数と変数は、整数型のみです。
結果も整数型になります。

関係演算子を用いた式の結果の値は、以下の通りです。
式の結果値の意味
0
1

演算子の優先順位による分類

優先順位演算子バージョン種類
1
(最高)
notビット否定演算子*1"~" はバージョン 4.53 以降で利用可
~(4.53 以降)
!(4.53 以降)論理否定演算子バージョン 4.53 以降で利用可
+正の単項演算子
-負の単項演算子
2*乗算演算子
/除算演算子
%余剰演算子A % B の値は A / B の余り
3+加算演算子
-減算演算子
4>>(4.54 以降)算術ビットシフト演算子バージョン 4.54 以降で利用可
<<
>>>(4.54 以降)論理ビットシフト演算子バージョン 4.54 以降で利用可
5andビット毎論理積演算子*1"&" はバージョン 4.53 以降で利用可
&(4.53 以降)
6xorビット毎排他的論理和演算子*1"^" はバージョン 4.53 以降で利用可
^(4.53 以降)
7orビット毎論理和演算子*1"|" はバージョン 4.53 以降で利用可
|(4.53 以降)
8<関係演算子
>
<=
>=
9=関係演算子"==" と "!=" はバージョン 4.54 以降で利用可
==(4.54 以降)
<>
!=(4.54 以降)
10&&(4.53 以降)論理積演算子バージョン 4.53 以降で利用可
11
(最低)
||(4.53 以降)論理和演算子バージョン 4.53 以降で利用可

*1 and, or, xor, not はビット演算子です。(論理演算子ではありません)

例:
    1 + 1
    4 - 2 * 3      この式の値は-2
    15 % 10        この式の値は5
    3 * (A + 2)    A は整数型の変数
    A and not B
    A <= B         A, B は整数型の変数。
                   結果の値は真のとき1、偽のとき0

ファイル BOM 情報確認

2021/05/18 06:06 Macro::macro サンプル

ファイルの BOM 情報確認マクロ

このサンプルマクロは、以下の仕様を満たすものとします。

マクロの目的

対象ファイルの BOM (Byte Order mark) を確認します。

出力されるダイアログボックスの数値の意味は、以下の通りです。
<result>の値値の意味
-1対象 BOM は UTF-8 のはずだが情報が不正。
0対象に BOM はなかった。
1対象 BOM は UTF-8 を示している。
2対象 BOM は UTF-16 Big Endian を示している。
3対象 BOM は UTF-16 Little Endian を示している。

続きを読む

2019/07/11(木)パスワードファイル暗号化(7zip 利用版)

2021/05/21 06:34 Macro::macro サンプル

パスワードファイル暗号化(7zip 利用版)

このサンプルマクロは、以下の仕様を満たすものとします。

マクロの目的

Tera Term の getpasswd コマンドで作成したパスワードファイルを、暗号化または解凍します。
暗号化・解凍はそれぞれ別のマクロとし、個別に実行可能とします。
また、共通する情報は設定ファイルを include して読み込むものとします。

なお、アーカイブ作成・解凍のための前提アプリに、コマンドライン版 7zip を利用します。
7zip は、GNU LGPL ライセンスによって開発されているアーカイバです。
https://sevenzip.osdn.jp/

続きを読む