ファイル転送ソフトとして高い人気のHulftを使用して、ファイルを配信するバッチを作ってみました。
タスクスケジューラやJP1などに登録したい方は、参考にしていただければと思います。
ポイントは以下の2点です。
- 配信コマンドはutlsendコマンドを使う。
- -syncは必ずつける。
ホスト名とファイルIDとポート番号を指定して実行するバッチ
配信コマンドは、utlsendコマンドを使います。また事前に相手先のHulftが受信できる状態かを確認したいのでutlalivecheckコマンドで確認するようにしています。
配信先の事前チェックを行わないのであれば、ポート番号とホスト名はいりません。
@echo off
rem ----------------------------
rem HULFT送信処理
rem 相手先のHULFT起動確認後にファイル送信
rem 正常終了(0)
rem 相手先HULFT生存確認エラー(8)
rem 異常終了(9)
rem ----------------------------
rem パラメーター(ホスト名/ファイルID/ポート番号を指定)
SET HULFTPATH="x:\HULFT Family\hulftx\bin"
SET FILEID=xxxxx
SET HOSTNAME=xxxxx
SET PORTNO=xxxxx
SET CHECK_TIMEOUT_SEC=20
SET SEND_TIMEOUT_SEC=300
rem ----------------------------
rem 相手先HULFT生存確認
%HULFTPATH%\utlalivecheck -h %HOSTNAME% -p %PORTNO% -w %CHECK_TIMEOUT_SEC%
if NOT %ERRORLEVEL%==0 (
goto ERROR
)
rem HULFT送信
rem -syncオプション(同期転送) 転送結果が返ってくるまで待つ
%HULFTPATH%\utlsend -f %FILEID% -sync -w %SEND_TIMEOUT_SEC%
if %ERRORLEVEL% == 0 (
echo %DATE:/=-% %TIME: =0% %~n0 正常終了
exit /B 0
) else (
echo %DATE:/=-% %TIME: =0% %~n0 HULFTエラーコード:%ERRORLEVEL%で異常終了しました。
exit /B 9
)
:ERROR
echo %DATE:/=-% %TIME: =0% %~n0 相手先HULFT生存確認でエラーになりました。
exit /B 8
戻り値
戻り値(リターンコード)は0が正常終了。それ以外は異常終了としています。ただし、相手先のサーバー側の問題かデータ側の問題なのかを切り分けたいのでエラーコードを二つに分岐しています。
戻り値 | 処理結果 |
---|---|
0 | 配信ファイルが正しく相手先に送信されたとき(正常終了) |
8 | 相手先のHulftサービスが正常に起動していない場合(エラー) |
9 | その他の原因でエラーとなった場合にエラーコードを出力する。 |
ポイント1 -syncオプションは必ずつける。
-syncオプションは必ず入れること。-syncオプションがない場合は、コマンドが実行しただけで正常終了の値が返ってきてしまいます。正常に相手先にファイルが転送されたかが確認できていない状態です。
ポイント2 HulftのファイルIDの設定は必須
Hulft配信バッチはutlsendコマンドを実行してファイル送信を行っていますが、Hulft側でファイルIDの設定は必須の内容です。
ポイント3 タイムアウトは-wオプションで設定
送信タイムアウト(wait)は必須ではないです。
オプションを付けない場合はHulftのシステム動作環境設定のソケットリードタイムアウトの値が参照されます。デフォルトは3600秒になっており、長いのでバッチ側で5分に設定しています。
2023/2/7 追記
タイムアウト時間を超過するとファイル未送信でエラーになると思っていましたが違っていました。
どうやら設定した時間を超過すると強制的にコマンドの状態を取得してエラーになるが、送信処理はそのまま継続されるみたいです。(以下参照)
バッチ自体は5分でタイムアウトしていますが、バックグラウンドでは送信処理は継続されておりファイルが送信されていたケースがありました。
この場合、バッチのリターンコードは9でHulftエラーコード:58 utlsend: TimeOut(58)でエラーとなりますが、ファイル自体は正しく送信されている状態になります。
試していないのでわかりませんが、ファイルの送信処理自体はシステム動作環境設定のソケットリードタイムアウト値まで待って応答がない場合は通信異常として切断するようです。
(検証していないので自信はないですが・・・)
バッチではエラーなので再送をするとデータが重複してしまうので気を付けたほうがいいですね!
まとめ
- 配信コマンドはutlsendコマンドを使う。
- -syncオプションをつけることで相手先に正しく送信されたことが保証される。
- HulftのファイルIDの設定は必須
コメント
ののさん
ご質問ありがとうございます。
質問内容を消してしまいすいません。
本文を上書きしてしまいました。
設定は-w 300というオプションを入れていました。
公式サイトを確認すると、
https://www.hulft.com/help/ja-jp/HULFT-V8/WIN-ADM/Content/HULFT_ADM/Caution/timeout_synchronous.htm
・送信要求コマンドはタイムアウトで終了しますが、その後ファイル転送は継続します。
となっているのでutlsendはタイムアウトしたがHulftは処理を継続した形になっているようです。
※正常終了というのは語弊がありますね。すいません。バッチは異常終了したがデータは正しく送信されたが正しいです。直しておきます。
リターンコードは、バッチの仕様上9で返りますがエラー内容はHulftエラーコード:58 utlsend: TimeOut(58)となっております。
ちなみにタイムアウトを設定しない場合はシステム動作環境設定のソケットリードタイムアウト値まで待つみたいです。
以上よろしくお願いいたします