我正在尝试使用system()运行需要一些参数的.exe。
如果.exe的路径中存在空格并且在参数中传递的文件的路径中,我会收到以下错误:
The filename, directory name, or volume label syntax is incorrect.
以下是生成该错误的代码:
#include <stdlib.h>
#include <conio.h>
int main (){
system("\"C:\\Users\\Adam\\Desktop\\pdftotext\" -layout \"C:\\Users\\Adam\\Desktop\\week 4.pdf\"");
_getch();
}
如果“pdftotext”的路径不使用引号(我需要它们,因为有时目录会有空格),一切正常。另外,如果我将“system()”中的内容放入字符串并输出它并将其复制到实际的命令窗口中,它就可以工作。
我想也许我可以使用类似的东西链接一些命令:
cd C:\Users\Adam\Desktop;
pdftotext -layout "week 4.pdf"
所以我已经在正确的目录中,但我不知道如何在同一个system()函数中使用多个命令。
任何人都可以告诉我为什么我的命令不起作用或者我想到的第二种方式是否有效?
编辑:看起来我需要一组额外的引号,因为system()将其参数传递给cmd / k,所以它需要在引号中。我在这里找到了它:
C++: How to make a my program open a .exe with optional args
因此,即使我们没有收到相同的错误消息,我也会投票决定关闭,因为问题非常接近,谢谢!
答案 0 :(得分:27)
system()
将命令作为cmd /C command
运行。以下来自cmd
doc:
If /C or /K is specified, then the remainder of the command line after
the switch is processed as a command line, where the following logic is
used to process quote (") characters:
1. If all of the following conditions are met, then quote characters
on the command line are preserved:
- no /S switch
- exactly two quote characters
- no special characters between the two quote characters,
where special is one of: &<>()@^|
- there are one or more whitespace characters between the
two quote characters
- the string between the two quote characters is the name
of an executable file.
2. Otherwise, old behavior is to see if the first character is
a quote character and if so, strip the leading character and
remove the last quote character on the command line, preserving
any text after the last quote character.
您似乎遇到案例2,cmd
认为整个字符串C:\Users\Adam\Desktop\pdftotext" -layout "C:\Users\Adam\Desktop\week 4.pdf
(即没有第一个和最后一个引号)是可执行文件的名称。
所以解决方案是将整个命令包装在额外的引号中:
//system("\"D:\\test\" nospaces \"text with spaces\"");//gives same error as you're getting
system("\"\"D:\\test\" nospaces \"text with spaces\"\""); //ok, works
这很奇怪。我认为添加/S
只是为了确保它总是通过案例2解析字符串也是一个好主意:
system("cmd /S /C \"\"D:\\test\" nospaces \"text with spaces\"\""); //also works
答案 1 :(得分:0)
很好地从这里学习系统调用的内部。使用C ++字符串,TCHAR等可以重现(当然)。 总是帮助我的一种方法是SetCurrentDirectory()调用。我首先设置当前路径然后执行。到目前为止,这对我有用。任何评论欢迎。 -Sreejith。 D.梅农
答案 2 :(得分:0)
我到这里来寻找答案,这是我想出的代码(为了让下一个维护我的代码的人受益,我是明确的):
std::stringstream ss;
std::string pathOfCommand;
std::string pathOfInputFile;
// some code to set values for paths
ss << "\""; // command opening quote
ss << "\"" << pathOfCommand << "\" "; // Quoted binary (could have spaces)
ss << "\"" << pathOfInputFile << "\""; // Quoted input (could have spaces)
ss << "\""; // command closing quote
system( ss.str().c_str() ); // Execute the command
它解决了我所有的问题。