Windowsである特定の時間にプログラムを起動するのに、タスクスケジューラを使用します。
私は、一定期間ごとにバックアップを取るプログラムを作っていますが、問題は作業中であろうが気にせず、このプログラムが時間通りに起動してくれること。
いや、その機能は正しい。全く持って正しい。でも作業中なのです。
■start コマンド
アプリケーションを最小して起動する方法は簡単です。START コマンドを使います。
START コマンドの詳細な書式はこんな感じ。
start ["title"] [/d
ながい…
覚えておいて損がないのは、
/min 最小化して起動する
/max 最大化して起動する
/wait 処理が終了するまで待つ
この3つくらい。
■タスクスケジューラでの cmd.exe start の挙動
start コマンドは、cmd.exe が実現しているので、タスクスケジューラで設定するには、タスクスケジューラの操作タブで、
プログラム : cmd.exe
引数のオプション: /c START /min (目的のバッチファイル)
のように設定します。
※ /c は cmd.exe のパラメータで、引数の実行が完了したら、プログラムを終了するという意味。
こうしておくと、最小化起動してくれます。
だがしかし!
START は新たな cmd.exe を起動するため、この状態だとバッチファイルが終了したあと、コマンドプロンプトが開いたままになってしまうのです。
私の環境だと、バッチファイルの最後に exit (バッチが終了したら、cmd.exe も終了するようにするコマンド)と書いても、コマンドプロンプトが残り続けます。
ネットで色々調べてみたのですが、解決方法がわかりませんでした。
■バッチファイルで最小化起動をする
そこで、バッチファイルに以下のような工夫をしました。
バッチファイルを起動したときに、最初の1回だけは、自分自身を最小化して呼び出す
意味わかります?
これは以下のようなバッチスクリプトで実現しています。
if "%1" == "1" (
SHIFT
START /min cmd.exe /c %~0 %*
EXIT
)
これは第1パラメータが1であるときには、start コマンドで自分自身を最小化状態で起動し、自分自身は終了させてしまうようになっています。
これを、バッチファイルの戦闘に記述しておいてください。
これで、タスクスケジューラには、起動プログラムとして、バッチファイル名を直接記述し、パラメータとして 1 を最初に書いておいて、残りのパラメータを記述します。
たとえば、test.bat を起動するときには、操作タブの編集で、
プログラム/スクリプト : c:\test.bat
引数の追加(オプション) : 1 param1 param2
のように書いておきます。
※ここでは、バッチファイルは C:\ にあって、パラメータとして param1 と param2 を受け取るものとします。
これで、めでたく起動した瞬間に、バッチのウインドウは最小化されます。