2019/07/17(水)RDP ログイン自動化マクロ(マスターパスワード利用版)

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

RDP ログイン自動化マクロ(マスターパスワード利用版)

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

マクロの目的

Windows RDP でのアクセス情報を保持し、同一ホストに対する 2 回目以降のパスワード入力を回避します。

また、毎回デフォルト設定で良いか問い合わせ、アクセス情報の変更があった場合も収集情報を保持することとします。
この機能により、アクセス先情報を変更した同一ファイルを複数実行しても、パスワードファイル内でコンフリクトしないようになります。

ただし、保持するアクセス情報はサーバへのログインとは別に、毎回のパスワード入力を必須とします。
この目的のために Tera Term の getpasswd コマンドで作成したパスワードファイルを、暗号化または解凍します。

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

続きを読む

マクロのオプション

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

マクロのオプション

ttpmacro.exe にはオプションが指定可能です。

Tera Term バージョン 4.92 から、以下の仕様になっています。

コマンドラインオプション

Tera Term マクロには、コマンドラインオプションを指定することができます。

指定方法は、以下の通りです。
TTPMACRO.EXE [/I] [/V] [<macro file> [<parameters>...]]
[/I]
マクロ起動時に、マクロをアイコン化します。

[<macro file>] より後に記述された場合は、マクロファイルのオプションとして扱われます。
また、拡張子 .ttl のマクロファイルから ttpmacro.exe を起動した場合は、このオプションは省略されたものとして扱われます。
[/V]
マクロ起動時に、マクロを隠します。

[<macro file>] より後に記述された場合は、マクロファイルのオプションとして扱われます。
また、拡張子 .ttl のマクロファイルから ttpmacro.exe を起動した場合は、このオプションは省略されたものとして扱われます。
[<macro file>]
マクロファイル名を指定します。

ファイル名が絶対パスでないときは、ttpmacro.exe からの相対パスと見なされます。
ファイル名はディレクトリ情報が取り除かれ、システム変数 param1 および params[1] に格納されます。

param1 は文字列型ですが、params[1] は文字列型配列になっています。
[<macro file> [<parameters>...]]
[<macro file>] 以降のパラメータは、マクロファイルへ渡したい情報を指定します。

これらはシステム変数 param2 ~ param9 に格納されます。
param10 以降に相当する変数は存在しません。

また、params[2](文字列型配列 params の 3 番目の要素)から順番に格納されます。
文字列型配列であるため、理論的には params[10] 以降は 65536 まで指定可能と思われます。

Windows Vista 以降のコマンドプロンプトでは、以下の制約が存在します。
Windows Vista 以降の コマンド プロンプト (Cmd.exe) では、8192 文字以上の引数を受け付けられますが、8192 文字以上の引数を渡した場合には、以下の現象が発生する可能性があります。

・echo コマンドで、8192 文字目以降の引数が切り捨てられる。
・cmd.exe から、子プロセスを起動する際、渡される引数の一部に抜けが生じる。
https://support.microsoft.com/ja-jp/help/2823587
文字列型も文字列型配列も、最長 511 文字まで指定可能です。

備考

ラベルを用いたサブルーチン (call) や、別ファイルを呼び出すインクルード(include)には、オプションを指定することができません。

エラーメッセージ

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