我试图编写一个程序,运行其他可执行文件在同一个文件夹中的一些参数,这个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
,如果您想设置工作目录,您可以检查CreateProcess
的lpCurrentDirectory
参数。