今天原本打算在win7做一个:“在bat根目录下所有文件或子文件里,找到'全字符匹配'的目标文件,并输出它的路径”的bat脚本,用来方便对我自己给自己工程贴上标签的工程文件进行快速查找和管理。(同时说明找到一个好的版本管理工具并好好学,真的能受用一生,当然这里只是我自己给自己的电脑文件进行快捷管理所以才搞的这么一出)
然后基本的步骤设计出来后,碰到了一个非常让人琢磨不透的问题:“命令FindStr:无法打开XXX路径”,当然到现在也没有知道根本原因,但至少总结出来供大家参考,毕竟问题真的非常的少见。
先给出结论吧:因为开启了变量延时扩展功能,导致文件命名中用到了"启动本地变量延迟扩展"的关键字' ! '。
探究过程:
一个最初的ver如下(这里功能是在“work_path”目录下寻找带有“c”字符串全字符匹配成功的“所有_tag.txt的文件路径”对控制台进行输出):
@echo off
set work_path=D:\!!!开发者日记\
set filename=_tag.txt
set key_word=c
echo 当前关键字:%key_word%
cd /d %work_path%
FOR /F %%i IN ('dir /b /s %filename%') DO (
FINDSTR /i /m "\<%key_word%\>" %%i >1.txt
(set /p a=)<1.txt
echo %a%
)
pause
这里看似没有什么问题,然后理所当然的犯了几乎所有初学for循环的人的错误:“没有开启变量延迟扩展”,当然最后修正了,得到了下面的版本:
@echo off &setlocal enabledelayedexpansion
set work_path=D:\!!!开发者日记\
set filename=_tag.txt
set key_word=c
echo 当前关键字:%key_word%
cd /d %work_path%
FOR /F %%i IN ('dir /b /s %filename%') DO (
Findstr /i /m "\<%key_word%\>" %%i >1.txt
(set /p a=)<1.txt
echo.!a!
)
pause
修改过后问题依旧存在,修改前后的代码都出现了如下所示的问题:
当前关键字:c
系统找不到指定的路径。
FINDSTR: 无法打开 D:\开发者日记\_tag.txt
FINDSTR: 无法打开 D:\开发者日记\20170715\_tag.txt
FINDSTR: 无法打开 D:\开发者日记\20170716\_tag.txt
//...
//这里省略一万行...
请按任意键继续. . .
然后找了1个小时的问题,最后发现:“\开发者日记\”这一段输出里少了3个感叹号!!!
最后就是发现了这个问题,还以为是不是FOR指令里的变量名在处理过程给错了,查了很久的有关For循环的资料和博客,最后发现是因为:setlocal enabledelayedexpansion的添加,导致变量路径名自动给我去掉了感叹号,最后导致的FINDSTR无法打开的问题。(至于原因是什么,我也没有深究,似乎并没有什么实际意义)
问题发现后,发现自己还是不够认真的查看问题错误,不过自己原本就是属于临时性的想用window自带的bat命令做一个比win7搜索框自带的搜索功能还要快的关键字搜索而已,所以本来就不熟悉批处理语法的我在制作过程中问题多多。这里也劝告大家:
不要用下划线"_"以外的特殊字符给文件或文件夹命名了,特别容易出各种各样的小问题。