C# 在C中模拟Linux的哪个命令#

C# 在C中模拟Linux的哪个命令#,c#,C#,我在一个名为GraphViz的C项目中使用了一个工具的二进制文件。 问题是我必须将二进制文件路径作为硬编码包含在内,我不想这样做 IRenderer renderer = new Renderer("C:\\Program Files (x86)\\Graphviz2.38\\bin"); // todo: remove hardcoded GraphViz path 我想模拟linux的which命令。 只需传递二进制名称(例如dot)并获取路径 GetBinaryPath("dot");

我在一个名为
GraphViz
的C项目中使用了一个工具的二进制文件。 问题是我必须将二进制文件路径作为硬编码包含在内,我不想这样做

IRenderer renderer = new Renderer("C:\\Program Files (x86)\\Graphviz2.38\\bin"); // todo: remove hardcoded GraphViz path
我想模拟linux
的which
命令。 只需传递二进制名称(例如
dot
)并获取路径

GetBinaryPath("dot"); // return the above path
如果有任何想法或主题可以开始搜索,我将不胜感激

注 目标操作系统:Windows

.NET版本:4

如果只需要查找给定可执行文件名的路径(并且安装目录位于
path
环境变量中)

备选案文1:

where
命令与
Process
类一起使用。(测试退出代码,解析输出)

备选案文2:


您可以获取环境路径环境变量,将其拆分为“;”并测试您的可执行文件名是否存在。

首先,您需要找到windows在其中搜索可执行文件的所有目录,这些文件来自环境变量%PATH%。 然后您需要从%PATHEXT%查找所有扩展名(.com、.exe、.bat等)

然后你只需像这样检查它们:

internal class Program {
    private static void Main(string[] args) {
        if (args.Length != 1) {
            Console.WriteLine("Incorrect usage!");
            return;
        }

        var extensions = GetExecutableExtensions(args[0]);
        var paths = GetPaths();

        var exeFile = GetFirstExecutableFile(args[0], extensions, paths);
        if (exeFile == null) {
            Console.WriteLine("No file found!");
        }
        else {
            Console.WriteLine(exeFile);
        }
    }

    private static string GetFirstExecutableFile(string file, string[] extensions, string[] paths) {
        foreach (var path in paths) {
            var filename = Path.Combine(path, file);
            if (extensions.Length == 0) {
                if (File.Exists(filename)) {
                    return filename;
                }
            }
            else {
                foreach (var ext in extensions) {
                    filename = Path.Combine(path, file + ext);
                    if (File.Exists(filename)) {
                        return filename;
                    }
                }
            }
        }
        return null;
    }

    private static string[] GetExecutableExtensions(string file) {
        var data = GetCmdOutput("echo %PATHEXT%");
        var arr = data.TrimEnd('\n', '\r').Split(new [] {';'}, StringSplitOptions.RemoveEmptyEntries);

        //If the command passed in ends with a executable extension then we dont need to test all extensions so set it to emtpy array
        foreach (var ext in arr) {
            if (file.EndsWith(ext, StringComparison.OrdinalIgnoreCase)) {
                return new string[0];
            }
        }

        return arr;
    }

    private static string[] GetPaths() {
        var data = GetCmdOutput("echo %PATH%");
        return data.TrimEnd('\n', '\r').Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
    }

    private static string GetCmdOutput(string cmd) {
        using (var proc = new Process {
            StartInfo = new ProcessStartInfo {
                FileName = "cmd.exe",
                Arguments = "/c " + cmd,
                UseShellExecute = false,
                RedirectStandardOutput = true,
                CreateNoWindow = true
            }
        }) {
            proc.Start();
            return proc.StandardOutput.ReadToEnd();
        }
    }
}

为什么不用旗子?还是菜单项?或一个环境变量,用于指定程序的安装位置,或仅确保二进制文件位于PATH变量中,并使用exec而不指定目录(这是
哪个
所做的)2票结束问题,我不明白这与编程无关。
Graphviz2.38
部分是否已修复?如果是这样,您可以通过
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)获取
C:\\ProgramFiles(x86)
另外,Windows也有一个类似的命令行工具,它被称为
where
,关于为什么这是一个不可靠的问题:刚刚注意到Skomialek的答案中的“where”命令。更好的解决方案。至少你从我的代码中知道它是如何工作的。。。