在cmd.exe中测试时,Findstr正则表达式工作正常,并且不能用作脚本

时间:2016-08-16 08:29:13

标签: batch-file

我在命令行界面和批处理脚本中获得了相同表达式的不同结果。在以下行的命令行界面中:

FOR /F "tokens=1,2 delims=()"  %x in ( 'Dir /b !destination! ^| FINDSTR /R /C:"AB1234[^-]"' ) do SET "Katalog=%x(%y)"

我得到了预期的结果:

  

“目录促销= AB1234(MNS00000123456789)”

表示批处理脚本中的等效表达式:

FOR /F "tokens=1,2 delims=()"  %%x in ( 'Dir /b !destination! ^| FINDSTR /R /C:"AB1234[^-]"' ) do SET "Katalog=%%x(%%y)"

结果不同:

  

“目录促销= AB1234-2(Mnk1233210006789)”

我应该说我有两个类似的目录,每个目录以AB1234开头,第一个是AB1234(MNS00000123456789),第二个AB1234-2(Mnk1233210006789)。我使用正则表达式[^-]希望消除第二个目录但它在脚本中不起作用。请帮我找到解决方案。

1 个答案:

答案 0 :(得分:1)

第一个表达式也失败了,但我怀疑,你在命令行中使用!destination!部分进行了测试。

!destination!部分会产生问题,因为您使用延迟扩展和延迟扩展将使其自己的插入符号的退出阶段独立于引号,但仅当行中至少有一个感叹号时。

这就是为什么[^-]中的插入符号会被删除的原因。

解决方案很简单,插入符号加倍。

FOR /F "tokens=1,2 delims=()"  %%x in ( 'Dir /b !destination! ^| FINDSTR /R /C:"AB1234[^^-]"' ) do SET "Katalog=%%x(%%y)

或者不要'在这里使用延迟扩展

FOR /F "tokens=1,2 delims=()"  %%x in ( 'Dir /b "%destination%" ^| FINDSTR /R /C:"AB1234[^-]"' ) do SET "Katalog=%%x(%%y)