2015-11-03 24 views
2

不要問我爲什麼,但我嘗試創建一個由文件夾組成的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 

一起尋找修補程序或新版本。

+0

做了修復在下面爲你工作,我的答案? – JosephStyons

回答

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 
+0

我不知道什麼mkdir'%ABCDE:〜1,1%',但做了一些測試,似乎'〜1'取第二個字符,'1 '定義了使用的數字的數量。好的解決方案:) –

+0

是的,你可以閱讀相同的解釋,如果y ou在命令提示符下鍵入'set /?'。 **')'** – Aacini

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 

在另一方面,一個有用的方法來調試批處理文件,像這樣的是刪除了「暫停」語句,在「mkdir」之前放置一個「echo」,然後將輸出重定向到一個文件。您可以查看輸出並查看執行的mkdir語句。

+0

問題仍然存在,因爲_all_變量'B'到'E',但'E'中的空格被mkdir忽略,因爲它被附加在路徑的末尾; 'D'是問題可見的第一個變量,因爲它比'C'多增加10倍,而'C'的增量比'B'快10倍,等等。由於沒有字符串分配('set'沒有'/ A'開關),所以'A'不受影響... – aschipfl

+0

@JosephStyons問題的確是空間。 '如果「%D%」==「0」設置爲D = 0,則「if%D%== 10」(設置「D = 0」&& set/a C = C + 1)'更優雅。 我愛你的提示關於回聲mkdir順便說一句:)問題是'echo mkdir%A%\%B%\%C%\%D%\%E%> filename.txt'會不斷覆蓋,或者如果您採取%文件名%它會使111.111 txt文件。你有解決方案嗎? –

+0

@Iterniam:爲了克服「多個文件」問題,請在批處理文件本身中將其保留爲只有 'echo mkdir%A%\%B%\%C%\%D%\%E%'。然後,不是雙擊批處理文件來執行它,而是使用重定向從命令提示符執行它,如'c:\ my_batch_file.bat> c:\ output.txt'。這會將所有輸出重定向到單個文件。 – JosephStyons

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實例存在,因爲它們將值視爲數字值,而set命令wi那麼/A開關將值視爲字符串。

+0

現在我好奇,爲什麼這個空間只會影響第四層,而不會影響第二層或第三層? –

+0

它會影響_all_但第一層,但_only_會影響if語句的執行並將數重置爲0;第一層(「A」 )不受影響,因爲沒有相關的'set A = 0 && ...'語句...... – aschipfl

+0

哈!我很高興你發現了這個問題,試圖找到這個空間真的讓我的頭部昨天受傷,但是那裏是在我面前...... – JosephStyons