batch的for循环有Bug????附代码
bat吧
全部回复
仅看楼主
level 1
RL🌐 楼主
::期望:无论选择什么后缀,loopCount都应该是10次!
::问题描述:选择【*】后缀的时候,loopCount为10次,正确;但只要是【非*】后缀,loopCount都会是11次,错误!!
@璐村惂鐢ㄦ埛_000076K馃惥 off
setlocal enabledelayedexpansion
set POSTFIX=.abc
::chcp 65001
::如果中文乱码,去掉chcp 65001的注释看看效果
set DIR=d:\test1
dir %DIR% || md %DIR% && goto :CreateFile
:Main
echo 进入主程序,任意继续...
pause >nul
set prefix=pre%random%fix
set /a num=0
set /p t=请选择输入后缀(输入0为星*后缀,输入其它为abc后缀):
if "%t%" equ "0" (
set EXT=.*
) else (
set EXT=%POSTFIX%
)
echo !!!!注意!!!选择的——————————————————————---【后缀是【%EXT%】】---!!!
::【无论进入哪个分支,loopCount为10符合预期】
::1、较稳定重现情况【符合预期】:cmd命令调用文件,后缀【先.*后.abc】交替选择执行,每次loopCount都是10。
::2、可能重现情况【小概率有一次机会符合预期】:删除创建好的文件,关机,待电脑冷却完毕,开机,双击.bat【先.*后.abc】,可能会出现loop为10的情况。
::::::::::::::::::选择非*后缀不符合预期的代码块::::::::::::::::::::::::::::::::
if "%EXT%" equ "%POSTFIX%" (
for %%i in ("%DIR%\*%EXT%") do (
set /a num+=1
ren "%%i" "%prefix%!num!%%~xi"
echo loopCount---------------------------------------!num!--进入【1】分支
)
) else (
for %%i in ("%DIR%\*%EXT%") do (
set /a num+=1
ren "%%i" "%prefix%!num!%EXT%"
echo loopCount---------------------------------------!num!--进入【2】分支
)
)
::::::::::::::::::选择非*后缀不符合预期的代码块::::::::::::::::::::::::::::::::
echo 文件改名完成,任意键退出...
pause >nul
goto :EOF
:CreateFile
echo 首次运行,自动创建测试文件,任意继续...
pause >nul
for /l %%i in (1,1,10) do (
echo.>"%DIR%\%random%-%%i%POSTFIX%"
)
goto :Main
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2019年09月19日 08点09分 1
level 1
RL🌐 楼主
功能描述:在d:\test1文件夹 里创建几个文件,然后选择后缀对文件重命名。
2019年09月19日 08点09分 2
level 9
@璐村惂鐢ㄦ埛_000076K馃惥 off
rem setlocal enabledelayedexpansion
set #=Any question&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$% %z%
set POSTFIX=.abc
set "DIR=d:\test1"
if not exist "%DIR%\*.*" (goto :CreateFile)
dir /a-d/b "%DIR%\"
:Main
echo 进入主程序,任意继续...
pause>nul
set "prefix=pre%random%fix"
set "t="
set /p t=请选择输入后缀(输入0为星*后缀,输入其它为abc后缀):
set EXT=.*
if "%t%" neq "0" (set EXT=%POSTFIX%)
echo !!!!注意!!!选择的—————————【后缀是【%EXT%】】---!!!
set num=0
for /f "delims=" %%i in ('dir /a-d/b "%DIR%\*%EXT%"') do (
set /a num+=1
set "file=%DIR%\%%~nxi"
setlocal enabledelayedexpansion
echo;"!file!" --^> "%prefix%!num!%%~xi"
ren "!file!" "%prefix%!num!%%~xi"
endlocal
)
echo;%#% +%$%%$% %z%
pause
exit
:CreateFile
echo 首次运行,自动创建测试文件,任意继续...
pause>nul
md "%DIR%\" 2>nul
for /l %%i in (1,1,10) do (echo.>"%DIR%\%random%-%%i%POSTFIX%")
goto :Main
2019年09月22日 03点09分 3
谢谢大哥。果然我写的那个有问题,都不知道哪里出错了。。
2019年09月23日 10点09分
我认真对比了,两份的核心不同之处。发现主要是for循环那里有区别。我写的那种,不知道为什么选择【非.*后缀】时会循环11次。 你写的那个循环的话循环次数是绝对确定的。我就想不懂我的为什么会有11次。 ; 输出显示的循环元素%%i取了两次1.abc那个文件。实在搞不懂!
2019年09月23日 13点09分
level 1
RL🌐 楼主
就这里循环元素%%i取了两次1.abc那个文件。真的是搞不懂
2019年09月23日 13点09分 4
1