treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

VBSを使わずに画面非表示のバッチファイル連続実行(タスクスケジューラ編)

前回「VBSを使わずに画面非表示のバッチファイル連続実行(最小化実行編)」で用意したバッチファイルを使って今回はタスクスケジューラの動きを使ってVBSに頼らない画面非表示でのバッチファイル連続実行を試しました。いままで意識せずに使っていたオプションに新しい発見がありました。

タスクスケジューラに配置する

自動実行されるようタスクスケジューラに設定していきます。

以下がタスクスケジューラ画面です。

タスク名を入力して、

トリガーとなるタイミングを選択します。今回は「ログオン時」に自動実行するタスクです。

バッチファイルを指定するために、「プログラムの開始」を選択。

実行するプログラムには、最小化起動を仕込んだtest.batをフルパスで指定します。

最後に完了してタスクのプロパティ画面を開きます。

プロパティ画面で、

「ユーザがログオンしているかどうかにかかわらず実行する」と
「最上位の特権で実行する」
を追加で設定します。

トリガーはPCユーザを指定して、ユーザのログオン時に実行されるようにします。

ここまででタスクスケジューラの設定は完了です。

サインインしてみる

ここまで完了したところで、実際にサインインしてみると、ダブルクリックでは最小化だったtest.batは、画面非表示で実行されまったく画面に表示されなくなりました。

ん?

まったく画面が表示されないというのはなぜ?と考えて、タスクスケジューラで設定すると、そういやバックグラウンド実行になってコンソール表示がされなくなるという動きになることを思い出しました。(Windows Serverでは桜時計のような一部フリーソフトをバックグラウンド動作にして運用していましたがWindows10ではやったことなかった。)

つまり、タスクスケジューラのセキュリティオプションで、

 

 

この「ユーザがログオンしているかどうかにかかわらず実行する」を指定していると、バックグラウンド実行になり一切動作画面が表示されなくなります。
逆に「ユーザがログオンしているときのみ実行する」を指定していると、フォアグラウンド実行となり、画面上に実行画面が表示されます。

実行については、「ユーザがログオンしているかどうかにかかわらず実行する」を選択していたとしても「トリガー」タブで選択した「ユーザ %USERNAME% のログオン時」を指定している限りは、ログオン時にしか実行されません。つまり前述のオプションは(今回のような設定で使う限りは)フォアグラウンド実行かバックグラウンド実行かを選択するだけのオプションと言うことになります。

と、いうことは、バッチファイルの起動時最小化実行を仕掛けなくても、最初からタスクスケジューラの設定で、上記のオプションを指定しておけば画面非表示でバッチファイルを実行することは可能だったということになります。ちょっとやらなくて良い努力をしちゃった感じ。

ともかく、これで、タスクスケジューラを使う限りは画面非表示でバッチファイルを実行できることが分かりました。
Windows10以降のタスクスケジューラでは、まれにバグを出してしまうこともありますので、最小化実行のステップも残しておくようにします。もしバックグラウンド実行でも画面表示が何かしら出るようになっても、最小化実行の恩恵があるように、という備えです。

※注意事項:
この方法でバックグラウンド実行したバッチファイルは操作が必要なコマンドが実行された場合、終了せずプロセスが残ったままになります。このため、事前に入念なテストで自動実行後に必ず終了するようにバッチファイルを構成する必要があります。

VBScript終了に備える

ここまでで、VBScriptを使わずにタスクスケジューラの力を使ってバッチファイル単体で画面非表示実行を実施するまでの動作確認が出来ました。本番のバッチファイルと置き換えて動作確認出来ればリプレイスしても良いかなと思っています。

ただ、もう一つ気になっているのはPowerShellでもオプション「-WindowStyle Hidden」によって画面非表示での実行が出来るということなので、これも検証してみたいと思います。