2024年3月1日 追記
コードを最新にしたものを追記
2019年4月15日 追記
このページは WindowsXP時代に書かれたものなので、現在のWindowsの状況と異なりますのでご注意ください。
なお、Windows Vista以降、whereコマンド(c:\Windows\System32\where.exe)という、which と同じような動作をするコマンドが追加されています。
今のWindowsでは、大文字小文字を混ぜたファイル名は作成したり使用はできるが、
大文字・小文字の区別はない、というのはあまりにも有名な事なんだけど・・・
この仕様は、時に便利で、時に不便で・・・。
先日も会社で使用しているアクセス解析のデータをサーバー(UNIX系)からダウンロードして
Windows上のディスクにバックアップしてあったものを、何も考えずサーバーへ復旧したところ、
不具合発生。復旧したファイルが更新されず、新しいファイルがバンバンできる。
???と思ってたら、Windowsへバックアップしたときに、ファイル名に使用している
半角英文字がすべて小文字から大文字に変換されてしまっている・・・。
どのタイミングで変換されてしまったのか全く気づかず・・・(´ヘ`;)
コマンドプロンプトを立ち上げて作業することが多い。
UNIX系OSにある “which” というコマンドがないのが非常に不満で、
じゃあ、不満なら自分で書けば? というわけで適当に書いたんだけど、
Windowsでは拡張子とか関係してくるのでメンドクサイ処理がある。
でも、大文字・小文字が関係ないので、その分ラクできる・・・というのもあります。
/* C# 環境変数%PATH%からCommandNameにマッチする実行ファイルのパスを返す。 エラーチェックなし(^^;;; */ public static string[] FindInPath(string CommandName) { List<string> PathList = new List<string>(); //環境変数%PATH%取得し、カレントディレクトリを連結。配列への格納 string [] pathenv = (Directory.GetCurrentDirectory() + ";" + Environment.ExpandEnvironmentVariables( Environment.GetEnvironmentVariable("PATH"))).Split(new Char[]{';'}); //正規表現に使用するため、%PATHEXT%の取得・ピリオド文字の変換及び配列への格納 string [] pathext = Environment.GetEnvironmentVariable("PATHEXT").Replace(".",@"\.").Split(new Char[]{';'}); //検索するファイル名の正規表現 Regex regex = new Regex("^" + CommandName + "(" + String.Join("|",pathext) + ")?$" ,RegexOptions.IgnoreCase); foreach(string dir in pathenv) { if(!Directory.Exists(dir)) continue; foreach(string file in Directory.GetFiles(dir)) { if(regex.Match(Path.GetFileName(file)).Success == true) { PathList.Add(file); } } } return PathList.ToArray(); }
追記:2024年3月1日
Linqを利用したもの修正