背景
NASの所定ディレクトリにエンコード対象のファイルを置き、エンコードサーバがそのフォルダを監視し、ファイルが存在したらエンコードを実施するというタスクをタスクスケジューラで実現しようとしたらハマったはなし。
システム概要
ハマったポイント
- call setではフォルダ内のファイル名が正しく取得できない。👇対応策として、遅延環境変数を使った。
setlocal enabledelayedexpansion :: 入力ディレクトリ set INPUT_DIR=Z:\input :: 出力ディレクトリ set OUTPUT_DIR=Z:\output : for %%F in ("%INPUT_DIR%\*") do ( :: ファイル名と拡張子を分解 set "INPUT_FILE=%%F" set "BASENAME=%%~nF" set "OUTPUT_FILE=%OUTPUT_DIR%\!BASENAME!.mp4" : )
- ネットワークドライブを利用するとき、ローカルで実行するとすでに所定のドライブレターにアサイン済なので問題なく実行できるが、タスクスケジューラ越しだと、そのタイミングでのアサインが必要になる。👇が対応策。
:: ネットワークドライブを解除(エラー無視) net use Z: /delete >nul 2>&1 :: ネットワークドライブを再マウント net use Z: \\network\target_dir /user:username password
- これは単なる間抜けなハマりポイント。
バッチファイルの最後に"pause"を利用すると、タスクスケジューラ経由で実行されたcmd.exeがずっと実行されたまんまになるにも関わらずパフォーマンスモニタのプロセスに存在しない(わからなかっただけ?)になるので、意外となんで処理が終わらないのか理解できずハマってしまった。