フォルダー内のexeファイルが起動しているか確認する

Command

ヘルプデスク的なこともしていますので、日々日頃いろいろな問い合わせが来ますが、人によって思わぬ回答や操作をしてくれます。少しでも楽にするために作成したbatファイルの1つです。

概要

指定したフォルダー内の実行ファイルが起動しているか確認し、それぞれに対する処理を行うbatファイルになります。

サンプルコード

@echo off

setlocal enabledelayedexpansion

rem tempフォルダー内に保存された実行ファイルの起動状況を確認する

cd c:\temp

for %%a in (*.exe) do (
  set program=!program! %%a

)

tasklist | findstr "%program%" > NUL
if !ERRORLEVEL! == 0 (
  
  goto isrunning

) else (
  
  goto isnotrunning
)


:isrunning
echo 対象の実行ファイルが起動しています。

goto finalize

:isnotrunning
echo 何も起動されていません。

goto finalize

rem finalize
:finalize

endlocal

pause

詳細

それぞれの処理についてですが

まずは、エラー判定でERRORLEVELを利用したり、フォルダー内のファイル名を結合したりしたいため、遅延環境変数の展開を利用するための処理を行います。それと有効範囲を決めるために対となる「endlocal」を記入します。

setlocal enabledelayedexpansion

rem 遅延環境変数の展開が必要な処理

endlocal

フォルダーのファイル名を結合する際に、通常「%」で囲むところ「!」で囲みます。
これで、for文で繰り返しながらフォルダー内のファイル名を結合していくことが出来ます。
バッチファイルにおける変数が値に置き換わるルールにより、「%」で囲んだ際は繰り返し途中の「set program=%program% %%a」は反映されず、最後のファイル名の表示されます。
詳しくは「環境変数の即時展開」や「遅延環境変数の展開」で調べるとより詳しく理解できるかと思います。

for %%a in (*.exe) do (
  set program=!program! %%a

)

「tasklist」で実行中のプロセスの一覧を取得し、「findstr “%program%”」で上記の処理で取得した実行ファイル名の一覧に実行中のプロセスが存在するか名称で検索しています。
「|」はコマンドで出力された内容を次のコマンドに橋渡しするために利用されるコマンドです。
gotoでそれぞれのラベルの位置に制御を移していますので、それぞれのラベルに必要な処理を書きます。

tasklist | findstr "%program%" > NUL
if !ERRORLEVEL! == 0 (
  
  goto isrunning

) else (
  
  goto isnotrunning
)

おすすめ書籍

どこでもインターネットで調べることができますが、社内のセキュリティーポリシーでインターネットを利用できない場所で作業することもありますし、ネットワークトラブルで使用できないこともありますので、買って損はしない一冊です。

Windowsコマンドプロンプトポケットリファレンス
Windows PowerShell ポケットリファレンス

おわりに

利用ケースは限定的かもしれませんが、実行ファイルを起動したタイミングを取得したり、実行ファイルを上書きする処理の事前チェックに使用したり出来ます。
記述を変更すれば、禁止リストに含まれる実行ファイルの利用状況を取得することも出来ると思います。


タイトルとURLをコピーしました