treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

コマンドでWindows内のファイルを探す=whereコマンド

ファイルの検索はエクスプローラの検索窓から実施するのが当たり前となってかなり経ちますが、コマンドプロンプト内でもファイルの検索ができるのでそのやり方をご報告です。

ファイルの検索

ファイルの検索はWindows Vista以降エクスプローラに統合されて、画面右上にある検索窓にカーソルを移動(キーボードのF3キー押下で検索窓に移動できる)して検索文字列を入力するだけで、開いているフォルダ内の検索を実行してくれます。

通常検索はこちらを使うのが王道ですが、今回はコマンドプロンプト経由でファイルの検索をやってみることにします。

whereコマンド

コマンドプロンプトでファイルの検索を実行する時にはwhereコマンドを使います。

オプションを「where /?」で調べてみました。

  • /R
    ディレクトリ(フォルダ)指定をするときに使うオプション。
    「/R %フォルダパス%」と指定します。
  • /Q
    検索条件に一致した場合の標準出力(ファイル名のフルパスを画面に表示)を表示せず、終了コードを返すようになるオプション。(バッチで使えそう?)
    終了コード:成功はERRORLEVEL=0、成功しなかった(たぶん見つからなかった)がERRORLEVEL=1、失敗やエラーが発生した時はERRORLEVEL=2を返す
  • /F
    検索条件に一致した(発見した)ファイル名の画面出力を、""(二重引用符)で囲んで画面に出力してくれます。(バッチファイルで使いそう?)
  • /T
    検索条件に一致したファイルの情報を標準のフルパスファイル名表示に加えて、ファイルサイズ(バイト数)とファイルのタイムスタンプといった情報を付加して画面に表示します。

簡単に使ってみる

実際にファイルをコマンドプロンプトから検索してみます。

外部コマンドであるpingコマンドのバイナリが格納されている場所を探してみるという例です。


--------------------------------------------------------------
C:\Users\testuser>where ping
C:\Windows\System32\PING.EXE

C:\Users\testuser>where /R c:\Windows\System32 ping
c:\Windows\System32\PING.EXE

C:\Users\testuser>where /R c:\Windows\System32 /F ping
"c:\Windows\System32\PING.EXE"
--------------------------------------------------------------

三パターンでやってみました。パスを指定せず、単純にwhereコマンドに続けて検索文字列である「ping」を指定した例と、パス<c:\Windows\System32>を「/R」オプションで指定して文字列「ping」を検索した例、最後はこれに加えて「/F」オプションを付加して出力に二重引用符を付けてみる、という検索方法です。

いずれも<c:\Windows\System32\PING.EXE>という同じ結果が画面に出力されました。
最初はパスを指定しないとカレントディレクトリが補完されるのかなと思っていたのですが、どうもそういうわけではないようです。

パスの指定有無を試してみる

試しに、ユーザプロファイル内のドキュメントフォルダにカレントディレクトリを移動して、


--------------------------------------------------------------
C:\Users\testuser\Documents>where *.xlsx
情報: 与えられたパターンのファイルが見つかりませんでした。
--------------------------------------------------------------

このように検索してみたのですが、カレントディレクトリじゃないみたいです。試しに*.txtで検索してみると、


--------------------------------------------------------------
C:\Users\testuser\Documents>where *.txt
C:\Windows\System32\ThirdPartyNoticesBySHS.txt
C:\Windows\System32\WindowsCodecsRaw.txt
--------------------------------------------------------------
(環境変数PATHで)パスを切っている箇所についてだけを検索対象としているような動きをします。なので、元々外部コマンド実行のためにWindows標準でパスが切られているc:\Windows\System32配下も特にしていなく検索してくれたものと考えられます。

実際、ユーザプロファイル内のドキュメントフォルダにパスが通っていれば、


--------------------------------------------------------------
C:\Users\testuser\Documents>where *.xlsx
C:\Users\testuser\Documents\IPAddress.xlsx
--------------------------------------------------------------
こんな風にちゃんと検索結果としてドキュメントフォルダ内のファイルを検出してくれました。

試しに「/R」オプションでカレントディレクトリを意味する「.\」を指定して試してみると、

--------------------------------------------------------------
C:\Users\testuser\Documents>where /R .\ *.xlsx
C:\Users\testuser\Documents\hoge\Code\Key_2013527.xlsx
C:\Users\testuser\Documents\hoge\Code\Key130528.xlsx
C:\Users\testuser\Documents\hoge\test\hoge.xlsx
C:\Users\testuser\Documents\hoge\test\hoge_2.xlsx
C:\Users\testuser\Documents\hoge\電話アドレス帳\アドレス用.xlsx
(以下略)
--------------------------------------------------------------

このように、ドキュメントフォルダ配下のExcelファイル(*.xlsxに該当するファイル)を一覧で表示してくれることを確認しました。

エラーレベルの確認を試してみる

「/Q」オプションを使うとエラーレベルだけを返してくれるので、バッチファイルで判定に使えそうな気がします。
簡単なバッチファイルを作成して動作を確認してみました。

--------------------------------------------------------------
where-test.bat
--------------------------------------------------------------
@echo off

where /Q pingu
echo エラーレベルは%ERRORLEVEL%でした。pinguは見つかりませんでした。
if %ERRORLEVEL% == 0 goto end
if %ERRORLEVEL% == 1 goto NXT
if %ERRORLEVEL% == 2 goto NXT

:NXT
where /Q ping
echo エラーレベルは%ERRORLEVEL%でした。pingは見つかります。
if %ERRORLEVEL% == 0 goto end
if %ERRORLEVEL% == 1 goto end
if %ERRORLEVEL% == 2 goto end

:end
echo whereコマンドの確認を終了します。
--------------------------------------------------------------

バッチ自体は簡単なものです。存在しないファイルの検索でどのエラーレベルが返ってくるか、正常なファイルを検索するとどんなエラーレベルを返してくるかを画面に出力するだけです。

実行した結果は、


このように、存在しないファイルに対してはERRORLEVEL=1、存在するファイル(発見した=正常終了)はERRORLEVEL=0を返してくれることが分かりました。
ただ、失敗とかエラーのときのERRORLEVEL=2はどうやったらいいか分からず結局やっていません。

このような感じで、whereコマンド、コマンドプロンプト上でファイル検索ができるコマンドを試してみました。ファイルの存在確認の際に検索範囲だけ指定してファイルを捜索し存在確認を実施、なんてこともできるかも。必要になったときのために覚えておこうと思います。