D 如何检查命令是否存在?

D 如何检查命令是否存在?,d,external-process,D,External Process,我需要检测应用程序是否存在于系统中。 我使用std.process,如果不存在可执行命令,则下一个代码是trow异常: try { auto ls = execute(["fooapp"]); if (ls.status == 0) writeln("fooapp is Exists!\n"); } catch (Exception e) { writeln("exception"); } 有没有更好的方法来检查应用程序是否存在而不引发异常 我会非常担心仅仅运

我需要检测应用程序是否存在于系统中。 我使用std.process,如果不存在可执行命令,则下一个代码是trow异常:

try
{
    auto ls = execute(["fooapp"]);
    if (ls.status == 0) writeln("fooapp is Exists!\n");
}

catch (Exception e)
{
        writeln("exception");
}

有没有更好的方法来检查应用程序是否存在而不引发异常

我会非常担心仅仅运行一个命令。即使您知道它应该做什么,如果系统上有另一个同名程序(无论是意外还是恶意),您可能会对简单地运行该命令产生奇怪的、可能是非常糟糕的副作用。好吧,正确地完成这项工作将是特定于系统的,我所能建议的最好方法是利用系统上的任何命令行shell

这两个问题的答案似乎为如何在Linux上实现这一点提供了很好的信息,我希望它也适用于BSD。它甚至可能对MacOSX也有效,但我不知道,因为我不熟悉MacOSX默认的命令行shell

答案似乎可以归结为使用
type
命令,但您应该阅读答案中的详细信息。对于Windows,快速搜索会显示以下内容:

它似乎提供了几种不同的方法来解决Windows上的问题。因此,从这里可以看出,在Windows上运行的shell命令可以告诉您是否存在特定的命令

不管操作系统是什么,你需要做的是

bool commandExists(string command)
{
    import std.process, std.string;
    version(linux)
        return executeShell(format("type %s", command)).status == 0;
    else version(FreeBSD)
        return executeShell(format("type %s", command)).status == 0;
    else version(Windows)
        static assert(0, "TODO: Add Windows magic here.");
    else version(OSX)
        static assert(0, "TODO: Add Mac OS X magic here.");
    else
        static assert(0, "OS not supported");
}

可能在某些系统上,您实际上必须解析命令的输出,以查看它是否给出了正确的结果,而不是查看状态。不幸的是,这正是系统特有的功能。

您可以在windows下使用此功能(因此,这是windows添加的魔法,如其他答案所述…),它检查环境中是否存在文件,默认情况下路径为:

string envFind(in char[] filename, string envVar = "PATH")
{  
    import std.process, std.array, std.path, std.file;
    auto env = environment.get(envVar);
    if (!env) return null;
    foreach(string dir; env.split(";")) {
        auto maybe = dir ~ dirSeparator ~ filename; 
        if (maybe.exists) return maybe.idup;
    }
    return null;
}
基本用法:

if (envFind("cmd.exe") == "")  assert(0, "cmd is missing");
if (envFind("explorer.exe") == "")  assert(0, "explorer is missing");
if (envFind("mspaint.exe") == "") assert(0, "mspaintis missing");