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)
好的,这似乎是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)
因此出现语法错误。
| 归档时间: |
|
| 查看次数: |
981 次 |
| 最近记录: |