コマンドプロンプトで,PATH上のファイルの位置を検索する方法 (Vistaの where コマンドをXPで)
Windows Vistaでは,where コマンドでファイルの位置を検索できる。
Windowsでwhich的なこと
http://d.hatena.ne.jp/iakio/20081219/1229691174
Windows XPの場合は,dir /s /b *.txt のようにすれば,カレントディレクトリ以下の全フォルダを再帰的に検索できる。
しかし where のように,PATH上のファイルを検索するコマンドはない。
コンソールから taskmgr と打ち込んだとき,その実行ファイルがどこのフォルダにあるのか,直接わからないのだ。
以下は,XPで where コマンドと同じことを実現する方法。
(1)forコマンドを応用する
コマンドラインで,
for %V in (taskmgr.exe) do @echo %~$PATH:V
と打ちこむ。すると
C:\WINDOWS\system32\taskmgr.exe
のような出力が返るはずだ。
通常,for文中で %V は「ファイル名」を表す。
更に詳しい使い方を調べるために,forのヘルプを
for /?
で閲覧してみると,%~$PATH:V という表現により「PATH上で検索して最初に発見されたファイル名」を表す事が出来る。
%~$PATH:I - PATH 環境変数に指定されているディレクトリを
検索し、最初に見つかった完全修飾名に %I を
展開します。
環境変数名が定義されていない場合、または検索
してもファイルが見つからなかった場合は、この
修飾子を指定すると空の文字列に展開されます。
%~dp$PATH:I - PATH 環境変数に指定されているディレクトリを
検索して %I を探し、最初に見つかったファイル
のドライブ文字とパスだけに展開します。
この記法の具体的な使い方は,極めて調べづらい。
%~$ という記号列をGoogleが受け付けてくれないためだ。
ちなみに、パーセント・チルダ・ダラーという順の並びは「パンチだ!」と覚える。
(2)WSH等で実装する
上記の方法はちょっとマニアックなので,代替案として,WSHで where コマンドのバッチを実装してしまう事にする。
下記は JScript のソース。(where.js)
/* PATH上にある実行可能ファイルの所在フォルダを調べるスクリプト Windows Vistaの where コマンドと大体同じ。 使い方 cscript.exe where.js 探したいファイル名 例 cscript.exe where.js taskmgr 実行結果 C:\WINDOWS\system32 */ // 引数はあるか var args = WScript.Arguments; if( args.length < 1 ) { WScript.Echo("引数がありません。"); WScript.Quit(); } var filename = args.Unnamed(0); // PATH取得 var ws = WScript.CreateObject("WScript.Shell"); var proc = ws.Exec("echo %PATH%"); var res = proc.StdOut.ReadAll().split(";"); // PATHごとに調査 var fso = WScript.CreateObject("Scripting.FileSystemObject"); var o = WScript.StdOut; for( var i = 0, len = res.length; i < len; i ++ ) { var dirname = res[i]; // 現存するフォルダ名か if( ! fso.FolderExists( dirname ) ) { continue; } else { // カレントディレクトリを移動 ws.CurrentDirectory = dirname; } // このフォルダ上に存在するか if( fso.FileExists( filename ) || fso.FileExists( filename + ".exe" ) || fso.FileExists( filename + ".bat" ) ) { //WScript.Echo( dirname ); o.WriteLine( dirname ); // http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh11/cformwsh11_01.html } } o.Close();
コード概説:
- 環境変数PATHを取得し,;で分割し,各フォルダ上でファイルを検索している。
- ファイル存在判定は FileSystemObject の FileExists で行なうが,この際のカレントディレクトリの移動は,WScript.Shell のCurrentDirectory で行なう。
- コンソールに標準出力で書き出したい場合は,WScript.StdOut を使う。
これで,コマンドラインから
cscript.exe where.js java
のように打ちこむと,
Microsoft (R) Windows Script Host Version 5.7 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. C:\WINDOWS\system32 D:\dev\jdk1.6.0_10\bin
のように,PATH上の実行可能ファイルの所在地が一覧表示される。