2013-04-08 175 views
0

我正在嘗試讀取for循環中字符串的字符。無法讀取for循環中字符串的字符

命令!字符串:〜1,3!工作正常。但我可以用變量而不是1和3來做到這一點。我嘗試了下面的代碼,但我不知道什麼是錯的。它不工作。

@echo off 
setlocal enableextensions enabledelayedexpansion 
set string=abcdefghij 
set /a count=1 
for /l %%x in (1,1,3) do (
    set string2=!string:~%count%,1! 
    set /a count+=1 
    echo !string2! 
    pause 
) 

但它總是給人輸出爲:

b 

我想要的輸出爲如下:

b 
c 
d 

解決這個請幫助..提前

非常感謝
+0

如果您提出的問題沒有得到太多關注,請不要再提問。 (從同一用戶Dupe):http://stackoverflow.com/questions/15743077/how-to-read-characters-from-a-string-inside-a-for-loop-in-a-batch-file – 2013-04-08 17:14:18

回答

0

問題是%count%的擴展沒有延遲,所以它的值相同循環迭代。這是更好這樣寫的:

@echo off 
setlocal enableextensions enabledelayedexpansion 
set string=abcdefghij 
set /a count=1 
for /l %%x in (%count%,1,3) do (
    set string2=!string:~%%x,1! 
    echo !string2! 
) 

編輯

如果你想保持%count%評爲變量設置,而不是隻是在for循環的開始,使用Aacini's answer

+0

但有沒有辦法擴大%count%?是否有可能這樣做?請解釋 – 2013-04-08 17:44:00

+0

@RaathanaRanganath - 請參閱Aacini的答案。 – rojo 2013-04-08 18:40:30

1

爲了達到你想要什麼,你需要做一個延遲擴展兩次,就是這樣的:

set string2=!string:~!count!,1! 

當然,前行是無效的。雖然有幾種方法可以解決這個問題,但他們大多數使用的命令很慢。要解決此問題,請使用for命令以最快的方式運行,以更改第一個!計數!擴展爲FOR可替換參數,然後在原始表達式中使用它:

for %%i in (!count!) do set string2=!string:~%%i,1! 
+0

+1我喜歡這樣。它比'call'更清潔。你的方法和'call'之間的時差也是正確的。我只是使用'for'作爲測試腳本,循環次數從1到1000,或者象我一樣''調用''設置'%count%'。 「for」方法耗時331毫秒。 「通話」方式耗時1.195秒。 – rojo 2013-04-08 18:38:11

+0

@Aaicini,非常感謝:) – 2013-04-09 02:03:39