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

FINDSTR fails when the search string includes a minus character

我正在递归地检查所有 JS 文件并缩小它们。但是我必须保留一些 JS 文件。

我结合使用 fordirfindstr 取得了很大的成功。但是当我想忽略已经缩小的文件(以“-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(文字)标志。

处​​理 findstr 可执行文件参数的 C 运行时遵循一组规则。规则之一是使用双引号来保护单独参数中的 spaces/special 个字符,但是,一旦命令行被标记化并且参数被识别,引号就会在将单独的参数传递给主代码之前被删除。

也就是说这个命令

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"

的替代方法,我发现 findstr 也可以与前导破折号配合使用,前提是您至少包含 1 个 space 作为前缀(不按字面搜索时不会影响匹配)。

findstr /vile " -min.js"