2016-09-28 54 views
1

我的Windows批處理文件應該讀取文件名,並創建一個根據文件名的第2至5字母命名的目錄:通過在Windows中使用組字符串值循環在cmd

for %%f in (.\*.txt) do (
set string=%%~nf 
mkdir %string:~2,5%  
) 

「字符串的值'雖然沒有更新,即它在循環的每一步中都是相同的。我怎樣才能更新它?

這是CMD輸出:

>for %f in (.\*.txt) do (
set string=%~nf 
mkdir le3 
) 

>(
set string=file1 
mkdir le3 
) 

>(
set string=file2 
mkdir le3 
) 
A subdirectory or file le3 already exists. 

>(
set string=file3 
mkdir le3 
) 
A subdirectory or file le3 already exists. 
+0

嘗試在SO約'delayedexpansion'諮詢數百篇文章。實質上,當代碼塊被解析時,代碼塊中的'%var%'被替換爲'var'的值。要訪問塊內的變化值,首先要使用'setlocal enabledelayedexpansion'命令調用'delayedexpansion',然後使用'!var!'訪問變量的動態值。 – Magoo

+0

謝謝你的回覆。我諮詢過幾個網站,例如(鏈接)(http://stackoverflow.com/questions/6679907/how-do-setlocal-and-enabledelayedexpansion-work)並提出了'SETLOCAL ENABLEDELAYEDEXPANSION for %% f in(。\ *。txt)do(set !string!= %%〜nf mkdir!string:〜2,5!)' - 但延遲擴展似乎還沒有工作。你有什麼建議嗎? – Joan

+0

'set!string!= %%〜nf'應該是'set string = %%〜nf' - 您打算設置變量'string',而不是變量'string的當前內容' – Magoo

回答

1

你正在運行到的問題是因爲%variable% expansion。整個FOR聲明(包括直到右括號)是一個聲明。當它被讀取時,命令處理器用字符串設置爲替換%string%變量裏面的SET執行。 (實際上,你得到的開始的第2個字符,並繼續進行5個字符的子集,但在這裏,這不是真的很重要。我的猜測是,你有%string%設置爲「文件3」)。

無論如何,您可以通過在頂部添加SETLOCAL ENABLEDELAYEDEXPANSION並在FOR內使用像!string!而不是%string%這樣的語法來解決此問題。

您還可以將%string%的處理移動到FOR之外。

查看HELP SETLOCALHELP SET瞭解更多。另外,如果你沒有注意到,你沒有得到文件名的第二個和第五個字符......正如我所提到的,你得到了一個長度爲5的子字符串,從字符開始2.查看更多HELP SET

+0

我現在啓用了延遲擴展和適應代碼: 'SETLOCAL ENABLEDELAYEDEXPANSION 爲%% F IN做( 組字符串= %%〜NF 的mkdir串!!!〜2,5 \t \t )(\ * TXT。)' 我理解這個想法,也嘗試在不同的地方設置引號,但是我仍然沒有得到延遲的擴展 - 任何想法? – Joan

0

近,你有一對夫婦不必要的感嘆號在最後一次嘗試:

SETLOCAL ENABLEDELAYEDEXPANSION 
for %%f in (*.txt) do (
    set string=%%~nf 
    if not exist "!string:~2,5!\" mkdir "!string:~2,5!" 
) 
+0

非常感謝!這解決了這個問題! – Joan

+0

如果您相應地標記了正確的答案,我會幫助網站和檢舉響應方。 – Compo