スポンサーリンク

コマンドプロンプトで,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上の実行可能ファイルの所在地が一覧表示される。