【问题标题】:How do I run a command line tool from a different directory in C++如何从 C++ 中的不同目录运行命令行工具
【发布时间】:2016-06-15 15:00:55
【问题描述】:

我正在尝试构建一个 C++ 应用程序,该应用程序使用 system() 函数在 Windows 命令提示符上进行一系列命令行调用。 C++ 在下面的目录 BSP 中运行。 BSP 包含一个子文件夹 BSP/XST/Files。应用程序发出的命令之一,需要调用需要在 Files 目录中运行的命令行工具(Xilinx 综合工具)。

BSP
|---XST
|---|---Files

在命令提示符下手动执行此操作,我会执行以下操作:

>>cd XST
>>cd Files
>>xst -h

有没有办法从BSP目录调用子目录中的工具? 我看了这个问题here,但它不起作用。我猜是因为他们在谈论存储在子目录中的可执行文件,而我正在调用命令行工具(即使用环境变量)。

为了简化:在 Windows 命令提示符的子文件夹中是否有一个命令/选项可以运行命令行工具?我可以通过我的 C++ 来模拟该语句。

【问题讨论】:

  • 您指定工具的完整路径。还是您在谈论设置应用程序的工作目录?你可以调用SetCurrentDirectory函数。
  • 由于它没有回答您的问题,因此我将其作为评论留下。如果您只在 Windows 上工作,我建议您使用 CreateProcess,因为这可以让您在生成进程时指定所有各种参数,包括其工作目录等。
  • @MikeVine 看起来真的很有趣。谢谢,我会调查的。

标签: c++ windows


【解决方案1】:

正如@CodyGray 在 cmets 中所建议的那样,我的想法是使用 SetCurrentDirectory。如果您的程序位于 BST 目录中,并且您希望在相对于它的子文件夹 XST\Files 中运行 xst,那么它也可以使用GetModuleFileName。使用此功能检索程序的路径,然后用您的子文件夹替换文件名。最后将目录更改为修改后的路径:

#include <string>
using namespace std;

int main()
{
    // Get the path to your program.
    char moduleFilePath[MAX_PATH];
    GetModuleFileName(NULL, moduleFilePath, MAX_PATH);

    // Find the backslash in front of the name of your program.
    string::size_type pos = string(moduleFilePath).rfind("\\");

    // Replace the program name by your sub-folder.
    string subFolderPath = string(moduleFilePath).substr(0, pos) + "\\XST\\Files";

    // Change into the sub-folder relative to your program.
    SetCurrentDirectory(subFolderPath.c_str());

    // Execute some program in your sub-folder.
    system("type test.txt");

    return 0;
}

由于我没有xst,所以我将一个文本文件test.txt 放入子文件夹以进行测试。该文件只包含Test test test,因此上面的程序打印出以下内容:

测试测试测试

但正如@MikeVine 所建议的,CreateProcess 可能是一个更聪明的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2011-02-28
    • 2022-01-12
    • 2019-08-13
    • 2010-10-16
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多