运行groovy时windows CMD的怪异行为

我有一个groovy脚本,重命名文件,匹配正则expression式我这样启动它

C:\>groovy rename test.* test.txt 

它工作正常。

但是当我尝试传递这个正则expression式时:

 C:\>groovy rename test\.(.*) $1_TEST_$1 

命令行会返回一条消息:

The syntax of the command is incorrect

这不是我的脚本 – 它的cmd写这个。 我的脚本从来没有运行。 即使我把参数(正则expression式)换成引号也会发生。

问:为什么? 我怎么能通过任何正则expression式作为参数?


由于没有人能够弄清楚发生了什么,我做了一个更简单的例子:

test.groovy

 println args[0] 

我运行它: groovy test Bob和输出,不出人意料, Bob 。 但是当我运行如groovy test .*我得到The syntax of the command is incorrect 。 当我运行它groovy test *然后一个PDF文件的名称出来(这恰好是在test.groovy相同的目录)

Solutions Collecting From Web of "运行groovy时windows CMD的怪异行为"

好的,这似乎是startgroovy.bat批处理文件中的一个错误。 错误发生在这里:

 rem remove the leading space we'll add the first time if "x%_ARG:~0,1%" == "x " set _ARG=%_ARG:~1% 

但是这个问题之前有几行:

 rem remove quotes around first arg for %%i in (%1) do set _ARG=%_ARG% %%~i 

如果参数包含通配符,则这不起作用。 某些情况下(包括一个星号)在脚本的早些时候和其他类型的工作,因为通配符匹配成功; 在这种情况下,您不会收到错误,但匹配的文件将传递到Groovy脚本而不是通配符。 也有通配符匹配的情况,但不是因为解决方法已经改变了它。

就我所知,目的是不处理通配符,所以修复很简单:

 rem remove quotes around first arg for /F %%i in (%1) do set _ARG=%_ARG% %%~i 

现在它适用于我:

 H:\>groovy test .* .* 

我打算提交一个错误报告,但看起来如果不先注册到项目网站,我就不能这样做,所以你可以提交一个,如果你喜欢。

边注:

虽然问题是由startgroovy.bat的错误引起的, startgroovy.bat它也暴露了Windows批处理器中的一个错误(或至少是一个奇怪的行为)。 如果变量不存在,环境变量子字符串扩展的行为会很奇怪。 上面显示的if行在命令行上按预期的方式工作(没有环境变量替换),但在批处理文件中,它被破坏,出现如下:

 if "x~0,1_ARG:~1 

因此,语法错误。

检查groovy的编译选项。 它可能与wildargs编译,这会导致stdlib解析器通配符扩展正则表达式。