0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsで実行コマンドのフルパスを表示するバッチファイルをささっと作る

Last updated at Posted at 2024-08-11

はじめに

UNIX では実行コマンドの置き場所を環境変数 PATH を辿って検索してくれる WHICH コマンドというものがある。これが Windows でも欲しいという話である。

実装コード

実装コードを以下に示す。

拡張子が指定されている場合は FOR コマンドの機能を使えば一発である。拡張子が指定されていない場合(たいていの場合はコチラのほうだろうが)環境変数 PATHEXT に登録された拡張子を一つずつ試していく。環境変数 PATHEXT.COM;.EXE;.BAT;.CMD のようにセミコロンで区切られた文字列であるが,FOR コマンドではセミコロンを区切り文字と認識してくれるので,そのまま FOR コマンドに引き渡せばループ変数 %%J に拡張子が代入されるので,一つずつ試していけばよい。

WHICH.CMD
@echo off
setlocal enabledelayedexpansion
if "%~1"=="" goto USAGE
if "%~x1"=="" (
  for %%J in ( %PATHEXT% ) do (
    for %%I in ( "%~1%%J" ) do set RESULT=%%~$PATH:I
    if defined RESULT echo !RESULT!
  )
) else (
  for %%I in ( "%~1" ) do set RESULT=%%~$PATH:I
  if defined RESULT echo !RESULT!
)
exit /b
:USAGE
echo パスを検索してコマンドのフルパスを返します。
echo.
echo WHICH(.CMD) [コマンド(.拡張子)]
echo.
echo 拡張子の指定を省略すると環境変数 PATHEXT を順に検索します。
exit /b

実行例

引数なしで実行するとヘルプメッセージを表示する。

引数なしで実行した場合
c:\>which
パスを検索してコマンドのフルパスを返します。

WHICH(.CMD) [コマンド(.拡張子)]

拡張子の指定を省略すると環境変数 PATHEXT を順に検索します。

コマンドが見つかるとフルパス名を出力する。

コマンドが見つかったとき
c:\>which sort
C:\Windows\System32\sort.exe

コマンドが見つからなかったときは何も出力されない。なお,コマンドプロンプト CMD.EXE の内部コマンドは検索の対象外である。

コマンドが見つからなかったとき
c:\>which dir

まとめ

実は Windows Vista 以降,WHERE というコマンドが追加されたので,わざわざ自作する必要はなくなっている。WHERE コマンドは自作の WHICH コマンドと同等以上の機能を持つので普通の人は WHERE コマンドを使ったほうがよいだろう。

WHEREコマンドのヘルプメッセージ(Windows10 22H2 の場合)
c:\>where /?

WHERE [/R ディレクトリ] [/Q] [/F] [/T] パターン...

説明:
    検索パターンに一致するファイルの場所を表示します。
    既定では、現在のディレクトリおよび PATH 環境変数によって指定された
    パス内を検索します。

パラメーター一覧:
    /R       指定したパターンに一致するファイルを、指定したディレクトリから
             開始して再帰的に検索し表示します。

    /Q       一致したファイルの一覧を表示せずに、終了コード
             のみを返します (Quiet モード)。

    /F       一致したファイル名を二重引用符内に表示します。

    /T       一致したすべてのファイルのサイズ、最終変更日および時刻を
             表示します。

    パターン ファイルの検索パターンを指定します。パターンには
             ワイルドカードである * および ? を使用することができます。
             "$env:pattern" や "path:pattern" 形式で指定する
             こともできます。"env" は環境変数で、"env" 環境
             変数で指定されたパスで検索が行われます。これら
             の形式は /R スイッチと同時には使用できません。
             パターンに PATHEXT 変数の拡張子を追記して
             検索を実行することもできます。

     /?      このヘルプを表示します。

  注意: このツールは、検索に成功するとエラー レベル 0 を、
        成功しなかった場合は 1 を、失敗またはエラーの場合は
        2 を返します。

例:
    WHERE /?
    WHERE myfilename1 myfile????.*
    WHERE $windir:*.*
    WHERE /R c:\windows *.exe *.dll *.bat
    WHERE /Q ??.???
    WHERE "c:\windows;c:\windows\system32:*.dll"
    WHERE /F /T *.dll

デフォルトの動作では環境変数 PATH を検索するので,拙作の WHICH コマンドと同じである。

WHEREコマンドの実行例
c:\>where where
C:\Windows\System32\where.exe

ただし,自作の WHICH コマンドは WHERE コマンドよりも小気味よく動いてくれるのが唯一の慰めである。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?