通过 PATH 环境启动程序.具有正确工作目录的变量

Start program by PATH env. var. with right working directory

本文关键字:工作 变量 环境 PATH 启动 程序 通过      更新时间:2023-10-16

我只是尝试通过 PATH env. var 解析其位置来运行一个新进程。由于我使用 Qt,这意味着我添加了

X:\文件夹\

到我的 PATH 变量,在我的入门应用程序中我正在调用

QProcess::startDetached("test.exe")

这实际上有效。

但是测试.exe将数据写入其工作目录。这些数据最终位于入门应用程序的目录中,而不是 X:\folder\,这不是我想要的。

通过在 CLI 中键入"test.exe",我直接在 windows 命令行中测试了行为,那里是一样的(将数据写入当前目录)。

有没有办法(在C++或命令行中)使用 PATH 启动进程,同时还使用 PATH 中找到的目录作为新进程的工作目录?

我可以搜索自己的 PATH,分析结果并通过另一个 QProcess::startDetached() 重载启动程序,但我想知道是否有更简单的方法。

使用路径时,操作系统不会"移动到当前目录"。你将不得不自己做。(在大多数情况下,你不会真的希望应用程序移动到不同的目录 - 如果编译器在你执行gcc foo.c时这样做了怎么办 - 那么你必须传递所有内容的完整路径,因为你当然不想把你的源文件放在编译器所在的位置 - 在许多情况下,你甚至可能无法写入Unix/Linux系统上的该目录)。

您必须在前面加上正确的文件夹[我建议使用应用程序安装目录可能不是最佳位置!],或者chdir(...)将当前工作目录更改为您希望数据的位置。大多数应用程序(使用将文件存储在像这样的特定位置的原则)在某个设置中存储"默认目录",因此用户可以更改设置以适应他/她的设置。

至少有 3 个选项没有复杂的配置。

1 - 从调用应用程序中将当前目录更改为test.exe程序所在的目录。这样,文件将转到所需的目录。但是,调用应用程序可能会出现问题或在不应该出现问题的地方生成输出,因此需要对调用应用程序中的当前目录进行新的更改

2 - 作为参数传递给test.exe,它应该在其中生成文件。

3 - 从您的test.exe确定它所在的位置,并使用此信息更改此过程的当前目录,或者在知道路径的情况下,在其所在的同一目录中生成文件。

TCHAR szPath[MAX_PATH];
if( !GetModuleFileName( NULL, szPath, MAX_PATH ) ) {
    // handle error in GetModuleFileName
} else {
    // now, szPath contains file path
};

这是检索当前进程位置的标准窗口方式。此处引用: 获取模块文件名