标签循环看似没有理由崩溃

时间:2015-11-03 18:43:27

标签: batch-file if-statement set directory mkdir

不要问我为什么,但我尝试创建一个由文件夹组成的5位数代码。 以下代码似乎很有希望,但是在文件夹0 \ 0 \ 1 \ 0它崩溃:它返回0 \ 0 \ 1 \ 0 \%E%已经存在。 可以在代码中找到%E%的定义。

compile <<= (compile in Compile).dependsOn((scalastyle in Compile).toTask(""))

一起寻找修复程序或新版本。

3 个答案:

答案 0 :(得分:2)

@JosefStyons在他的answer中发现了核心问题:值中的数字后面有空格;但除了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个实例不存在问题,因为它们将值视为数字值,而没有set开关的/A命令则将值视为字符串。

答案 1 :(得分:2)

下面的批处理文件是等效的,但更简单的解决方案:

@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

答案 2 :(得分:1)

你的%D%在第一次迭代后获得一个尾随空格,因此MKDIR语句最终会像这样大约100个文件夹(注意空格):

...
mkdir 0\0\0\9\7
mkdir 0\0\0\9\8
mkdir 0\0\0\9\9
mkdir 0\0\1\0 \0 <--space
mkdir 0\0\1\0 \1 <--space
mkdir 0\0\1\0 \2 <--space
mkdir 0\0\1\0 \3 <--space
mkdir 0\0\1\0 \4 <--space
mkdir 0\0\1\0 \5 <--space
mkdir 0\0\1\0 \6 <--space
mkdir 0\0\1\0 \7 <--space
mkdir 0\0\1\0 \8 <--space
mkdir 0\0\1\0 \9 <--space
mkdir 0\0\1\1\0 
mkdir 0\0\1\1\1
mkdir 0\0\1\1\2
mkdir 0\0\1\1\3
...

评估在空格处停止,实际上“0 \ 0 \ 1 \ 0”已经存在。

老实说,我不知道为什么这只发生在D,而不是其他变量。我可能错过了一些明显的东西。

您可以通过在“mkdir”之前添加此行来解决此问题,但是:

if "%D%"=="0 " set D=0

另一方面,调试像这样的批处理文件的一种有用的方法是删除“pause”语句,在“mkdir”前放置一个“echo”,然后将输出重定向到一个文件。您可以查看输出并查看 执行的mkdir语句。