一部のAIに聞いても正しい答えを教えてもらえず、ちょっと勉強したので、メモとして残します。
マクロ実行方法
- (マクロ作成)Windowsのメモ帳などで、
sample_macro.ttl
のようなファイルを作成します。 - 「プログラムで開く」で「PCでアプリを選択」を押し、
- TeraTermのインストールディレクトリを参照し、ttpmacro.exeを実行します
各種文法
変数
変数の利用/メッセージ表示/コメント
変数は宣言・初期化せずそのまま使えます。
;
以降はコメントとして扱われます。
disp_msg = 'Hello World!' ; 予約語もありそうなので、具体的な変数名にする良さそう
メッセージボックスはmessagebox [message] [title]
のようにすると表示できます。
disp_msg = 'Hello World!' ; 予約語もありそうなので、具体的な変数名にする良さそう
messagebox disp_msg 'メッセージ表示の例'
実行結果です。なお、裏の「Pause」「End」というボックスを押すと、マクロの実行を一時停止/終了することができます。
文字列結合/改行
文字列結合はstrconcat [1つめの変数] [2つめ]
という形で行われます。
結果は、[1つめの変数]
に格納されます。
#13
を結合すると、改行できます。
disp_msg = 'Hello World!'
strconcat disp_msg 'こんにちは世界'
strconcat disp_msg #13 ; 改行
strconcat disp_msg #13
strconcat disp_msg '[message end]'
messagebox disp_msg 'メッセージ表示の例'
リモートサーバの操作
リモートサーバへのSSHログイン
connect
コマンドで、host(ip)/username/passwordを指定すると接続できます。
なお、SSHでサーバに初回接続する時は、known_hostsに無い旨のセキュリティ警告が表示されます(基本的に何も考えずYESしてよいです)
; ログイン
linux_server = '[IP_ADDR]:22 /ssh /auth=password /user=[USERNAME] /passwd=[PASSWORD]'
connect linux_server
結果待ちとコマンド投入
Teratermマクロでリモートサーバを操作するときは、「入力可能状態になったか」を判定してからコマンドを投入することが多いです。
wait [str]
コマンドを使うと、[str]
の内容が画面上に表示されたかを確認するコマンドです。
このコマンドで特定の文字列を待つことで、入力可能になったかを判定します。
ログインに成功していれば、Teraterm画面上にqiita@v133-18-160-82-vir:~$
などと出るので、wait '$'
とすることで「入力可能になったら次のコマンドに進む」という操作が可能です。
「サーバ・ユーザ・ディレクトリ含めて、厳密に動作を確認したい」などであれば、wait 'qiita@v133-18-160-82-vir:~$'
のように、厳密にwait
しても良いかなと思います。
Teratermマクロでコマンドを打つときは、sendln [str]
で文字を送ることができます。
; ログイン
linux_server = '[IP_ADDR]:22 /ssh /auth=password /user=[USERNAME] /passwd=[PASSWORD]'
connect linux_server
; 入力可能になるのを待つ
wait '$'
cmd = 'pwd'
sendln cmd ; コマンド送信
ユーザ入力画面
1行入力
ユーザに文字列を打ってもらい、それをマクロ動作に反映させたい、というケースがあると思います。
そのような場合はinputbox [message] [title]
を使います。結果はinputstr
という変数に格納されます。
disp_msg = 'Hello, '
; ユーザに入れてもらう
inputbox 'ユーザ名を入力してください' 'ユーザ名確認'
strconcat disp_msg inputstr
messagebox disp_msg '入力結果'
YesNoボックス/if
ユーザに「これでよろしいですか?はい/いいえ」と確認したいケースがあると思います。
その場合はyesnobox
を使います。「はい」を押すとresult
変数に数値1
が入ります。
result
の内容はif ~ then ~ elseif ~ then ~ endif
文などで判定できます。
disp_msg = 'ユーザ名は以下でよろしいですか?:'
; ユーザに入れてもらう
inputbox 'ユーザ名を入力してください' 'ユーザ名確認'
strconcat disp_msg inputstr
yesnobox disp_msg 'はい・いいえ'
if result==1 then
messagebox '確認ありがとうございます' 'メッセージ'
endif
if/for
if/文字列比較
文字列比較をする場合、strcompare [文字1] [文字2]
とします。
一緒の場合、result
変数に数値0
が入ります。後段のif文で扱いたい場合などはresult
を参照します。
; ユーザに入れてもらう。入力内容はinputstr
inputbox 'ユーザ名を入力してください' 'ユーザ名確認'
; 比較
strcompare '村上' inputstr
if result==0 then
messagebox '村上さんですね' 'メッセージ'
elseif result==1 then
messagebox 'よくわかりません' 'メッセージ'
endif
for/配列
配列を使うときは、strdim [変数名] [長さ]
のように名前と長さを定義します。
for
はfor i 0 4 ~ next
というように使います。なお、0始まりにしたほうが安全です。
strdim lineup 5 ; 配列を宣言
for i 0 4
int2str i_str i ; Int型のiをStr型にしてi_strに格納
strconcat i_str 'つ目を入力してね'
inputbox i_str '入力欄'
lineup[i]=inputstr ; 配列に格納
next
disp_mes = ''
for i 0 4
strconcat disp_mes lineup[i]
strconcat disp_mes #13
next
messagebox disp_mes '入力確認'
関数(サブルーチン)
関数(サブルーチン)
関数は:login_serv ~ return
と宣言し、call login_serv
のように呼びます。
引数の概念はなく、すべてがグローバル変数のように処理されます。
また、関数を使う場合は、本体部分にend
を明確に書く必要があります。
inputbox 'ユーザ名を教えてね' '確認'
username = inputstr
; 関数の呼び方
call login_serv
; ログインできたあとの処理
wait '$'
cmd = 'pwd'
sendln cmd
end ; main部分にendが必要
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 関数の定義
:login_serv
; usernameを使って、Linuxサーバにログインするサブルーチン
linux_server = '[IP_ADDR]:22 /ssh /auth=password /user='
strconcat linux_server username
strconcat linux_server ' /passwd=[PASSWORD]'
connect linux_server
return ; サブルーチンの終わりを明示
goto文
TeraTermマクロではgoto
が使えます。「問答無用で、その部分へ行ってね」という意味合いです。
ただし、forやwhileを抜けるためには使えません。
:input_murakami
inputbox '村上と入力してください' '入力欄'
strcompare '村上' inputstr
if result==0 then
messagebox 'ありがとうございます' 'メッセージ'
elseif result==1 then
goto input_murakami
endif
この例では、入力欄に「村上」と入力しないと、永遠に入力欄が出続けます。
「村上」と入力すると、result==0の方に入り、抜けられます。
参考
コマンドリファレンスです。ちゃんと文法を調べたい方は使いましょう。
これをAIに学ばせれば良さそう