背景
ある常駐型プログラムをPC起動時(ログイン時)に起動させたい。
しかし、その常駐プログラムは最初にとあるWebサーバにログインが必要である。
スタートアップでの起動時、まだPCがネットワークに接続できていない場合、ログインが失敗しエラーとなる。その場合は手動でログインが必要となる(めんどくさい)
前提
- Windows7マシンである
解決策
タスクスケジューラにて「任意のユーザログイン後、○分後にプログラムを遅延実行する」というタスクを作成した。
結果、PCが起動し、ネットワーク接続も完了した頃にタスクが起動し、ログインエラーが発生することもなくなった。
気になった点
ここからは自己満足の領域。
作成したタスクスケジューラの常駐プログラム起動タスクの状態が「実行中」となったままになっている。
理屈はわかる。指定された常駐プログラムを起動させているわけだから、実行中なのは当然だ。
おそらく、このままでも特に問題は無いと考える。
しかし、私がやりたかったのは、「指定の常駐プログラムを起動させた後、しめやかに終了するタスク」の実行だった。
なので、タスクの状態は、常駐プログラムを起動させた後終了し、次回実行を待つ「準備完了」の状態であるべきだと考えた。
やったこと
結論として、以下の様なbatファイルを作成し、前述のタスクで起動するプログラムと置き換えた。
start ”” ”起動したい常駐プログラムのパス”
上記のコマンド引数を見て、「なんで第一引数に空白文字列なんかわたしてんの?」という疑問を持つ人は多いと思う。もっともな感想だと思う。
実際は、上記batファイル実行時に一瞬コマンドプロンプトが表示されるのが煩わしいため、
上記batをさらにvbsファイルで非表示で呼び出して実行しているのだがそれは割愛する。
つまずいたこと
通常、コマンドプロンプトのstartコマンドは通常第一引数を実行すべきプログラムパスと評価するのだが、
””(ダブルコーテーション)で囲まれた引数が第一引数として渡された場合、それをstartコマンドで起動するプログラムのタイトルとして評価する
という仕様がある。少なくともWindows7に搭載されているstartコマンドには。
そのため、「Program Files」など空白の入ったプログラムを実行するため、””で囲ったパスを第一引数として渡してしまった場合、そのパス名がタイトルとなったコマンドプロンプトが立ち上がるという悲しい結果となってしまう。
それを防ぐために、空白の第一引数が必要になる。
学んだこと
- 常駐プログラムはその処理内容によってはスタートアップではなくタスクスケジューラで遅延実行するほうがいいこともある
- startコマンドを使用する際には第一引数に気をつけること