运行常规时Windows CMD的奇怪行为

时间:2012-10-05 15:28:58

标签: regex windows groovy cmd

我有一个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位于同一个目录中)

2 个答案:

答案 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解析器通配符扩展正则表达式。