[bat腳本]開啓本地變量延遲擴展,導致錯誤:“無法打開”

今天原本打算在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搜索框自帶的搜索功能還要快的關鍵字搜索而已,所以本來就不熟悉批處理語法的我在製作過程中問題多多。這裏也勸告大家:

不要用下劃線"_"以外的特殊字符給文件或文件夾命名了,特別容易出各種各樣的小問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章