单引号和双引号:如何在unix和windows中具有相同的行为?

时间:2012-05-24 12:12:53

标签: windows batch-file

我有一个批处理脚本,它使用一些参数调用exe。

目前我正在将参数传递给我的exe:

$>my_cmd.exe %*

my_cmd.exe程序的其中一个选项采用可包含空格的参数

$>my_cmd.bat --req "in: lava"  (OK my prog receives in: lava)

$>my_cmd.bat --req 'in: lava'  (NOK my program receives 'in: lava')

用户使用无差别的单引号或双引号。

它适用于双引号,因为它们在批处理脚本级别被吃掉,但当它们使用'(单引号)时,它会被保留并传递给我的程序。

my_cmd是多平台,在unix上单引号和双引号都是特殊字符。

我希望避免在my_cmd程序中执行某些特定操作,具体取决于平台。

是否有办法在shell脚本和批处理脚本中具有相同的行为。 例如,批处理脚本如果存在则可以吃单引号?

告诉我什么是最适合你的解决方案。

非常感谢

2 个答案:

答案 0 :(得分:1)

在Windows上,参数处理(以及引用,通配等规则)是应用程序的责任。如果您的代码使用除包含所有带引号的参数的单个字符串之外的任何内容,请理解这是因为您的开发工具已对GetCommandLine的结果进行了一些预处理。因此,对于不同的报价处理,您需要查看开发工具,而不是操作系统。最好的选择通常是自己调用GetCommandLine并使用您选择的库来处理它,而不是编译器提供的库。

也就是说,Windows shell团队提供了其中一个库。见CommandLineToArgvW。但这不是核心操作系统的一部分,使用它完全是可选的。

此外,批处理器在进行变量替换时会考虑引号。而且这种行为很难改变或禁用,但听起来并不像是问题的根源。

答案 1 :(得分:0)

为什么不将报价改为加倍?

set args=%*
my_cmd.exe %args:'="%