标签循环似乎无故崩溃

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