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

Que*_*ueg 5 regex windows groovy cmd

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

C:\>groovy rename test.* test.txt
Run Code Online (Sandbox Code Playgroud)

它工作正常.

但是当我试图传递这个正则表达式时:

C:\>groovy rename test\.(.*) $1_TEST_$1
Run Code Online (Sandbox Code Playgroud)

命令行返回一条消息:

The syntax of the command is incorrect

而且这不是我的剧本 - 它 cmd写的是这个.我的脚本甚至都没有运行.即使我将参数(regex)包装在引号中也会发生.

问:为什么?我怎样才能将任何正则表达式作为参数传递?


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

test.groovy

println args[0]
Run Code Online (Sandbox Code Playgroud)

我运行它:groovy test Bob输出并不令人惊讶Bob.但是当我跑步时,groovy test .*我得到了The syntax of the command is incorrect.当我运行它groovy test *然后出现一个pdf文件的名称(恰好在同一个目录中test.groovy)

Har*_*ton 4

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

rem remove the leading space we'll add the first time
if "x%_ARG:~0,1%" == "x " set _ARG=%_ARG:~1%
Run Code Online (Sandbox Code Playgroud)

但问题出在前面几行:

rem remove quotes around first arg
for %%i in (%1) do set _ARG=%_ARG% %%~i
Run Code Online (Sandbox Code Playgroud)

如果参数包含通配符,这将无法按预期工作。某些情况(包括单个星号)在脚本的早期就得到了解决,而其他一些情况则由于通配符成功匹配而得到解决;在这种情况下,您不会收到错误,但匹配的文件会传递到 Groovy 脚本而不是通配符。也有一些情况,通配符会匹配,但不会匹配,因为解决方法已经破坏了它。

据我所知,其目的是不处理通配符,因此修复方法很简单:

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

现在它对我有用:

H:\>groovy test .*
.*
Run Code Online (Sandbox Code Playgroud)

我本来打算提交一份错误报告,但看起来如果不先在项目网站上注册我就无法这样做,所以如果您愿意,您可以提交一份报告。

边注:

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

if "x~0,1_ARG:~1
Run Code Online (Sandbox Code Playgroud)

因此出现语法错误。