传递包含引号的cmdline参数

时间:2017-07-06 13:05:23

标签: ruby windows

我试图创建一个运行以下命令的ruby脚本:

UV4.exe -j0 -cr test.uvprojx -t"test"

我试图将Open3.capture3用作:

Open3.capture3("UV4.exe", '-j0', '-cr', 'test.uvprojx', '-t"test"')

我遇到的问题是最后一个参数变为

"-t\"test\""

导致UV4(Keil uVision IDE)出错。如果我试图逃避我得到的报价

"-t\\\"test\\\""

这也显然是错误的。

如何才能使最后一个参数正确?

1 个答案:

答案 0 :(得分:2)

TL; DR - 在Ruby中使用'-ttest'而不是'-t"test"'

如果您输入

$ cmd -t"foo"

在命令行中,引号未传递给cmd。相反,cmd会收到一个参数-tfoo。它相当于:

$ cmd -tfoo

但如果你输入:

$ cmd -tfoo bar

然后cmd收到两个参数:-tfoobar,因为它们之间有空格。

为了避免这种情况,你必须以某种方式逃避空间。所有这些(以及更多)都可行:

$ cmd -tfoo\ bar
$ cmd -t"foo bar"
$ cmd "-tfoo bar"

使用上述任何一项,cmd会收到一个参数-tfoo bar

另一方面,在Ruby中,capture3将为您处理此问题,因此不需要引号。您只需将命令行参数作为单独的方法参数传递:

Open3.capture3('cmd', '-tfoo bar')     #  $ cmd -tfoo bar
Open3.capture3('cmd', '-tfoo', 'bar')  #  $ cmd -tfoo\ bar

如果添加" Ruby假定您想要传递字面字符:

Open3.capture3('cmd', '-t"foo bar"')

相当于:

$ cmd -t'"foo bar"'

cmd收到一个参数-t"foo bar",包括引号字符。