在Windows命令行上转义字符串

在Windows命令行上转义字符串,windows,winapi,command-line,command-line-arguments,Windows,Winapi,Command Line,Command Line Arguments,我试图从命令行将字符串传递给Win32程序,这样它就可以在不做任何更改的情况下打印出来 我为什么要逃跑 “AAA”作为“AAA” 但是 “AAA”(包括逗号)为“AAA^\”,“ 我发现windows命令行的转义规则不一致 另外,我正在尝试生成一个.cmd文件 更新: 我使用简单的C程序进行测试,它是用gcc编译的,没有额外的对象文件链接。如果我用perl替换它,规则保持不变 我正在尝试创建一个通用的转义算法。它将生成.cmd文件,该文件将使用输出重定向调用perl。目前我有一个问题,若字符串包

我试图从命令行将字符串传递给Win32程序,这样它就可以在不做任何更改的情况下打印出来

我为什么要逃跑
“AAA”作为“AAA”
但是
“AAA”(包括逗号)为“AAA^\”,“

我发现windows命令行的转义规则不一致

另外,我正在尝试生成一个.cmd文件

更新:

我使用简单的C程序进行测试,它是用gcc编译的,没有额外的对象文件链接。如果我用perl替换它,规则保持不变

我正在尝试创建一个通用的转义算法。它将生成.cmd文件,该文件将使用输出重定向调用perl。目前我有一个问题,若字符串包含奇数个双引号,并用反斜杠转义,那个么输出重定向将不起作用。在对的最后一条评论中描述了相同的问题


如果我使用“”作为转义符,它将在空间上拆分,因此它将生成两个参数,而不是一个参数。此外,“”还有一些工件。

在windows中,没有一种方法可以获取命令行并对其进行解析。大多数程序通常都会自行处理

Raymond Chen最近发布了一篇关于
命令行ToArgVw
函数的帖子,其中提到了有关引用的各种规则,但这些规则仅在程序使用该特定函数时适用

在windows中,命令行将不受干扰地传递给程序(即不展开通配符)然后程序需要处理它。编程语言可能提供一种方便,可以进行一些默认的参数解析,这可能会使用标准的windows函数,例如,但即使如此,程序也可以选择读取未加润色的字符串本身,从而跳过这些标准


这意味着您需要为您试图自己编写脚本的特定程序找出规则,然后使用它们。

我刚刚在我自己的一个程序中尝试了这些参数,两个版本(带逗号或不带逗号)都可以两种方式转义(使用
\”
转义引号)。我能看到的唯一原因是,在第二个版本中,
需要使用
^
进行转义,因为命令行在将它们传递到应用程序之前将它们视为I/O重定向,这是由于转义字符串引号的方式不同。

您使用的是什么命令解释器?参数splitting是它的函数,而不是Windows本身。我甚至不理解您的要求。据我所知,第一行粗体字是VB的引号转义方式,第二行是C(和其他类似语言)同样的方法。如果这就是你所说的,那真的不是windows操作系统,而是语言本身的语法。顺便说一句,你能澄清一下你的问题吗?我认为要得到一个好的答案,你需要对环境更具体一些。你是说对命令解释器进行转义,还是对特定的语言进行参数解析app?因为我需要传递给程序,我也需要转义命令解释器,但一般来说是一个程序(可能在引擎盖下使用CommandLineToArgvW)@MichaelKjörling,我们可以假设他使用的是
cmd
,它在传递
命令行之前不进行参数拆分。这有点无关,但我想指出,VC++至少提供了一种自动扩展通配符的方法,将setargv.obj或wsetagv.obj链接到您的应用程序中我的问题是ildcards。在MSVC中编译的简单程序没有任何附加调用或库,仍然可以理解“\”和^。一般的观点是,程序应该提供在命令行上传递给您的内容。例如,您使用的语言可能会提供一些额外的处理(可能会使用Microsoft提供的库)来填充argv和argc,但从根本上说,这不是windows为您所做的事情。因此,我认为没有一条规则适用于windows上的每个程序。说了这么多程序都遵循着一些共同的规则,所以你使用了类似于
CreateProcess()
的东西,而不是
ShellExecute()
。如果OP需要转义
,则看起来OP正在直接或通过类似
ShellExecute()
的方式调用
cmd