从另一个EXE运行EXE

我试图编写一个程序,运行其他可执行文件在同一个文件夹中的一些参数,这个EXE是从poppler-utils pdftotext.exe ,它会生成一个文本文件。

我准备一个string来传递它作为system()参数,结果string是:

 cd/DN:\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] = '\0'; // 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是一个“shell”命令,而不是一个可执行的程序。

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

为了让winCommand的内容如下所示:

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

请注意,更改驱动器和目录只适用于cmd.exe使用的环境。 该程序的驱动器和目录保持与调用system()


更新:

仔细查看错误信息,会发现“ sh: ... ”。 这清楚地表明system()不调用cmd.exe ,因为它最喜欢不会在这样的错误消息前缀。

从这个事实,我敢于总结所示的代码被调用并在Cygwin下运行 。

Cygwin提供和使用的shell不知道windows命令cd特定选项/D ,从而导致错误。

因为Cygwin使用的shell可以调用cmd.exe我提供了方法,尽管我给出的解释是错误的,正如下面的pmg的注释所指出的那样。

你的工作目录可能是错误的,你不能从cd命令改变它。 由于您使用的是Windows,我建议您使用CreateProcess来执行pdftotext.exe ,如果您想设置工作目录,您可以检查CreateProcesslpCurrentDirectory参数。