【Windows業務効率化】バッチファイルを使って未起動状態のアプリケーションを自動起動する

【Windows業務効率化】バッチファイルを使って未起動状態のアプリケーションを自動起動する

バッチファイルを使って未起動状態のアプリケーションを自動起動する

読者の中には客先あるいは、特定サービスから定期的にメールが送信されることがわかっており、それ以前に必ず Outlook が起動されている状態を担保したい方がいらっしゃるのではないでしょうか。

またVBA等を利用してさらなる業務効率化を図っている方の中にはExcel/Access等のVBAコードの中でOutlookのオブジェクトに直接アクセスし、特定メール、添付ファイルの自動保存を行っている方もいると思います。

通常これらの実行は、Outlookそのものが起動状態にあることを前提とするため、Outlookが未起動状態のときにこういったVBAコードを実行すると例外が発生し、最悪 WindowPCを再起動しないとOutlookが使えなくなる等の問題が発生します。

本記事ではこういった背景から、バッチファイルを使って Outlook のような一般的なアプリケーションが現在 Windows PC内で現在起動中かどうかを確認し、起動されていない場合にこれを起動する方法を紹介します。

バッチファイル

バッチファイルの動作

以下に例として Outlook が現在 Windows PC内で現在起動中かどうかを確認し、起動されていない場合にこれを起動するバッチファイルを記載します。このバッチファイルは

  • 直接ダブルクリックして起動
  • 他のバッチファイルから “call %USERPROFILE%\Tools\bat\CheckAndRun_Outlook.bat“のように呼び出して同期起動
  • タスクスケスケジューラに登録して定期的に自動起動

することで利用します。

ここに %USERPROFILE% は Windows であらかじめ定義されている環境変数で Windows PCを使っている利用者のデフォルトのフォルダパスを表しています。この環境変数については必要に応じて以下の記事を参照下さい。

【Windows業務効率化】バッチファイルの基本テクニックを知ろう

 


@echo off
setlocal

rem スリープタイマ値を設定する
set wait_time=10
 
rem プロセスチェック
tasklist | find "OUTLOOK.EXE" > NUL

if %ERRORLEVEL% == 0 (
  echo "Outlook is running"
  echo %date% %time% : Outlook is running >> %USERPROFILE%\Tools_Data_Logs\bat\CheckAndRun_Outlook.log

) else (
  echo "Start Outlook"
  Start OUTLOOK.EXE
  echo %date% %time% : Outlook is activated from Task Scheduler >> %USERPROFILE%\Tools_Data_Logs\bat\CheckAndRun_Outlook.log

  timeout /t %wait_time% > nul
 
)
endlocal

この バッチファイル CheckAndRun_Outlook.bat  を%USERPROFILE%\Tools\bat 配下に保存して、ダブルクリックするとOutlook の起動状態を確認し、もしOutlookが起動されていない場合、Outlookを起動します。

 

バッチファイルの簡単な説明

行番号 説明
1 バッチファイルの中で出力されるメッセージを非表示にします。
バッチファイルの中で使用する変数がこのバッチファイルの中でのみ有効であると宣言しています。
4,7 rem はバッチファイルの中のコメント行を表しています。
5 set はバッチファイルの中の変数に値を設定します。ここでは19行目で利用する Outlook起動後のタイマーの設定値 wait_time を 10(秒) に設定しています。このタイマー値は自分の環境に合わせて調整してください。
8

tasklist は Windows PCの中で実行中のプロセス名を表示するコマンド、
|‘ は前のコマンドの実行結果を次のコマンドに渡す パイプ とよばれるオペレータ、

find は入力の中の特定文字列の有無を調査するコマンド、
>‘ は前のコマンドの実行結果をファイルに保存するオペレータ、
NUL は廃棄を表す予約語です。
 この find コマンドはまた
実行の結果、指定された文字列が入力中に存在した場合 ERRORLEVEL に 0 を設定し、存在しない場合 1 を設定します。

    10-13

    %ERRORLEVEL% = 0 つまり 8行めの実行結果として Outlook が実行中と判定された場合に実行されるステートメントであり、

    • コマンドプロンプトに “Outlook is running” と出力
    • %USERPROFILE%\Tools_Data_Logs\bat\CheckAndRun_Outlook.log に日付、時間付きで “Outlook is running” と出力

    します。

    14-21

    %ERRORLEVEL% = 1 つまり 8行めの実行結果として Outlook が未起動と判定された場合に実行されるステートメントであり、

    • コマンドプロンプトに “Start Outlook” と出力
    • Outlook を非同期で起動
    • %USERPROFILE%\Tools_Data_Logs\bat\CheckAndRun_Outlook.log に日付、時間付きで “Start Outlook” と出力
    • Windows を10秒間のタイマー待ち(空転)する

    します。

    22 バッチファイルの中で使用した変数がこのバッチファイルの中でのみ有効であることを終了宣言しています。

    tasklist と find コマンド

    理解を助けるため、Windows のコマンドプロンプト上で tasklist と find コマンドを実際に使ってみましょう。

    
    Mirosoft Windows [Version 10.0.19044.2364]
    (c) Microsoft Corporation. All rights reserved.
    
    C:\Users\devel>tasklist
    
    イメージ名                     PID セッション名     セッション# メモリ使用量
    ========================= ======== ================ =========== ============
    System Idle Process              0 Services                   0          8 K
    System                           4 Services                   0      6,784 K
    Registry                       148 Services                   0     68,296 K
    smss.exe                       536 Services                   0        308 K
    csrss.exe                      692 Services                   0      2,996 K
    wininit.exe                    852 Services                   0      1,420 K
    csrss.exe                      860 Console                    1      1,072 K
    
    				:
    
    Microsoft.Photos.exe         21392                            2     67,928 K
    RuntimeBroker.exe             6720                            2     42,080 K
    mmc.exe                      20668 RDP-Tcp#114                3     26,544 K
    OUTLOOK.EXE                  13728 Services                   0     20,892 K
    cmd.exe                      15004 Services                   0      1,804 K
    
    				:
    
    audiodg.exe                  27748 Services                   0     15,940 K
    node.exe                     32464                            2     29,320 K
    tasklist.exe                 24384 RDP-Tcp#114                3      9,236 K
    WmiPrvSE.exe                 35032 Services                   0     10,636 K
    
    C:\Users\devel>tasklist | find "OUTLOOK.EXE"
    OUTLOOK.EXE                  13728 Services                   0     20,484 K
    
    C:\Users\devel>tasklist | find "OUTLOOK.EXE" >NUL
    
    C:\Users\devel>echo %ERRORLEVEL%
    0
    
    C:\Users\devel>

    このコマンドプロンプトの実行結果において

    4行目で実際に tasklist コマンドを実行していますが、この出力の中で

    21行目に “OUTLOOK.EXE” という文字列が出現していますね。

    31行目でこの “OUTLOOK.EXE” という文字列を find コマンドのパラメータにすると

    32行目に見られるように単一のプロセスに対する実行状態を抜き出せるというわけですね。

    34行目でこの結果を非表示にして

    36行目で find コマンドの実行結果 %ERRORLEVEL% を確認すると

    37行目に 0 (つまり成功:文字列あり)が設定されていることがわかるわけです。

    先ほどのバッチファイル CheckAndRun_Outlook.bat はこれらの結果を元に組み立てられているわけですね。

    ここでは Outlook を題材に アプリケーション(プロセス)の実行有無を確認していますが、以上のことを知ればどんなアプリケーション(プロセス)でも理屈は同じなので、読者の方のニーズに合わせてカスタマイズしましょう。

    なお、これらの tasklist 、find コマンドの詳細については以下のサイトにこれらのコマンドを含む詳細なリファレンスがありますので、必要に応じてこちらも参照されることをお勧めします。

    またこのバッチファイルをタスクスケジューラから自動起動するする方法についても必要に応じて

    【Windows業務効率化】バッチファイルをタスクスケジューラから自動起動する

    を参照下さい。

    本記事ではバッチファイルを使って Outlook のような一般的なアプリケーションが現在 Windows PC内で現在起動中かどうかを確認し、起動されていない場合にこれを起動する方法を紹介しました。

    この記事が読者の方のお役にたてれば幸いです。

    【特集】自動化ツールをバッチファイルで統合し 作業をワンクリックで終わらせよう