运行Groovy时,Windows命令提示符的奇怪行为

5

我有一个Groovy脚本,可以重命名与正则表达式匹配的文件。我是这样启动它的:

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

它效果很好。

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

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

命令行返回了以下信息: 命令语法不正确 这不是我的脚本,而是 cmd 写的。即使我将参数(正则表达式)用引号括起来,它也会发生这种情况。 问:为什么?我该如何传递任何正则表达式作为参数?
由于没有人能够弄清楚发生了什么,因此我制作了一个更简单的示例: test.groovy
println args[0]

我运行它:groovy test Bob,输出是Bob,这没什么意外的。 但是当我运行例如 groovy test .* 时,会出现The syntax of the command is incorrect的错误。当我运行 groovy test * 时,输出的是同一个目录下的一个pdf文件名(恰好在test.groovy文件所在的目录下)。


你确定是cmd显示的吗?因为在Groovy上它只会给我一个文件未找到的错误。 - Joshua
是的,这是一条CMD消息。我很确定一些正则表达式字符在Windows中是保留/特殊字符,但是没有任何转义对我起作用。 - Queequeg
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 .*
.*

我本来想提交一个Bug报告,但看起来我必须先在项目网站上注册才能这样做,所以你可以提交一个。
附注:虽然问题是由startgroovy.bat中的错误引起的,但它还暴露了Windows批处理器中的一个错误(或者至少是一个奇怪的行为); 环境变量子字符串展开的行为在变量不存在时表现出奇怪的行为。 上面显示的if行在命令行上像预期的那样工作(没有环境变量替换),但在批处理文件中它被破坏了,变成了:
if "x~0,1_ARG:~1

因此出现了语法错误。

0

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


通过HarryJohnston的回答,结果证明我错了,但是神奇地走在了正确的轨道上。 - Joshua

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