如何以与VBScript相同的方式解析命令行

时间:2019-01-19 11:58:10

标签: c++ windows winapi visual-c++

我有一个简单的C ++程序,列出了它得到的参数:

#include <iostream>

int main(int argc, char* argv[]) {
    for (int i = 1; i < argc; i++) {
        std::cout << argv[i] << std::endl;
    }
    return 0;
}

我只是对此进行测试/设计,但最终目的是要接受某些文件和目录的名称。

因此我将这些参数传递给它:

"\\server\directory\file.ext" "C:\trailing\backslash\" "file.txt"

但这是打印的内容:

\\server\directory\file.ext 
C:\trailing\backslash" file.txt

即第二个参数后面的斜杠使它认为右引号已转义。

我正在VS2017的属性页中设置参数,但是在以下情况下我会得到相同的输出:

  • 我从PowerShell调用exe。
  • 我允许外部工具通过我的 它已经建立的exe参数(这最终将是这样的) 使用)。

如何让我的程序理解带斜杠的引用路径是一个参数?

编辑 this article的第4节准确描述了我的问题。基本上,我想让我的C ++程序以与批处理文件或VBScript相同的方式解释参数。 我无法更改参数进入程序的方式

编辑,我将简化这个问题:

上面的C ++程序的行为如下: The C++ program above behaves like this

我希望它的行为如下: I want it to behave like this

为了使这种情况发生,我必须对程序或编译器做什么?

3 个答案:

答案 0 :(得分:3)

您必须使用另一个反斜杠来保护结尾的反斜杠,否则反斜杠将被视为以下双引号的转义字符。 有关此行为的原理,请参见Raymond Chen的blog post。 这是相关部分的报价:

  
      
  • 一串不带引号的反斜杠没有特殊含义。
  •   
  • 偶数个反斜杠后跟一个引号被视为成对的受保护的反斜杠,后跟一个单词终止符。
  •   
  • 奇数个反斜杠后跟一个引号被视为成对的保护反斜杠,后跟一个受保护的引号。
  •   

答案 1 :(得分:1)

我尝试对第二个参数使用额外的斜杠进行编译,如下所示,并且能够产生所需的输出!

"\\server\directory\file.ext" "C:\trailing\backslash\\" "file.txt"

这是输出

/home/a.out                                                                                                                          
\server\directory\file.ext                                                                                                           
C:\trailing\backslash\                                                                                                               
file.txt 

如果可以帮助我,请评论我的帖子:D

答案 2 :(得分:0)

如果您对命令行解析不满意,可以自己进行:

只需使用GetCommandLine并根据需要解析命令行即可。

其他文章已经描述了/应该如何处理命令行(请参见blog post of Raymond Chen)。