今更ながら大文字・小文字。

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を利用したもの修正