batファイルを最小化で自動起動させる意味ってどんな?
こんにちわスピカです。
Windows上でスクリプトを組む時役に立つのがデフォルトで含まているPowershellやVbスクリプト、そしてbatファイル。
この中でDOSの頃からなじみ深いのがbatファイル。
でこのbatファイル、GUIをメインで使っているとあまり使うこともないが、ちょっとしたことをスクリプトとまで言わないまでも、コマンドを羅列しながら実行させるには私にとってPowershellよりわかりやすい。
ただ単にPowershellを使ったことがないだけかもしれませんが。
お手軽で便利ばBatファイルですが、唯一気に入らないことがある。それは起動時にDOS窓が開くこと。
batファイルは今現在では古典的な部類に入るスクリプトだと思います。マイクロソフトもコマンドプロンプトからPowershellへ事実上移行していますし。
出来ることが段違い。やはり寄る年波には勝てない・・・((+_+))
そもそもbatってなに・・
私もあまり疑問には思わなかったのですが、Batファイルシステムって聞いて??って思う人もいるかもしれません。
batファイルを簡単に説明
そもそもこのbatファイルというのはDOS時代にコマンドの連続的な実行を目的として作られたシステムです。
有名なのがautoexe.bat。DOSの時代、システムを起動させるとまあこのころはフロッピーディスクでの起動がほとんどだったため、フロッピードライブに5インチのシステムの入ったフロッピーディスクを入れPCのスイッチを入れると
カチカチ言いながらフロッピードライブが動き出す。そしてまずio.sysとmsdos.sysというファイルと読み込む。
その後、環境ファイルと称されるconfig.sysを読み込み、最後このautoexe.batを読み込みシステムの起動が完了する。
この最後のautoexe.batに例えば一太郎とかLotus1-2-3の起動ファイル名を記述することで自動で一太郎やLotus1-2-3が起動した。
今でいえばスタートアップというやつかな。
あのころはシングルタスクであり当然ウインドウなんて洒落たオブジェクトは存在していなかった。
batファイルはコマンドを集約して実行させるスクリプトファイル。
でした。だからDOSの時代からWindowsの時代になってもPowershellよりもコマンドプロンプトのほうがなじみ深いのかもしれません。
batファイルはDOS窓を必ず表示してしまう。
そんなこんなのbatファイルですが現在はDOSプロンプトと呼ばずコマンドプロンプトと名称も変わり。Windowsの中でとりあえず生き延びています。
ただ昔からの名残でしょうか、batファイルを作成して実行させると必ずDOS窓が開いてしまう。
なんとかDOS窓を開かなく実行させる方法はないかネットを徘徊したところ、いくつか手法が見つかった。
そんな中でもお手軽なのがショートカットで最小化表示させることで実現可能とのこと。
実際やってみると見事に表示されなかった。さすがDOS窓、これで使えるぞと息巻いたのもつかの間。
タスクスケジューラではショートカットの登録は不可
じゃあ、作ったbatファイルを自動起動させようとタスクスケジューラを立ち上げて新規にスケジュールを作成したところ、出来ない。
ショートカットは登録できないのである。
しまった・・・。やっちもーた。
ショートカットがだめなら別の方法を
ということでまた模索。数週間が過ぎた。・・・
たしかにPowershellやVBスクリプトで作れば出来るのではあるが、なんかくやしい。年寄りの妬み、執着心、いや信念である。
今回例として作っているのがこれ、
set service_name=FDResPub
net stop %service_name%
net start %service_name%
ネットワークに自分のアイコンが表示されない。これを表示させるためには「FDResPub」というサービスを再起動すればよいことがわかっている。
batファイルで再起動させるコマンドが上記3行。
これを実行するためには管理者権限が必要であるため、通常起動させるとユーザーアカウント制御ダイアログが表示され止まってしまう。
タスクスケジューラで登録して使うには最上位特権モードでこのユーザーアカウント制御ダイアログは出なくなるがDOS窓が開いてしまう。
まあ、DOS窓が開いても数秒程度で自動で閉じるのでそれほど目障りではないのだが、出来れば非表示にしたい。
悪戦苦闘の結果
対して苦労はしていないのだが、とりあえず2種類の方法。
①再帰的にbatファイルを実行
入れ子式にbatファイルを記述することでタスクスケジューラで最小化起動できる。ただ一瞬だがDOS窓が表示される。
ということで参考にさせていただいたのがこれ
出来たBatコードがこれ
if not "%1" == "1" (
start /min cmd /c call "%~f0" 1
exit
)
set service_name=FDResPub
net stop %service_name%
net start %service_name%
説明は上記サイトでしているためあえてここでは詳しく説明しないが、最初の3行で、最小化表示を実行させ、その後下3行を実行する。
②vbスクリプトを使う手法
本当はbat処理にてなんとかしたかったが、今回の目的が完全にDOS窓を非表示化することなので、止むを得ずvbsを利用させていただいた。
vbsコードは
Dim oShell
Set oShell = WScript.CreateObject ("WSCript.shell")
oShell.run "D:\〇〇〇\FDResPub.bat" , 7, true
もちろん〇〇〇はフォルダ名、また「FDResPub.bat」の中身は、
set service_name=FDResPub
net stop %service_name%
net start %service_name%
である。
総 評
今回は、「if not "%1" == "1" (」のファイル名を、FDResPub.vbsとし、FDResPub.batと同一フォルダに置く。
そして、FDResPub.vbsをタスクスケジューラに登録することで、無事DOS窓が表示されないようになった。
ショートカットがタスクスケジューラに登録できればまた違った形になっていたのではと思うが、そうなっていない仕様なのだから仕方ない。
私の記憶では以前のWindowsではタスクスケジューラにショートカットも登録できたような気もしなくもないが、多分記憶違いだろう。
ディスカッション
コメント一覧
非常に興味深い記事です。多くの人がこの記事に興味を持つと思います。