【问题标题】:Equivalent of "where" command prompt command in C#等效于 C# 中的“where”命令提示符命令
【发布时间】:2014-03-05 22:27:40
【问题描述】:

有什么方法可以在不执行“where”命令提示符命令的情况下在 C# 中动态查找路径?

例如,如果我想找到 mspaint exe,我可以在命令提示符下输入这个

where mspaint

它返回路径。

【问题讨论】:

标签: c# windows command-prompt


【解决方案1】:

我认为公共语言运行时中没有内置方法可以为您执行此操作,但您当然可以自己执行:

  • 获取PATH环境变量的值
  • ;分隔符上拆分它以获得路径中的目录列表
  • 检查每个目录,看看它是否包含program

例子:

public static string FindInPath(string filename)
{
    var path = Environment.GetEnvironmentVariable("PATH");
    var directories = path.Split(';');

    foreach (var dir in directories)
    {
        var fullpath = Path.Combine(dir, filename);
        if (File.Exists(fullpath)) return fullpath;
    }

    // filename does not exist in path
    return null;
}

不要忘记在文件名中添加.exe。 (或者,您可以修改上面的代码以搜索任何可执行扩展名:.bat.com.exe;或者甚至可能是任何扩展名。)

【讨论】:

  • 像魅力一样工作,但比哪里慢。非常感谢!
  • 我很惊讶听到它变慢了。你是如何衡量时间的?也许where 使用了某种缓存,但这似乎令人惊讶。
  • 这可能也值得首先检查Environment.CurrentDirectory。不确定是否应该包含其他文件夹,但值得进行更多研究。或许还应该搜索当前进程程序集的路径或一些系统目录。
  • 文档说:“显示与搜索模式匹配的文件的位置。默认情况下,搜索是沿着当前目录和 PATH 环境变量指定的路径完成的。”
  • CodeProject上的"whereis" article是比较完整的实现,也可以搜索我提到的路径。
【解决方案2】:

这是基于@TypeIA 的回答,但它支持当前目录和所有PATHEXT

public static string Where(string file)
{
    var paths = Environment.GetEnvironmentVariable("PATH").Split(';');
    var extensions = Environment.GetEnvironmentVariable("PATHEXT").Split(';');
    return (from p in new[] { Environment.CurrentDirectory }.Concat(paths)
            from e in new[] { string.Empty }.Concat(extensions)
            let path = Path.Combine(p.Trim(), file + e.ToLower())
            where File.Exists(path)
            select path).FirstOrDefault();
}

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 2018-01-04
    • 2011-07-14
    • 2013-08-01
    • 2011-10-26
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多