5月28日 PowershellからTeratermへ値を渡す

どうもこんにちは、[sampei1]

今日は若干、いやかなりニッチな内容かと思います。

誰得かさっぱりわからんですが、もしかして似たようなことで悩んでいる人もいるかもしれないので、残しておきます

 

パワーシェルからテラタームに値を渡す

Windows10なら標準でついてると思われるPowershell。平たく言えば手の込んだコマンドプロンプト。


たぶん10人いたら8人くらいは「なにそれ」なものかと思います。

それとサーバ操作の代表格ともいうべきTeraterm。今回はこの2つが主役です。

 

経緯

今回仕事で、ローカルで取得したファイルをサーバにあげて、そこからさらに別なサーバに移さなきゃいけないことになりまして(あんまり書くと情報漏洩になりかねないので、適当なところでぼかしておきます)、そのローカル処理・メインの処理にPowershellを選びました。

DOS(コマンドプロンプト)でいいだろ?という声が聞こえてきそうですが、残念ながらDOSでは今回やろうとしている”SCP”はできません(そのままでは)

CPだけならいけますが、昨今の風潮としてSSHを使ってないと使うのを認めない!というのがありまして、使えませんでした。

加えて、ファイル名は動的に変化するためTeraterm1本で行くのもつらそう、ということでWindowsまわりはPowershell、サーバ(Linux)はTeratermを使おうと考えました。

PowershellではLinuxライクなコマンドも使えるようになってることも、使おうと考えた理由の1つです(PSではSCPがそのまま使える)

 

ローカルのデータが送れない

で、ここが今回の問題点です。

何かといいますと、Windows側で取得したファイル名をサーバ側に送れないというもの。

手始めにPowershellからTeratermログイン用アカウントを送って、それを使ってログインできれば異なるプログラム間で変数の受け渡しができたことになると思い、試しておりました。が、何度やってもログインに失敗する状態。

「powershell teraterm 引数」とかでいろいろググりますが、どこも当たり前にできるとしかかかれておらず、何がいけないかがさっぱりわからん。

 

できなかった時の内容

Start-Process -FilePath "C:\Users\UserName\Desktop\teratest.ttl" -Wait -ArgumentList $param2,$param3

 

一応解説しますと、

Start-Process Powershellにて外部プログラムを起動する際のコマンド。

-FilePath で起動させたいテラタームマクロのファイルを指定(ここがそもそもNG)

-Wait は起動させた外部プログラムが終わるまで(プロセスがなくなるまで)待つコマンド

-ArgumentList は起動させる際に外部プログラムに値をまとめて送る際のコマンド

$param2、$param3 には事前に設定・取得した変数を格納

 

なのでここではローカルにあるテラタームのファイルでサーバにSSH接続させて、2つの値を送るというものです。

 

解決内容

そもそもTeratermのマクロファイルっていうのは、ダブルクリックで自動的に実行されるだけであって、そのファイルに引数つけても何の意味もなかったことに気づきます。

 

なので、

Start-Process -FilePath "C:\Program Files (x86)\teraterm\ttpmacro.exe" -Wait -ArgumentList "C:\Users\UserName\Desktop\teratest.ttl",$param2,$param3
が正解。

 

最初と何が違うかというと、起動させるのはマクロ実行用のEXEファイル。で、引数として動かしたいマクロファイルを1番目にもってきて、そのあとに引数を並べる。
(引数を並べる際はカンマで区切る)

 

Teraterm側のHELPで1つめはファイルのパス、2つ目以降に引数をつけるっていうのはそういう意味だったのかとプチ感動(←理解力低すぎなおっさん)。

 

受け入れ側のマクロファイルで

id = param2
pw = param3

と書いておいて無事ログインができた=引数渡しができたことになりました。感動。

 

まとめ

PowershellのStart-ProcessでTeratermを制御する場合は、マクロファイルに引数をつけるんじゃなくて、マクロ実行用のファイルに引数として動かしたいマクロファイルと他の引数を並べましょう