运行 来自另一个 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
,如果你想设置工作目录,你可以检查CreateProcess
的lpCurrentDirectory
参数.
cd
是"shell"命令,不是可以执行的程序。
所以要应用它 运行 a shell (cmd.exe
under windows) 并传递你想要执行的命令。
这样做 m 让 winCommand
的内容看起来像这样:
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 所指出的=] 下面。
我正在尝试编写一个程序,该程序 运行 是同一文件夹中带有一些参数的其他可执行文件,此 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
,如果你想设置工作目录,你可以检查CreateProcess
的lpCurrentDirectory
参数.
cd
是"shell"命令,不是可以执行的程序。
所以要应用它 运行 a shell (cmd.exe
under windows) 并传递你想要执行的命令。
这样做 m 让 winCommand
的内容看起来像这样:
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 所指出的=] 下面。