11

bin/server.exeまたはなどのコマンドへのコマンドラインスタイルのパスが与えられた場合ping、この実行可能ファイルへのフルパスを(cmdとして、またはそれProcess.Startを解決するために)取得するにはどうすればよいですか?

試しPath.GetFullPathましたが、常に作業ディレクトリに対して拡張されます。bin/server.exe正しく拡張されpingますが、返されるとc:\users\matt\ping(存在しません)。欲しいc:\Windows\system32\ping.exe

編集:私はcmdと同じ振る舞いをしたいです。いくつかの考慮事項:

  1. パスに同じ名前のローカル実行可能ファイルがある場合、cmdはローカル実行可能ファイルを優先します
  2. cmdは、コマンドserverserver.batまたはに展開できますserver.exeファイル拡張子を追加します

また、Windowsのコマンドラインツールであるを試しましwhereた。それはほとんど私が欲しいです:

検索パターンに一致するファイルの場所を表示します。デフォルトでは、検索は現在のディレクトリに沿って、PATH環境変数で指定されたパスで実行されます。

>where ping
C:\Windows\System32\PING.EXE
>where bin\server
INFO: Could not find files for the given pattern(s).

(この質問は、「パス」という単語の2つの異なる意味のため、検索するのが困難です)

4

5 に答える 5

14

PATHEXTも考慮して、Serj-Tmの答えから盗みます(申し訳ありません!彼に+1):

public static string WhereSearch(string filename)
{
    var paths = new[]{ Environment.CurrentDirectory }
            .Concat(Environment.GetEnvironmentVariable("PATH").Split(';'));
    var extensions = new[]{ String.Empty }
            .Concat(Environment.GetEnvironmentVariable("PATHEXT").Split(';')
                       .Where(e => e.StartsWith(".")));
    var combinations = paths.SelectMany(x => extensions,
            (path, extension) => Path.Combine(path, filename + extension));
    return combinations.FirstOrDefault(File.Exists);
}

申し訳ありませんが、インデントはいたるところにあります。スクロールしないようにしようとしていました。StartsWithチェックが本当に必要かどうかはわかりません-CMDが先頭にドットのないpathextエントリをどのように処理するかはわかりません。

于 2012-07-26T15:20:22.760 に答える
9
public static string GetFullPath(string filename)    
{
 return new[]{Environment.CurrentDirectory}
  .Concat(Environment.GetEnvironmentVariable("PATH").Split(';'))
  .Select(dir => Path.Combine(dir, filename))
  .FirstOrDefault(path => File.Exists(path));
}
于 2012-07-26T11:38:14.547 に答える
4

現在のディレクトリとPATH環境変数で指定されたパスのみを検索する場合は、次のスニペットを使用できます。

public static string GetFullPath(string fileName)
{
    if (File.Exists(fileName))
        return Path.GetFullPath(fileName);

    var values = Environment.GetEnvironmentVariable("PATH");
    foreach (var path in values.Split(';'))
    {
        var fullPath = Path.Combine(path, fileName);
        if (File.Exists(fullPath))
            return fullPath;
    }

    return null;
}
于 2012-07-26T11:23:08.283 に答える
3

ディスク全体を検索する必要があります。

Windowsは、次のキーの下のレジストリにあるため、iexplore、ping、cmdなどに応答できます。

HKEY_LOCAL_MACHINE
   SOFTWARE
       Microsoft
           Windows
               CurrentVersion
                   App Paths

他の唯一の方法は、ディスク全体でアプリケーションを検索することです。

編集:私の理解では、Windowsですでに知られている名前ではなく、ランダムな実行可能ファイルの名前を検索したいということでした。

于 2012-07-26T11:21:54.617 に答える
2
internal class Program
{
    static void Main(string[] args)
    {
        string fullPath = GetExactPathFromEnvironmentVar("ping.exe");
        if (!string.IsNullOrWhiteSpace(fullPath))
            Console.WriteLine(fullPath);
        else
            Console.WriteLine("Not found");
    }

    static string GetExactPathFromEnvironmentVar(string program)
    {
        var pathVar = System.Environment.GetEnvironmentVariable("PATH");
        string[] folders = pathVar.Split(';');

        foreach (var folder in folders)
        {
            string path = Path.Combine(folder, program);
            if (File.Exists(path))
            {
                return path;
            }
        }

        return null;
    }
}

HTH

于 2012-07-26T11:21:50.523 に答える