标签循环似乎无故崩溃
Label loop crashes seemingly without reason
别问我为什么,我试着创建一个由文件夹组成的5位代码。
下面的代码看起来很有希望,但是在文件夹 0[=15=][=15=] 它崩溃了: returns 0[=15=][=15=]\%E% 已经存在。
可以在代码中找到 %E% 的定义。
@echo off
set A=0
set B=0
set C=0
set D=0
set E=-1
:A
set /a E=E+1
if %E%==10 (set E=0 && set /a D=D+1)
if %D%==10 (set D=0 && set /a C=C+1)
if %C%==10 (set C=0 && set /a B=B+1)
if %B%==10 (set B=0 && set /a A=A+1)
if %A%==10 goto B
mkdir %A%\%B%\%C%\%D%\%E%
REM pause to get the error
goto A
:B
echo 111.111 folders have been made
pause
exit
一起寻找修复程序或新版本。
你的 %D% 在第一次迭代后得到尾随 space,所以 MKDIR 语句最终像这样在大约 100 个文件夹中(注意 spaces):
...
mkdir 0[=10=][=10=]
mkdir 0[=10=][=10=]
mkdir 0[=10=][=10=]
mkdir 0[=10=][=10=] [=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=]
mkdir 0[=10=]
mkdir 0[=10=]
mkdir 0[=10=]
...
评估在 space 处停止,实际上“0[=28=][=28=]”在该点已经存在。
老实说,我不知道为什么这只发生在 D 上,而不是其他变量。我可能遗漏了一些明显的东西。
您可以通过在 "mkdir" 之前添加此行来抑制问题,但是:
if "%D%"=="0 " set D=0
另一方面,调试像这样的批处理文件的一种有用方法是删除 "pause" 语句,在 "mkdir" 前面放置一个 "echo",然后重定向输出到一个文件。您可以查看输出并查看它 将 执行的 mkdir 语句。
@JosefStyons 指出了他的中的核心问题:values中的数字后面有space;但这实际上适用于 所有 变量,除了 A
.
这是由 if
命令行引起的——让我们举一个例子:
if %E%==10 (set E=0 && set /a D=D+1)
问题的原因是set E=0
命令后的space。当然,其他 if
行也是如此。
要解决该问题,您可以执行以下任一操作:
if %E%==10 (set "E=0" && set /a D=D+1)
或:
if %E%==10 ((set E=0) && set /a D=D+1)
甚至(但易读性下降):
if %E%==10 (set E=0&& set /a D=D+1)
set /A
实例不存在此问题,因为它们将值视为数字,而没有 /A
开关的 set
命令将值视为字符串。
下面的批处理文件是等效的,但更简单的解决方案:
@echo off
set ABCDE=99999
:loop
set /A ABCDE+=1
mkdir %ABCDE:~1,1%\%ABCDE:~2,1%\%ABCDE:~3,1%\%ABCDE:~4,1%\%ABCDE:~5,1%
if %ABCDE% neq 199999 goto loop
echo 111.111 folders have been made
pause
别问我为什么,我试着创建一个由文件夹组成的5位代码。 下面的代码看起来很有希望,但是在文件夹 0[=15=][=15=] 它崩溃了: returns 0[=15=][=15=]\%E% 已经存在。 可以在代码中找到 %E% 的定义。
@echo off
set A=0
set B=0
set C=0
set D=0
set E=-1
:A
set /a E=E+1
if %E%==10 (set E=0 && set /a D=D+1)
if %D%==10 (set D=0 && set /a C=C+1)
if %C%==10 (set C=0 && set /a B=B+1)
if %B%==10 (set B=0 && set /a A=A+1)
if %A%==10 goto B
mkdir %A%\%B%\%C%\%D%\%E%
REM pause to get the error
goto A
:B
echo 111.111 folders have been made
pause
exit
一起寻找修复程序或新版本。
你的 %D% 在第一次迭代后得到尾随 space,所以 MKDIR 语句最终像这样在大约 100 个文件夹中(注意 spaces):
...
mkdir 0[=10=][=10=]
mkdir 0[=10=][=10=]
mkdir 0[=10=][=10=]
mkdir 0[=10=][=10=] [=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=] <--space
mkdir 0[=10=][=10=]
mkdir 0[=10=]
mkdir 0[=10=]
mkdir 0[=10=]
...
评估在 space 处停止,实际上“0[=28=][=28=]”在该点已经存在。
老实说,我不知道为什么这只发生在 D 上,而不是其他变量。我可能遗漏了一些明显的东西。
您可以通过在 "mkdir" 之前添加此行来抑制问题,但是:
if "%D%"=="0 " set D=0
另一方面,调试像这样的批处理文件的一种有用方法是删除 "pause" 语句,在 "mkdir" 前面放置一个 "echo",然后重定向输出到一个文件。您可以查看输出并查看它 将 执行的 mkdir 语句。
@JosefStyons 指出了他的A
.
这是由 if
命令行引起的——让我们举一个例子:
if %E%==10 (set E=0 && set /a D=D+1)
问题的原因是set E=0
命令后的space。当然,其他 if
行也是如此。
要解决该问题,您可以执行以下任一操作:
if %E%==10 (set "E=0" && set /a D=D+1)
或:
if %E%==10 ((set E=0) && set /a D=D+1)
甚至(但易读性下降):
if %E%==10 (set E=0&& set /a D=D+1)
set /A
实例不存在此问题,因为它们将值视为数字,而没有 /A
开关的 set
命令将值视为字符串。
下面的批处理文件是等效的,但更简单的解决方案:
@echo off
set ABCDE=99999
:loop
set /A ABCDE+=1
mkdir %ABCDE:~1,1%\%ABCDE:~2,1%\%ABCDE:~3,1%\%ABCDE:~4,1%\%ABCDE:~5,1%
if %ABCDE% neq 199999 goto loop
echo 111.111 folders have been made
pause