【问题标题】:Label loop crashes seemingly without reason标签循环似乎无缘无故崩溃
【发布时间】:2015-11-03 18:43:27
【问题描述】:

不要问我为什么,但我会尝试创建一个由文件夹组成的 5 位代码。 下面的代码看起来很有希望,但是在文件夹 0\0\1\0 它崩溃了:它返回 0\0\1\0\%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

一起寻找修复或新版本。

【问题讨论】:

  • 下面我的答案中的修复对您有用吗?

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


【解决方案1】:

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

@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

【讨论】:

  • 我不知道 mkdir %ABCDE:~1,1% ment 是什么,但做了一些测试,似乎 ~1 采用第二个字符,,1 定义了使用的数字数量。很好的解决方案:)
  • 是的。如果您在命令提示符处键入set /?,您可能会阅读相同的说明。 ;)
【解决方案2】:

@JosefStyons 在他的answer 中指出了核心问题:数值中的数字后有空格;但这实际上适用于 所有 变量,A 除外。
这是由if 命令行引起的——让我们选择一个作为示例:

if %E%==10 (set E=0 && set /a D=D+1)

问题的原因是set E=0 命令后面的空格。当然,其他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 命令将值视为字符串。

【讨论】:

  • 现在我很好奇,为什么空格只影响四级,不影响二三级?
  • 它影响所有,但第一个,但,以防if语句被执行并且一个数字被重置为0;第一级 (A)受到影响,因为没有相关的 set A=0 && ... 语句...
  • 哈!我很高兴你发现了问题,昨天试图发现空间真的让我头疼,但它就在我面前......
【解决方案3】:

您的 %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

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

【讨论】:

  • 所有变量BE的问题仍然存在,但E中的空格被mkdir忽略,因为它附加在末尾路径; D 是问题可见的第一个变量,因为它的递增频率比 C 高 10 倍,而 C 的递增频率又比 B 快 10 倍,等等; A 不受影响,因为没有字符串分配(set 没有 /A 开关)...
  • @JosephStyons 问题确实是空间。 if "%D%"=="0 " set D=0 有效,但 if %D%==10 (set "D=0" &amp;&amp; set /a C=C+1) 更优雅。我喜欢你关于回显 mkdir btw 的提示 :) 问题是 echo mkdir %A%\%B%\%C%\%D%\%E%&gt;filename.txt 会不断覆盖,或者如果你使用 %filename% 它会生成 111.111 个 txt 文件。你有解决方案吗?
  • @Iterniam:要克服“多个文件”问题,请将其保留为批处理文件本身中的 echo mkdir %A%\%B%\%C%\%D%\%E%。然后,不要只是双击批处理文件来执行它,而是通过重定向从命令提示符执行它,如c:\my_batch_file.bat&gt;c:\output.txt。这会将所有输出重定向到单个文件。
  • @JosephStyons 它的工作原理:)看着文件增长非常酷:P。认为echo "insetcommandhere"&gt;&gt;filename.extension" 将回显添加到文件的下一行,如果您不希望每个输出都在文本文档中,这可能会很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多