Groovy:在命令行参数中使用“&”

6
这是Groovy脚本:

param = args[0]
println(param)

以下是我在Windows 7上运行它的方法:

groovy test.groovy a&b

我希望这个脚本打印出a&b,但是却得到了'b'不是内部或外部命令,也不是可运行的程序或批处理文件。

我尝试将参数(在我的情况下为a&b)用引号括起来,但没有帮助。双引号会使脚本挂起。单引号会导致与没有引号时相同的错误。

问题:是否可以将带有“&”的字符串作为Groovy脚本的命令行参数?


1
这是一个Windows命令行的问题。有一堆建议的修复方法,包括使用插入符号进行转义和使用双引号,但似乎都不起作用。 - Nathan Hughes
1
你刚才尝试过在Windows上使用groovy test a^&b,但是没有成功吗?你使用的是哪个“shell”?只是普通的cmd还是其他的?我真的怀疑这不是一个Groovy的问题。 - cfrick
2
要在评论中提到某人并通知他们,可以在他们的名字前加上@符号。 - Nathan Hughes
1
我会删除Java标签,添加Windows-oid标签,看看是否能在SO上吸引Windows用户的注意。 - cfrick
@cfrick,谢谢,搞定了。 - Racoon
显示剩余6条评论
1个回答

5
在Windows上执行groovy时,我们实际上是执行%GROOVY_HOME\groovy.bat,然后(来自groovy.bat): "%DIRNAME%\startGroovy.bat" "%DIRNAME%" groovy.ui.GroovyMain %* 如果我们查看startGroovy.bat的内容,可以看到一个非常丑陋的hack来处理参数(下面是一段摘录):
rem horrible roll your own arg processing inspired by jruby equivalent

rem escape minus (-d), quotes (-q), star (-s).
set _ARGS=%*
if not defined _ARGS goto execute
set _ARGS=%_ARGS:-=-d%
set _ARGS=%_ARGS:"=-q%
set _ARGS=%_ARGS:?=-n%

rem Windowz will try to match * with files so we escape it here
rem but it is also a meta char for env var string substitution
rem so it can't be first char here, hack just for common cases.
rem If in doubt use a space or bracket before * if using -e.
set _ARGS=%_ARGS: *= -s%
set _ARGS=%_ARGS:)*=)-s%
set _ARGS=%_ARGS:0*=0-s%
set _ARGS=%_ARGS:1*=1-s%
set _ARGS=%_ARGS:2*=2-s%
set _ARGS=%_ARGS:3*=3-s%
set _ARGS=%_ARGS:4*=4-s%
set _ARGS=%_ARGS:5*=5-s%
set _ARGS=%_ARGS:6*=6-s%
set _ARGS=%_ARGS:7*=7-s%
set _ARGS=%_ARGS:8*=8-s%
set _ARGS=%_ARGS:9*=9-s%

因此,在startyGroovy.bat文件中,"a&b"被"转义"为-qa&b-q,导致脚本内出现两个命令,如下所示:
'b-q' is not recognized as an internal or external command,
operable program or batch file.

当进行“取消转义”时,可能会导致无限循环。

在运行Groovy脚本之前,可以使用set DEBUG=true来查看。

通过以下方式,在startGroovy.bat中增加另一个hack来逃避同样的问题:转义&

rem escape minus (-d), quotes (-q), star (-s).
rem jalopaba escape ampersand (-m)
set _ARGS=%*
if not defined _ARGS goto execute
set _ARGS=%_ARGS:-=-d%
set _ARGS=%_ARGS:&=-m%
set _ARGS=%_ARGS:"=-q%
set _ARGS=%_ARGS:?=-n%

and unescape...

rem now unescape -s, -q, -n, -d
rem jalopaba unescape -m
rem -d must be the last to be unescaped
set _ARG=%_ARG:-s=*%
set _ARG=%_ARG:-q="%
set _ARG=%_ARG:-n=?%
set _ARG=%_ARG:-m=&%
set _ARG=%_ARG:-d=-%

因此:

groovy test.groovy "a&b"
a&b

不确定在Windows中是否存在更清晰/更优雅的解决方案。

您可以看到类似情况,例如groovy -e "println 2**3"在UNIX控制台中产生8,但在Windows中会出现无限循环(死循环)。


非常感谢您宝贵的评论!我之前尝试过这个选项,但在我的环境(Windows 7 x64)中,Groovy test.groovy "a&b"会一直卡住... - Racoon
让我深入探讨一下。看起来我在转义&符号时错了。我会再试一下。 - Racoon

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