5

我有一个 groovy 脚本,可以重命名与正则表达式匹配的文件我以这种方式启动它

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

它工作正常。

但是当我尝试通过这个正则表达式时:

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

命令行返回一条消息:

The syntax of the command is incorrect

这不是我的剧本——它 cmd是写这个的。我的脚本甚至从未运行过。即使我将参数(正则表达式)用引号括起来,它也会发生。

问:为什么?如何将任何正则表达式作为参数传递?


由于没有人知道发生了什么,我做了一个更简单的例子:

test.groovy

println args[0]

我运行它:groovy test Bob结果不出所料地是Bob. 但是当我跑步时,groovy test .*我得到了The syntax of the command is incorrect。当我运行它时groovy test *,会出现一个 pdf 文件的名称(恰好与 位于同一目录中test.groovy

4

2 回答 2

4

好的,这似乎是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但它也暴露了 Windows 批处理器中的错误(或至少是奇怪的行为);如果变量不存在,环境变量子字符串扩展的行为会很奇怪。上面显示的if行在命令行上按预期工作(没有环境变量替换),但是在批处理文件中它被破坏了,结果如下:

if "x~0,1_ARG:~1

因此语法错误。

于 2012-10-07T21:22:42.690 回答
0

检查 groovy 的编译选项。它可能使用通配符编译,这将导致 stdlib 解析器对正则表达式进行通配符扩展。

于 2012-10-05T16:22:53.207 回答