【问题标题】:Single quotes and double quotes: How to have the same behaviour in unix and windows?单引号和双引号:如何在 unix 和 windows 中具有相同的行为?
【发布时间】:2012-05-25 01:57:28
【问题描述】:

我有一个批处理脚本,它调用带有一些参数的 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 脚本和批处理脚本中具有相同的行为。 例如,如果存在,批处理脚本可以吃单引号?

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

非常感谢

【问题讨论】:

  • 我对这类问题的解决方案是使用 Windows 和 Unix 中存在的东西(而不是试图让 2 个不同的解释器表现相同)。例如:Perl 或 Ruby。或者切换到 Cygwin 并在两边都使用 Bash。实际上,这就是我刚开始接触 Perl 编程的方式。
  • 这是我在使用 Python 时所做的,但我仍然需要将参数传递给 Python 程序。 Problem is that on Windows when the option is --req 'in: lava' I get on the python side 'in: lava' as on Linux I get in:lava.所以我需要欺骗我的解析类来处理单引号,我对此并不满意。
  • 是的,Windows 中的报价处理很麻烦。试试“cmd /?”并仔细阅读帮助文本。 /s 开关可能会有所帮助。
  • ... 或不... 我无法让您的示例起作用。到目前为止我找到的最好的参考是[here]。
  • 感谢您的参考。你是什​​么意思,你不能让我的例子起作用?

标签: windows batch-file


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    为什么不把引号改为双引号?

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

    【讨论】:

    • 你想引用一个包含引号的字符串会发生什么? perl -e 'my $var = "this is a quoted string"; print $var;'
    • 不会有任何好处,我一直假设两个引号仅用作 OP 所述的特殊字符。
    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 2018-04-28
    • 2012-04-07
    • 1970-01-01
    • 2013-02-16
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多