@echo off&setlocal EnableDelayedExpansion set filePath=D:\1
set fileResult=D:\1\Result.txt set prefix=Pic
set isFound=0 set count=100 if exist "%fileResult%" del "%fileResult%" for /l %%i in (1,1,%count%) do ( set isFound=0 set n=000%%i set/p=.<nul for %%f in (%filePath%\%prefix%-*.*) do ( if exist %filePath%\%prefix%-!n:~-3!*.* set isFound=1 ) if !isFound!==0 ( echo %prefix%-!n:~-3!>>"%fileResult%" echo.%prefix%-!n:~-3!不存在 ) ) pause
邊寫邊找資料,學語法,收獲很大。文件是以XXX-001_xx.xxx這樣存在的,如Pic-023_1.jpg、Pic-003a.png之類,前綴固定,中間有-,后面3位數字(需前補0),再后面可能有其它字符,擴展名不固定。
1、使用循環里的元素:要先設置setlocal EnableDelayedExpansion,有些類似JS的閉包,不特別設置的話每次取的值已經是循環完的值了,不是當時循環的值
2、前補0:如1要補成001,10要補成010,要先弄個變量n=000%%i,再用!n:~-3!來補0
3、用echo的話,顯示完會換行,用set/p=.<nul的話,則不會換行,那個點是用來輸出的(模擬進度條效果),set/p是接收用戶輸入,<nul是跳過等待,即直接替用戶輸入了
4、過程實時輸出,最后也會輸到一個文本文件中
雙重循環,每次都要去遍歷文件判斷,效率很低。想弄個數組把文件名存起來,循環里只要取數組去判斷就可以了。大概弄了一下,沒最終弄出來,太遲了要睡了,算了吧。
bat里沒有原生數組,但可以模擬,如定義 set Array[%i%] = xxx,然后取 Array[0]、Array[1]這些就可以