当搜索字符串包含减号字符时,FINDSTR失败

4
我正在递归地压缩所有JS文件,但我必须留下一些JS文件不变。
我尝试使用 for、dir 和 findstr 的组合命令,已经取得了很多成功。但是当我想要忽略已经压缩的文件(以“-min.js”结尾的文件)时,FINDSTR 命令无法正常执行。
这是我使用的命令:
for /f %i in ('dir /b /a-d /s "D:\update" ^| findstr /liv "\admin" ^| findstr /ile ".js" ^| findstr /vile "-min.js" ^| findstr /vile ".min.js"') do echo %i

以下是出现的错误:

FINDSTR: /. ignored
FINDSTR: /j ignored
FINDSTR: Bad command line
FINDSTR: Write error
FINDSTR: Write error
FINDSTR: Write error
FINDSTR: Write error

问题肯定出在 findstr /vile "-min.js" 子句上,然而我不知道为什么连字符会导致问题,因为我使用了 /l(字面量)标志。

1
Try "\-min.js"? - melpomene
2个回答

4

处理 findstr 可执行文件参数的C运行时程序遵循一组规则。其中一个规则是使用双引号来保护单独参数内的空格/特殊字符,但是一旦命令行被标记化并识别出参数后,在将单独参数传递给主代码之前,引号会被移除。

这意味着该命令

findstr /vile "-min.js"

将在可执行文件内部处理为

argv[0] = findstr 
argv[1] = /vile
argv[2] = -min.js

而且,由于findstr接受参数分组(如/vile), 但它还允许以/-开头的参数, 所以-m, -i, -n, -s开关(全部有效)都被接受,但-.-j(未知)则被忽略。
命令行不好用,因为在参数中找不到搜索字符串。
文档记录的(findstr /?)解决方案是使用/c:"stringToMatch"语法。
findstr /vile /c:"-min.js"

或者你可以使用转义字符,这样-就不会被处理为选项参数的初始字符。
findstr /vile "\-min.js"

@dbenham,也许还有一个要包括的案例。 - MC ND


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接