Programming Field

Where - DOS コマンド一覧

スポンサーリンク

[Windows Vista?以降] パターンに一致するファイルの場所を出力します。

構文

where[.exe] [/F] [/Q] [/T] [/R <directory>] <patterns>...
/F
ファイル名を出力する際、ダブルクオーテーション「" "」でその名前を括ります。
/Q
ファイル名を出力しません。バッチファイルなどで終了コードのみが欲しい場合に利用します。
/T
ファイル名を出力する際、ファイルサイズと最終更新日時(日付と時刻)をその手前に出力します。
/R <directory>
ファイルを検索するディレクトリを指定します。このオプションを使用した場合は環境変数PATHは使用されず、指定したディレクトリおよびサブディレクトリの中からファイルを検索します。
/R オプションを用いる場合、パターン指定ではファイル名のみを指定することができます。
<patterns>...
検索するファイル名のパターンを指定します。指定方法は以下の3通りあり、スペース区切りで同じパターンまたは異なるパターンを複数指定することができます。
なお、ファイルを検索する際は環境変数PATHEXTに含まれる拡張子も用いられ、これらが付加されたパターンに一致するファイルが見つかった場合それも結果に含まれます。
<filename>
ファイル名を指定します。ワイルドカードが使用でき、パターンに一致する名前を持つファイル名が検索されます。/R オプションを指定しない場合はカレントディレクトリ環境変数PATHが検索対象のディレクトリとして用いられます。
<path>:<filename>
パス名と「:」文字、ファイル名をつなげて指定します。<path> の直下にあるファイルが検索されます。<path> にはセミコロン「;」区切りで複数のパスを指定することができ、相対パスも使用することができます。ファイル名の指定方法は最初のパターンと同じです。
※ 「C::file.ext」という指定はCドライブにおけるカレントディレクトリを用いることを意味します。一方「C:file.ext」という指定は「C」というディレクトリを検索することを意味します。
$env-name:<filename>
「$」文字と環境変数の名前、「:」文字、そしてファイル名をつなげて指定します。ファイル名の指定方法は最初のパターンと同じです。環境変数に含まれる文字列を2番目のパターンにおける <path> 指定と見なしてファイルを検索します。ファイル名の指定方法は最初のパターンと同じです。
※ 「$PATH:*.ext」という指定は「*.ext」という指定と似ていますが、「$PATH:」を指定した場合はカレントディレクトリが検索対象に含まれません。

解説

このプログラムは、主にファイル名が環境変数PATHおよびPATHEXTによって補完される場合にどのファイルを指すかを調べる際に用いられます。Linux系における「which」と似ていますが、「常に複数のファイル名を出力する」「ワイルドカードが使用できる」という点で異なります。

Whereは以下の終了コードを返します。If Errorlevelを用いて結果に基づく分岐処理を記述することができます。

終了コード意味
0ファイルが1つ以上見つかった
1ファイルが1つも見つからなかった
2エラーが発生した(オプションが誤っている場合など)

※ 検索パターンが複数指定されている場合、いずれかのパターンでヒットするファイルが見つからなかった場合メッセージが出力されますが、他のパターンでファイルが見つかった場合は終了コードが 0 になります。

なお、ファイルが見つかった場合のファイル名(/T オプションがあればそのサイズなども含む)は標準出力に、見つからなかった場合やエラーが発生した場合のメッセージは標準エラー出力に出力されます。

サンプル1

where /T /R D:\MyDocs yume_memo.txt

ファイル名「yume_memo.txt」に一致するファイルを「D:\MyDocs」直下および各サブディレクトリから検索し、その結果を画面に出力します。出力の際、最終更新日時などの情報も合わせて出力します。

サンプル2

where P:\Bin:conv*.exe Q:\Bin:conv*.exe 2> NUL

ファイル名パターン「conv*.exe」に一致するファイルを「P:\Bin」直下および「Q:\Bin」直下から検索します。見つからなかった場合のメッセージはリダイレクションによって非表示にしています。

サンプル3

set "MYDIRS=D:\Scripts;E:\All Data\Commands"
where $MYDIRS:post_exec

ファイル名「post_exec」に一致するファイルを「D:\Scripts」直下および「E:\All Data\Commands」直下から検索します。複数のディレクトリを検索対象にするために一旦環境変数にそれらを指定しています。

サンプル4 (バッチファイル)

setlocal enabledelayedexpansion
set FIND_EXE=
set PATHEXT=
for /f "delims=" %%F in ('where find.exe 2^> NUL') do (
    if "!FIND_EXE!"=="" set "FIND_EXE=%%~fF"
)

[拡張構文] 「find.exe」をカレントディレクトリおよび環境変数PATHから検索し、最初に見つかったファイルのフルパスを環境変数「FIND_EXE」にセットしています。3行目では「find.exe.exe」などがヒットしないようにPATHEXTを打ち消し、5行目では2つ以上ヒットすることに備えて最初にヒットしたファイル名のみが「FIND_EXE」にセットされるようにIfでチェックしています。なお、「( )」内で環境変数を用いるため「!」を使用しており、それを有効化するため1行目でSetlocalを実行しています。