在Windows命令行中转义字符串

3

我试图通过命令行将字符串传递给Win32程序,以便原样打印。

为什么我必须将"AAA <BBB@pobox.com>"转义为"""AAA <BBB@pobox.com>"""
但是
"AAA <BBB@pobox.com>",(包括逗号)转义为"\"AAA ^<BBB@pobox.com^>\","

我看不出在Windows命令行中的转义规则有什么一致性。

P.S. 我正在尝试生成.cmd文件

更新:

我正在使用简单的C程序进行测试,该程序使用gcc编译,没有链接其他对象文件。如果我换成perl,规则保持不变。

我试图创建一个通用的转义算法。它将生成调用perl并进行输出重定向的.cmd文件。目前,我的问题是,如果字符串包含带反斜杠转义的奇数个双引号,则输出重定向无法正常工作。在http://blogs.msdn.com/b/oldnewthing/archive/2010/09/17/10063629.aspx的最后一条评论中描述了同样的问题。

如果我使用""作为"的转义符,它会在空格处分隔,因此结果会变成2个参数而不是一个。同时""也有一些附加效果。


你正在使用哪个命令解释器?参数拆分是它的一个函数,而不是Windows本身。 - user
1
我甚至不理解你的需求。据我所知,粗体字的第一行是VB转义引号的方式,而第二行是C(和其他类似的语言)的方式。如果这就是你所说的,那么它真的不是Windows操作系统,而是语言本身的语法。顺便问一下,你能否澄清你的问题? - UltraInstinct
1
我认为要得到一个好的答案,你需要更具体地了解环境。你是在谈论命令解释器的转义,还是针对特定应用程序的参数解析? - tenfour
由于我需要将 <> 传递给程序,因此我需要对命令解释器进行转义,但通常是针对一个程序(可能在背后使用 CommandLineToArgvW)。 - Alexandr Ciornii
@MichaelKjörling,我们可以假设他正在使用cmd,它在传递“CommandLine”之前不会进行参数拆分。 - binki
2个回答

7
在Windows中,获取命令行并解析它的方法不止一种。大多数程序都需要自己处理它们。
最近Raymond Chen发表了一篇关于CommandLineToArgvW函数的文章,提到了各种引用规则,但只适用于使用该特定函数的程序。http://blogs.msdn.com/b/oldnewthing/archive/2010/09/17/10063629.aspx 在Windows中,命令行传递给程序时不会被修改(即不会扩展通配符),因此程序需要自行处理它。编程语言可能提供方便的默认参数解析功能,可能使用标准的Windows函数,如CommandLineToArgvW,但即使如此,程序也可以选择读取未经修改的字符串,从而跳过这些标准。
这意味着您需要弄清楚您要编写脚本的特定程序的规则,然后使用它们。

略微不相关,但我想指出VC++至少提供了一种自动扩展通配符的方法,即通过将setargv.obj或wsetargv.obj链接到您的应用程序中。 - icabod
我的问题与通配符无关。一个简单的程序在没有任何额外调用或库的情况下在MSVC中编译仍然可以理解 "" " 和 ^。 - Alexandr Ciornii
1
一般的观点是程序应该准确地获得从命令行传递给你的内容。你使用的语言可能提供一些额外的处理(并且可能使用来自Microsoft的库)来填充argv和argc,但基本上这不是Windows为您执行的操作。因此,我认为没有一个适用于Windows上每个程序的单一规则。话虽如此,许多程序遵循常见的规则。 - Colin Newell

1

我刚刚尝试将它们作为参数传递给我的一个程序,无论是带逗号还是不带逗号的版本都可以用"""\"来转义引号。我唯一能想到第二个版本需要用^转义<>的原因是,由于字符串引号转义方式不同,命令行在将它们传递给应用程序之前将其视为I/O重定向。


所以你正在使用类似于CreateProcess()而不是ShellExecute()的东西。如果OP需要转义<>,看起来OP正在直接调用cmd或通过类似于ShellExecute()的东西进行调用。 - binki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接