从命令获取可执行文件的路径(如cmd所示)

Col*_*nic 10 .net c# cmd path command-prompt

给定命令的命令行样式路径,如bin/server.exeping,如何获取此可执行文件的完整路径(作为cmd或Process.Start将解析它)?

我试过Path.GetFullPath,但它总是相对于工作目录扩展.它bin/server.exe正确扩展,但是ping它返回c:\users\matt\ping(不存在).我想要c:\Windows\system32\ping.exe.

编辑:我想要与cmd相同的行为.一些考虑:

  1. 当存在与路径中的可执行文件同名的本地可执行文件时,cmd更喜欢本地可执行文件
  2. cmd可以将命令扩展serverserver.batserver.exe(添加文件扩展名)

我也尝试过Windows的命令行工具where.它几乎是我想要的:

显示与搜索模式匹配的文件的位置.默认情况下,搜索是在当前目录和PATH环境变量指定的路径中完成的.

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

(由于'path'这两个词的两个不同含义,这个问题很难搜索到)

Rup*_*Rup 11

考虑到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);
}
Run Code Online (Sandbox Code Playgroud)

对不起,缩进有点无处不在 - 我试图让它不滚动.我不知道是否真的需要StartsWith检查 - 我不确定CMD如何处理没有前导点的pathext条目.

  • 为了完整性,您应该包括[以下检查](http://blogs.msdn.com/b/oldnewthing/archive/2011/07/25/10189298.aspx):静态字符串GetExecutablePathFromAppPaths(字符串exename){const string appPaths = @"Software\Microsoft\Windows\CurrentVersion\App Paths"; var executableEntry = Path.Combine(appPaths,exename); using(var key = Registry.CurrentUser.OpenSubKey(executableEntry)?? Registry.LocalMachine.OpenSubKey(executableEntry)){return(key!= null)?(string)key.GetValue(null):null; }} (2认同)

Ser*_*-Tm 7

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));
}
Run Code Online (Sandbox Code Playgroud)