加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 运行常规时Windows CMD的奇怪行为

发布时间:2020-12-14 02:29:17 所属栏目:百科 来源:网络整理
导读:我有一个groovy脚本重命名与正则表达式匹配的文件 我这样推出它 C:groovy rename test.* test.txt 它工作正常. 但是当我试图传递这个正则表达式时: C:groovy rename test.(.*) $1_TEST_$1 命令行返回一条消息: 该命令的语法不正确 并且它不是我的脚本
我有一个groovy脚本重命名与正则表达式匹配的文件
我这样推出它
C:&;groovy rename test.* test.txt

它工作正常.

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

C:&;groovy rename test.(.*) $1_TEST_$1

命令行返回一条消息:

该命令的语法不正确

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

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

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

test.groovy

println args[0]

我运行它:groovy测试鲍勃和输出,并不令人惊讶,鲍勃.
但是当我跑步时,groovy test.*我得到命令的语法不正确.当我运行它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%

但问题是以前几行:

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

因此语法错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读