引き蘢りのヒッキー生活が続いている。いやぁ…こんなに纏まった時間、昼夜構わず誰にも文句言われずに研究に没頭出来るのは超楽しい! 有りがたや〜。
今日は久々に長々としたDOSのバッチファイルを書いた。プログラム(と言える程のモノじゃないが)を書いていると独り言が多くてイカン(苦笑)でも、完璧に動いたので超嬉しい。
今日作ったのは、日本で録画したデータを、録画終了後に自動的にエンコードして、その後上海側のFTPサーバに自動アップロードするバッチファイルである。ハマったのはエラー時のリトライ処理と同時並列処理かな。DOSのバッチファイルは基本的にDOS時代のインタプリタなので、並列処理させるには工夫が必要なのだ。
また、"ftp -s"でスクリプトを読ませるためには、まずアップロードするべきファイル名の入ったスクリプトを喰わせなければイケナイので、コレも引数から引っ張って来て自動的に作る様にした。
でも困ったのはエラー処理である、なんとMSのFTPは、回線切断等のエラーが発生したとしても、ERRORLEVELには 0を返して来るのだ!! なんという酷い仕様。 それ故にエラーレベルだけでは条件分岐ができない。仕方なく、リダイレクタでログを出して、それをFIND文で参照して"226 Transfer OK"が無ければエラーと判断してリトライに入らせる様にした。find文のエラーレベルで分岐する。コレで解決!
ftp -s:%ftpbat%>>%path_log%\%dates%~%times%.log
find "226 Transfer OK" %path_log%\%dates%~%times%.log >NUL
if %ERRORLEVEL% == 0 goto SUCCESS
move D:\EncodeTemp\%1 D:\EncodeTemp\retry\
goto END
最後に下らないミスだが、午前0時過ぎにしか発生しないエラーに頭を抱えた。実はログを取るのに、日付と時間を利用するため、%DATE%からスラッシュを、%TIME%からコロンを取った形にしてファイル名としていたのだが、ナント午前0時から午前9時までは、TIMEの一桁目にスペースが入って来るのだ。コレに気付かずに、引数がメチャメチャになってしまい暫く頭を抱えた。結局下記で解決。
set dates=%DATE:/=-% (スラッシュをハイフンに)
set times=%TIME::=_% (コロンをアンダーバーに)
set times=%times:.=-% (ドットをハイフンに)
set times=%times: =0% (そしてスペースがあったら0に!ココ大事!)
あと、最近はスペースが入ったファイル名が多いので、引数で渡すファイル名はダブルクォーテーションが2重にならない様に注意が必要かな。