
BAT兩個(gè)for循環(huán)嵌套兩個(gè)變量值為什么會(huì)重復(fù)在E:下有一個(gè)文件夾:E:測(cè)試照片批量重命名,在這個(gè)文件夾下存放著一個(gè)照片文件夾:E:測(cè)試照片批量重命名,一個(gè)存入學(xué)生信息的EXCEL數(shù)據(jù)表另存而得的以制表符分隔的文本文件:E:測(cè)試照片批量重命名3.txt。現(xiàn)在我想從3.txt文件中跳過(guò)前面6行提取第二列的數(shù)據(jù):學(xué)生姓名,把E:測(cè)試照片批量重命名文件夾下的照片名批量以學(xué)生姓名重新命名。因?yàn)槭菧y(cè)試,所以我把文件夾里的照片和學(xué)生信息表中的數(shù)據(jù)都只保留了8個(gè)學(xué)生的信息。我的代碼是這樣的:1、第一次測(cè)試:
運(yùn)行后,在b.bat中得到的結(jié)果怎么會(huì)是下面這樣呢?每一個(gè)學(xué)生的名字為什么會(huì)重復(fù)出現(xiàn)與每一張照片名對(duì)應(yīng)呢?然后每一張照片再重復(fù)也每一個(gè)學(xué)生的名字對(duì)應(yīng)一次,也就是%%i的第一個(gè)值會(huì)重復(fù)出現(xiàn)與%%b的每一個(gè)值對(duì)應(yīng)一次,然后%%i的第二個(gè)值再重復(fù)出現(xiàn)與%%b的每一個(gè)值對(duì)應(yīng)一次,然后是%%i的第三個(gè)值重復(fù)出現(xiàn)與%%b的每一個(gè)值對(duì)應(yīng),一直這樣直到%%i的最后一個(gè)值。ren DSC01820.JPG 張燦.jpgren DSC01821.JPG 張燦.jpgren DSC01822.JPG 張燦.jpgren DSC01823.JPG 張燦.jpgren DSC01824.JPG 張燦.jpgren DSC01825.JPG 張燦.jpgren DSC01826.JPG 張燦.jpgren DSC01827.JPG 張燦.jpgren DSC01820.JPG 王宇.jpgren DSC01821.JPG 王宇.jpgren DSC01822.JPG 王宇.jpgren DSC01823.JPG 王宇.jpgren DSC01824.JPG 王宇.jpgren DSC01825.JPG 王宇.jpgren DSC01826.JPG 王宇.jpgren DSC01827.JPG 王宇.jpgren DSC01820.JPG 李俊輝.jpgren DSC01821.JPG 李俊輝.jpgren DSC01822.JPG 李俊輝.jpgren DSC01823.JPG 李俊輝.jpgren DSC01824.JPG 李俊輝.jpgren DSC01825.JPG 李俊輝.jpgren DSC01826.JPG 李俊輝.jpgren DSC01827.JPG 李俊輝.jpgren DSC01820.JPG 謝李洋.jpgren DSC01821.JPG 謝李洋.jpgren DSC01822.JPG 謝李洋.jpgren DSC01823.JPG 謝李洋.jpgren DSC01824.JPG 謝李洋.jpgren DSC01825.JPG 謝李洋.jpgren DSC01826.JPG 謝李洋.jpgren DSC01827.JPG 謝李洋.jpgren DSC01820.JPG 江豪.jpgren DSC01821.JPG 江豪.jpgren DSC01822.JPG 江豪.jpgren DSC01823.JPG 江豪.jpgren DSC01824.JPG 江豪.jpgren DSC01825.JPG 江豪.jpgren DSC01826.JPG 江豪.jpgren DSC01827.JPG 江豪.jpgren DSC01820.JPG 楊宣坤.jpgren DSC01821.JPG 楊宣坤.jpgren DSC01822.JPG 楊宣坤.jpgren DSC01823.JPG 楊宣坤.jpgren DSC01824.JPG 楊宣坤.jpgren DSC01825.JPG 楊宣坤.jpgren DSC01826.JPG 楊宣坤.jpgren DSC01827.JPG 楊宣坤.jpgren DSC01820.JPG 李瀟.jpgren DSC01821.JPG 李瀟.jpgren DSC01822.JPG 李瀟.jpgren DSC01823.JPG 李瀟.jpgren DSC01824.JPG 李瀟.jpgren DSC01825.JPG 李瀟.jpgren DSC01826.JPG 李瀟.jpgren DSC01827.JPG 李瀟.jpgren DSC01820.JPG 錢(qián)森.jpgren DSC01821.JPG 錢(qián)森.jpgren DSC01822.JPG 錢(qián)森.jpgren DSC01823.JPG 錢(qián)森.jpgren DSC01824.JPG 錢(qián)森.jpgren DSC01825.JPG 錢(qián)森.jpgren DSC01826.JPG 錢(qián)森.jpgren DSC01827.JPG 錢(qián)森.jpg2、第二次測(cè)試:我又把代碼作了一下修改,調(diào)換了兩個(gè)for的位置:nclick="copycode($('code0'));">復(fù)制代碼
- echo on
- setlocal enabledelayedexpansion
- for /f delims=U %%a in ('cmd /u/c echo 唉') do set tab=%%a
- if exist a.txt del a.txt
- if exist b.bat del b.bat
- cd /d E:測(cè)試照片批量重命名
- dir /b/od>E:測(cè)試照片批量重命名a.txt
- for /f skip=6 tokens=2 delims=%tab% %%i in ('type E:測(cè)試照片批量重命名3.txt') do (
- for /f tokens=1 delims= %%b in (E:測(cè)試照片批量重命名a.txt) do echo ren %%b %%i.jpg>>E:測(cè)試照片批量重命名b.bat)
這時(shí)運(yùn)行后在b.bat中得到的結(jié)果是下面這樣的,是%%b的第一個(gè)值重復(fù)出現(xiàn)與每一個(gè)%%i的值對(duì)應(yīng)一次,然后%%b的第二個(gè)值重復(fù)出現(xiàn)對(duì)應(yīng)%%i的每一個(gè)值,直到最后一個(gè)%%b的值。結(jié)果如下:ren DSC01820.JPG 張燦.jpgren DSC01820.JPG 王宇.jpgren DSC01820.JPG 李俊輝.jpgren DSC01820.JPG 謝李洋.jpgren DSC01820.JPG 江豪.jpgren DSC01820.JPG 楊宣坤.jpgren DSC01820.JPG 李瀟.jpgren DSC01820.JPG 錢(qián)森.jpgren DSC01821.JPG 張燦.jpgren DSC01821.JPG 王宇.jpgren DSC01821.JPG 李俊輝.jpgren DSC01821.JPG 謝李洋.jpgren DSC01821.JPG 江豪.jpgren DSC01821.JPG 楊宣坤.jpgren DSC01821.JPG 李瀟.jpgren DSC01821.JPG 錢(qián)森.jpgren DSC01822.JPG 張燦.jpgren DSC01822.JPG 王宇.jpgren DSC01822.JPG 李俊輝.jpgren DSC01822.JPG 謝李洋.jpgren DSC01822.JPG 江豪.jpgren DSC01822.JPG 楊宣坤.jpgren DSC01822.JPG 李瀟.jpgren DSC01822.JPG 錢(qián)森.jpgren DSC01823.JPG 張燦.jpgren DSC01823.JPG 王宇.jpgren DSC01823.JPG 李俊輝.jpgren DSC01823.JPG 謝李洋.jpgren DSC01823.JPG 江豪.jpgren DSC01823.JPG 楊宣坤.jpgren DSC01823.JPG 李瀟.jpgren DSC01823.JPG 錢(qián)森.jpgren DSC01824.JPG 張燦.jpgren DSC01824.JPG 王宇.jpgren DSC01824.JPG 李俊輝.jpgren DSC01824.JPG 謝李洋.jpgren DSC01824.JPG 江豪.jpgren DSC01824.JPG 楊宣坤.jpgren DSC01824.JPG 李瀟.jpgren DSC01824.JPG 錢(qián)森.jpgren DSC01825.JPG 張燦.jpgren DSC01825.JPG 王宇.jpgren DSC01825.JPG 李俊輝.jpgren DSC01825.JPG 謝李洋.jpgren DSC01825.JPG 江豪.jpgren DSC01825.JPG 楊宣坤.jpgren DSC01825.JPG 李瀟.jpgren DSC01825.JPG 錢(qián)森.jpgren DSC01826.JPG 張燦.jpgren DSC01826.JPG 王宇.jpgren DSC01826.JPG 李俊輝.jpgren DSC01826.JPG 謝李洋.jpgren DSC01826.JPG 江豪.jpgren DSC01826.JPG 楊宣坤.jpgren DSC01826.JPG 李瀟.jpgren DSC01826.JPG 錢(qián)森.jpgren DSC01827.JPG 張燦.jpgren DSC01827.JPG 王宇.jpgren DSC01827.JPG 李俊輝.jpgren DSC01827.JPG 謝李洋.jpgren DSC01827.JPG 江豪.jpgren DSC01827.JPG 楊宣坤.jpgren DSC01827.JPG 李瀟.jpgren DSC01827.JPG 錢(qián)森.jpg請(qǐng)高手幫忙分析一下,為什么會(huì)出現(xiàn)這樣的情況呢?為什么第一個(gè)for的變量的值會(huì)重復(fù)出現(xiàn)呢??jī)蓚€(gè)for的變量值為什么不同步呢?3、第三次測(cè)試:在一位熱心網(wǎng)友的幫助下,幫我修改了一下代碼,運(yùn)行后在b.bat文件中能得到正確結(jié)果,沒(méi)有重復(fù),但是在CMD窗口中同樣是重復(fù)出現(xiàn)了每一個(gè)學(xué)生的名字與第一張照片對(duì)應(yīng),再重復(fù)出現(xiàn)與第二照片名對(duì)應(yīng),運(yùn)行速度比較慢:代碼如下:nclick="copycode($('code1'));">復(fù)制代碼
- echo on
- setlocal enabledelayedexpansion
- for /f delims=U %%a in ('cmd /u/c echo 唉') do set tab=%%a
- if exist a.txt del a.txt
- if exist b.bat del b.bat
- pause
- cd /d E:測(cè)試照片批量重命名
- dir /b/od>E:測(cè)試照片批量重命名a.txt
- for /f tokens=1 delims= %%b in (E:測(cè)試照片批量重命名a.txt) do (
- for /f skip=6 tokens=2 delims=%tab% %%i in ('type E:測(cè)試照片批量重命名3.txt') do echo ren %%b %%i.jpg>>E:測(cè)試照片批量重命名b.bat)
運(yùn)行后,在b.bat文件中得到的語(yǔ)句如下:ren DSC01820.JPG 張燦.jpgren DSC01821.JPG 王宇.jpgren DSC01822.JPG 李俊輝.jpgren DSC01823.JPG 謝李洋.jpgren DSC01824.JPG 江豪.jpgren DSC01825.JPG 楊宣坤.jpgren DSC01826.JPG 李瀟.jpgren DSC01827.JPG 錢(qián)森.jpg可是我用echo on以后,去看CMD窗口,里面同樣重復(fù)對(duì)應(yīng)過(guò)!4、第四次測(cè)試:在一個(gè)高手的幫助下,他幫我把代碼再次修改成了下面那樣,這次運(yùn)行速度很快,CMD窗口中沒(méi)有出現(xiàn)重復(fù),運(yùn)行后在b.bat文件中得到了正確的結(jié)果,代碼如下:nclick="copycode($('code2'));">復(fù)制代碼
- @echo on
- setlocal enabledelayedexpansion
- for /f delims=U %%a in ('cmd /u/c echo 唉') do set tab=%%a
- if exist a.txt del a.txt
- if exist b.bat del b.bat
- pause
- cd /d E:測(cè)試照片批量重命名
- dir /b/od>E:測(cè)試照片批量重命名a.txt
- for /f skip=6 tokens=2 delims=%tab% %%i in ('type E:測(cè)試照片批量重命名3.txt') do (
- set /a n+=1
- for /f tokens=1 delims= %%b in (E:測(cè)試照片批量重命名a.txt) do echo %%b>>E:測(cè)試照片批量重命名b.bat)
- set /a m+=1
- if /i !n!==!m! echo ren %%b %%i.jpg>>E:測(cè)試照片批量重命名b.bat)
- set m=0)
這時(shí)得到了正確的結(jié)果:ren DSC01820.JPG 張燦.jpgren DSC01821.JPG 王宇.jpgren DSC01822.JPG 李俊輝.jpgren DSC01823.JPG 謝李洋.jpgren DSC01824.JPG 江豪.jpgren DSC01825.JPG 楊宣坤.jpgren DSC01826.JPG 李瀟.jpgren DSC01827.JPG 錢(qián)森.jpg這一次的代碼,同樣是兩個(gè)for循環(huán)的嵌套啊,怎么運(yùn)行結(jié)果卻不相同呢?請(qǐng)高手們幫忙解釋一下。nclick="copycode($('code3'));">復(fù)制代碼
- @echo on&setlocal enabledelayedexpansion
- if exist b.bat del b.bat
- for /f delims=U %%a in ('cmd /u /c echo 唉') do set tab=%%a
- cd /d E:測(cè)試照片批量重命名
- (for /f delims= %%a in ('echo ##^&echo ##^&dir /b/od *.jpg') do (
- set/p fn=
- if not %%a==## (
- for /f tokens=2 delims=%tab% %%b in (!fn!) do echo ren %%a %%b.jpg>>E:測(cè)試照片批量重命名b.bat
- )
- ))<E:測(cè)試照片批量重命名3.txt
- pause

