我有一个groovy脚本,它重命名与正则表达式匹配的文件 我这样推出它
C:\>groovy rename test.* test.txt
工作正常。
但是当我试图传递这个正则表达式时:
C:\>groovy rename test\.(.*) $1_TEST_$1
命令行返回一条消息:
The syntax of the command is incorrect
并且它不是我的脚本 - 它的cmd
写了这个。我的脚本甚至都没有运行。即使我将参数(regex)包装在引号中也会发生。
问:为什么?我如何将任何正则表达式作为参数传递?
<小时/> 由于没有人能弄清楚发生了什么,我做了一个更简单的例子:
test.groovy
println args[0]
我运行它:groovy test Bob
并且输出Bob
并不令人惊讶。
但是当我跑步时, groovy test .*
我得The syntax of the command is incorrect
。当我运行它groovy test *
时,会出现一个pdf文件的名称(恰好与test.groovy
位于同一个目录中)
答案 0 :(得分: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
因此语法错误。
答案 1 :(得分:0)
检查groovy的编译选项。它可能使用wildargs编译,这会导致stdlib解析器通配符扩展正则表达式。