运行 来自另一个 exe 的 exe

Run exe from another exe

我正在尝试编写一个程序,该程序 运行 是同一文件夹中带有一些参数的其他可执行文件,此 exe pdftotext.exe 来自 poppler-utils,它会生成一个文本文件。

我准备了一个字符串作为参数传递给 system(),结果字符串是:

cd/D N:\folder0\folder1\folder2\foldern && pdftotext.exe data.pdf -layout -nopgbrk

首先转到文件目录,然后运行可执行文件。

当我 运行 它时,我总是得到

sh: cd/D: No such file or directory

但是如果我 运行 直接从命令提示符输入命令,命令就可以工作。

我认为这不重要,但这是我到目前为止所写的内容:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>

// Function to get the base filename
char *GetFileName(char *path);

int main (void)
{
    // Get path of the acutal file
    char currentPath[MAX_PATH];

    int pathBytes = GetModuleFileName(NULL, currentPath, MAX_PATH);
    if(pathBytes == 0)
    {
        printf("Couldn't determine current path\n");
        return 1;
    }

    // Get the current file name
    char* currentFileName = GetFileName(currentPath);

    // prepare string to executable + arguments
    char* pdftotextArg = " && pdftotext.exe data.pdf -layout -nopgbrk";

    // Erase the current filename from the path
    currentPath[strlen(currentPath) - strlen(currentFileName) - 1] = '[=13=]';


    // Prepare the windows command
    char winCommand[500] = "cd/D ";
    strcat(winCommand, currentPath);
    strcat(winCommand, pdftotextArg);

    // Run the command
    system(winCommand);

    // Do stuff with the generated file text

    return 0;
}

您的工作目录可能有误,您无法通过 cd 命令更改它。由于你使用的是windows,我建议你使用CreateProcess来执行pdftotext.exe,如果你想设置工作目录,你可以检查CreateProcesslpCurrentDirectory参数.

cd是"shell"命令,不是可以执行的程序。

所以要应用它 运行 a shell (cmd.exe under windows) 并传递你想要执行的命令。

这样做 mwinCommand 的内容看起来像这样:

cmd.exe /C "cd/D N:\folder0\folder1\folder2\foldern && pdftotext.exe data.pdf -layout -nopgbrk"

请注意,更改驱动器和目录仅适用于 cmd.exe 使用的环境。程序的驱动器和目录保持在调用 system() 之前的状态。


更新:

仔细查看错误消息,您会注意到“sh: ...”。这清楚地表明 system() 没有调用 cmd.exe,因为它很可能不会像这样为错误消息添加前缀。

从这个事实我敢断定显示的代码是在 Cygwin 下调用的 运行s。

Cygwin提供和使用的shell(s)不知道windows特定选项/D到shell命令cd,因此错误。

然而,Cygwin 使用的 shells 可以调用 cmd.exe 我最初提供的方法有效,尽管我给出的解释是错误的,正如 [=23 所指出的=] 下面。