2014-04-26 84 views
0

循環內部是否可以有for循環?批處理 - 用於循環的內部循環

我有兩個文件,第一個文件包含

... 
"bla","bli","blu",XX 
"bla","bli","blu",YY 
... 

,第二個包含:

... 
XX,some string 
XX,some string 
YY,diferent string 
YY,diferent string 
... 

而我想做的事就是寫一個文件行,如:

... 
"bla","bli","blu",some string 
"bla","bli","blu",diferent string 
... 

我的最佳嘗試不起作用

for /f "tokens=1-10 delims=," %%1 in (semi-final.txt) do (
    :: echo "bla","bli","blu" 
echo %%1,%%2,%%3,%%4,%%5,%%6, | tr -d "\r\n" >> final.txt 

    :: set var=XX or set var=YY 
set var=%%7 

for /f "tokens=1,2 delims=," %%1 in (codes.txt) do (
      :: Find XX in codes.txt for exchange 
    if /i "%%2"=="!var!" echo %%1, | tr -d "\r\n" >> final.txt 
) 

    ::Other echo after that XX , isn't important 
echo %%7,%%8,%%9,%%10 >> final.txt 
) 

編輯:

我有問題,SHIFT:/註釋在下面的代碼

@echo off 
setlocal EnableDelayedExpansion 

for /f "tokens=1-11 delims=, skip=1" %%1 in (semi-final.txt) do (
    echo %%1,%%2,%%3,%%4,%%5,%%6, >> final.txt 

    set var=%%7 
    set b=!var:~2,2! 

     call :inner !b! 

     shift 
     shift 
     shift 
     :: Still %%6 is the same asi in first command 

    echo %%6,%%7,%%8,%%9 >> final.txt 
) 
goto :eof 

:inner 
for /f "tokens=1,2 delims=," %%X in (codes.txt) do (
    IF /i "%%Y"=="!b!" ( 
     echo '%%X', >> final.txt 
      goto :next 
    ) 
) 
echo '', >> final.txt 
:next 
goto :eof 

回答

0

您使用了兩個循環相同FOR變量(%%1)。由於它們是嵌套的,你應該使用不同的變量。第一個for循環聲明瞭10個變量(因爲你要求10個記號),所以對於第二個變量你需要不同的變量。嘗試在第二個循環中使用%%X(這將使用%%X%%Y而不是%%1%%2)。

+0

請你能告訴我,有沒有一種可能的方式「其他」的聲明? –

+0

如果你的意思是「其他」加上「如果」,當然,但這是另一個問題。如果你的意思是「else」,如「如果我沒有找到我正在尋找的for'使用',那麼去這裏」,然後否,但是你可以在循環之後包含一些代碼,並在找到匹配時跳過它。 – Avish

+0

好吧,我也有移位問題... echo %% 6(prints「bla」)................ shift shift shift ... ............... echo %% 6仍然打印「bla」 –

1

你還有一些問題。

  • FOR變量名是單個字符,並且使用多個標記時的順序是ASCII順序。所以%%9之後的變量是%%:。有一個名爲%%10的FOR變量是不可能的。

  • SHIFT命令只對批處理參數操作,而不對FOR變量操作。即使您選擇使用數字作爲FOR變量,但並不意味着您可以將它們移位。

  • 不需要SHIFT變量,只需使用字母字符可以輕鬆找出要使用的變量。然後在一個循環中處理多達26個FOR變量變得簡單。此外,您可以指定您想要的令牌:FOR /F "tokens=1-7,9-11 delims=," %%A會將%% A - %% G分配給令牌1-7,將%% H - %% J分配給令牌9-11。

可以做出顯着的改進。

  • 沒有理由使用多個ECHO與TR打印單行。只需延遲打印任何信息,直到您擁有整條生產線。

  • 您可以使用FINDSTR快速找到您的匹配行,並使用另一個FOR/F來解析出所需的值。這比用FOR/F讀整個第二個文件要快得多。

  • 在循環中使用追加模式效率低下 - 重定向需要時間來打開文件並定位指針。將整個循環放入另一組括號並僅重定向一次會快得多。

  • 不需要CALLed子程序。一切都可以在主循環內完成。

這給一試:

@echo off 
(
    for /f "tokens=1-7,9-11" %%A in (semi-final.txt) do (
    for /f "tokens=2" %%X in ('findstr /bl "%%G," codes.txt') do (
     echo %%A,%%B,%%C,%%D,%%E,%%F,%%X,%%H,%%I,%%J 
    ) 
) 
)>final.txt 

如果code.txt可以有多條線路與相同的代碼,而您只需要爲首次發現行的值,那麼你將需要一個子程序。通常情況下,除了循環的直接範圍之外,您不能訪問FOR變量。所以你不希望能夠在一個循環內調用一個子程序,並且仍然在子程序中引用循環變量。但是有一個鮮爲人知的特性,即如果您處於另一個FOR變量的範圍內,仍然可以訪問所有仍然處於活動狀態的循環的FOR變量。

@echo off 
(for /f "tokens=1-7,9-11" %%A in (semi-final.txt) do call :lookup "%%G")>final.txt 

:lookup 
for /f "tokens=2" %%X in ('findstr /bl "%~1," codes.txt') do (
    echo %%A,%%B,%%C,%%D,%%E,%%F,%%X,%%H,%%I,%%J 
    exit /b 
)