最近はLineやSlackなど便利なものが出てきましたが、それらとはちゃんと棲み分けができていて、今でも重宝するツールの1つだと思います。
用途としては電話メモが一番多いでしょうか。
IP(IP Messengerのこと)を知る前は、いちいち手で書いて同僚の机の上まで貼りに行っていました。IPになって楽になったもんです。しかし、最近はアプリを開いて色々書くのが面倒に感じてきました。人間こそ勝手な生き物ですね。
電話メモの内容はとても単純なことが多いので、バッチ化しちゃいましょうというのが今回のお話しです。先日Windowsバッチプログラム基礎と応用の記事を書きましたが、その応用編Vo.2のようなものです。
実はバッチ化できる
IPMessengerのVersion4.5からipcmd.exeという専用コマンドが実装されました。
それ以前はipmsg.exeというコマンドが使用可能だったそうですが、現在のipcmdの方が多機能で便利なので、今回もそれを使おうと思います。
コマンドの詳細は、本家本元のipmsg.orgをご覧ください。
尚、作者の白水さんに質問することは可能ですが、結構冷たい方なので傷つかないようにご注意ください。(大概はアホな質問をして冷たく返される場合がほとんどのようです)
要件
- IPMessengerを使って電話メモを最小の手順で送る手段がほしい
- 誰からの電話なのか、部署と名前を入力する
- 私の部署は3人なので、送り先は固定値でもいい
- 用件はできるだけ簡単に入力
- 文章内に送信時の日付と時間を載せたい
電話がかかってくる相手は外部も含めて多種多様なので選択式は不可能。そこは残念ながら手入力するしかなさそう。
電話メモの主な用件といえば、電話がありました、電話があったことをお伝えください、折り返しお願いしますの3つだけなので、それはIF文を使って選択制にしましょう。
後は誰にメッセージを送るかですが、それも選択式にすると手順が3つになるのでさすがに面倒。幸い私の部署は私を含めて3人なので、固定値のバッチを2つ作ることにします。
コードと解説
コード
早速コードです。
@echo off chcp 65001 echo. echo 電話の相手を入力してください。 echo. set /p NAME= echo. echo 折り返しが必要な場合= ブランク echo 電話がありました= 1 echo 電話があったことだけ= 2 echo. set /p ANS= cd %TEMP% rem かかってきた相手をファイルに追記 echo %NAME%さん >> foo.txt rem 伝達事項をファイルに追記 if "%ANS%" equ "" ( echo へ折り返しお願いします。>> foo.txt ) else if "%ANS%" equ "1" ( echo お電話がありました。 >> foo.txt ) else if "%ANS%" equ "2" ( echo お電話があったことだけ >> foo.txt echo お伝えくださいとのことです。>> foo.txt ) else ( echo お電話がありました。 >> foo.txt ) rem 改行をファイルに追記 echo. >> foo.txt rem 日付時間をファイルに追記 echo %date% %time% >> foo.txt rem ファイルの内容を元に送信 ipcmd send "宛先IPアドレス" /msgfile=%TEMP%\foo.txt rem ファイルを削除 del foo.txt
いかがでしょうか。一見すると簡単そうに見えますが、私はかなり悩みました。
備忘録を作ろうとしたのも、そのためです。
後で言うと忘れそうなので先に言っておきます。
注意点は
ことです。
普通Windowsバッチの文字コードはSHIFT-JISが掟なのですが、IPMessengerの場合は文字化けしました。
コード解説していきます。
chcp 65001
文字コードの設定ですが、CHange Code Page identifersの略です。
65001とはUTF-8のことです。
文字コードをSHIFT-JISでなくUTF-8Nにしろと前述しましたが、なぜプログラム内でも指定するのか、私もまだよく解かっていません。おそらくその後にあるset /pで入力される値に関係します。
ちなみに、この位置でchcp 65001を入れないと文字化けします。
echo 電話の相手を入力してください。
バッチファイル使い手への案内文です。使い手のことを意識してプログラムを作ります。
echo.
案内文中で改行を入れる命令です。キツキツになったら見栄えが悪いので適度な改行が必要です。尚、「echo」と「.」の間は空けたら改行になりませんので、打ち間違えにご注意を。
set /p NAME=
電話がかかってきた相手の名前を入力させるために、プログラムを一旦ストップさせます。
入力した値はNAMEという変数に格納され、%NAME%で取り出すことができます。
NAMEという変数名は私が決めただけなので、何でもOKです。
cd %TEMP%
cdはディレクトリの移動、ChangeDirectoryです。%TEMP%は、C:\Users\ユーザ名\AppData\Local\Tempを指します。
Tempとはテンポラリフォルダのことで、一時保存のカジュアルな場所と思ってください。
cdでそこに移動します。
echo %NAME%さん >> foo.txt
%NAME%には入力した値、すなわち電話がかかってきた相手の名前が入ります。
その値の後ろに「さん」を付けて、fooというテキストファイルを作りつつ、書き込みます。
なお、>なら新規作成ですが、>>なら追記の意味になります。
もちろん名前はfooでもbarでもhogehogeでも何でも構いません。
IF文などその他もろもろ
IF文の説明は割愛しますが、WindowsバッチにおけるIF文の書き方はこんな感じです。
- ブランク = 折り返しお願いします
- 1 = お電話がありました
- 2 = 電話があったことだけお伝えください
として入力された値で処理を分岐させ、foo.txtに追記する文書を変化させます。
echo %date% %time% >> foo.txt
PCの日付と時間を環境変数として取得し、foo.txtに追記します。
ipcmd
ipcmdがIPMessengerが用意したコマンドです。
send “宛先IPアドレス”
ipcmdの引数に宛先IPアドレスを指定します。
/msgfile=%TEMP%\foo.txt
テンポラリに作ったfoo.txtに書かれた中身をメッセージとする引数です。
del foo.txt
テンポラリに作ったfoo.txtを削除する命令です。仕掛けるときは忘れずに。
大まかな解説
これだけでは説明が不十分、というか私の苦労に見合わないので笑、さらにおおまかな解説をQ&A方式でしていきます。
ipcmdの後に直でメッセージを書けないのか
書けます。
ipcmd send "IPアドレス" %NAME%さんよりお電話ありました。%date% %time%
これでもいいはずです。ただし、改行が利かないので却下しました。
改行がないと受け取った側は気持ち悪いです。
前述したVersion4.5以前のipmsg.exeなら改行する方法があったのですが却下しました。
なぜ改行できるipmsg.exeを使わないのか
ipmsg.exeで送った場合は、ある記述で文章を改行することができますが、メッセージを受け取った相手が返信できないからです。
どういうことかと言うと、返信ボタンがグレーアウトして押せないようになっています。
なぜテンポラリファイルなのか
改行するにはテンポラリファイルを使えばいいと、まさにその作者の白水さんに教えていただきました。「は?そんなのテンポラリファイルを作ればいいじゃん」的な雑な回答でしたが、頑張って解読しました笑
ファイルを作る場所は、その名のとおり%TEMP%にしましたが、これは私の判断です。もちろん作ったファイルを消すところまでロジックに入れています。
ファイルの中では改行が効くみたいですね。
テンポラリファイルとは
一時的に作るファイルのことで中身は単なるテキストデータです。ipcmdで送る文章を、直でコードに書くのではなく、テキストファイルを指定できるということですね。添付ファイルみたいなものです。
文字コード指定について
WindowsはShift-JISなのにUTF-8Nで文字コードを指定して、おまけにコード内でもchcpを使ってUTF-8を指定しています。
なんでこんな面倒なことをしているのかというと、私もわかりません。こうしないとどうしても文字化けするので仕方がないのです。
最後に
ご覧くださりありがとうございました。
よくよく考えると、コードの最初にfoo.txtが存在すれば削除するロジックがあった方が、間違いないかもしれませんが、今のところ問題ないのでおいおい考えます。
自分で言うのもなんですが、これを使うようになってからは、めっちゃくちゃ楽になりました。
- バッチファイルを開く
- 電話がかかってきた人の部署や名前を入れる
- 選択する(ブランク,1,2)
これで終わりなので、電話メモが秒ですみます。
よろしければ一度お試しください。
といった感じで今回の記事は以上になります。
ご覧くださりありがとうございました。
よろしければWindowsバッチの記事もございます。よろしければご覧ください。
コメント