如何以编程方式确定命令的PATH?

时间:2014-12-23 21:04:14

标签: windows api

我知道本文中Window等效的“whereis”命令: https://superuser.com/questions/21067/windows-equivalent-of-whereis

但是如何使用代码执行相同的操作?有没有Windows API?

2 个答案:

答案 0 :(得分:2)

使用Linq的C#中的示例代码显示了如何扫描PATH环境变量:

   static string SearchEnvPathForProgram(string filename)
    {
        return Environment.GetEnvironmentVariable("PATH").Split(';')
               .Select(dir => Path.Combine(dir, filename))
               .FirstOrDefault(path => File.Exists(path));
    }

但是,如果这对您来说还不够,并且您需要模仿Windows内核的CreateProcess函数的完整行为,则必须通过添加注释中列出的其他位置来扩展此函数。 @HarryJohnston(感谢你的评论)。

例如,folder of your current executablecurrent directorywindows system directory。我猜你会在每个人身上找到一个相应的问题。

答案 1 :(得分:0)

LoadLibraryEx后跟GetModuleFileName是一个选项,但只有在您搜索的文件名包含.exe扩展名时才会生效。

如果启用了安全的DLL搜索模式(默认情况下在现代版本的Windows上),则需要先调用SetDllDirectory,并将当前目录作为参数传递。不要忘记之后再调用SetDllDirectory(NULL)来恢复默认行为。

这在多线程程序中可能不安全,因为另一个线程可能会在禁用安全搜索模式时加载DLL。