2012-07-25 145 views
1

每個文本文件的行和循環我有這樣的代碼CMD /批量提取變量

@Echo Off 
SetLocal EnableDelayedExpansion 
SET mydir=D:\ 
SET DirCount=2 
SET T= 
For /F %%i In (qqq.txt) Do ( 
    set fg=%%i 
    FOR /L %%G IN (2, 1, %DirCount%) DO (call :subroutine "%%i") 
) 

:subroutine 
Set T=!T!../ 
start /wait %mydir%program.exe %T%%fg% 
echo %t%%fg% >>%cd%see.log 

qqq.txt具有行

1 
2 
3 

在結果我得到:

../1 
../../2 
../../../3 
../../../../3 

但我需要這樣的:

../1 
../../1 
../2 
../../2 
../3 
../../3 

請幫我做錯了什麼?


只是一點點額外的requried

我需要什麼第一OCUR在

set "T=!T!../" 
will be without dots 
set "T=!T!/" 
result must be 
/1 
../1 
../../1 
/2 
../2 
../../2 

在何處以及如何添加計數器,並可見每個循環的財產以後像

echo Now looping: %%i row of %countrow(in qqq.txt), left %countrow-%%I 
echo Now looping: Dir Nr%%G !T!%%i 

對於愚蠢的問題抱歉,但批處理編碼對我來說很困難。

+0

關於更新的問題 - 獲取文件中的行數並不直觀,所以我會將其添加到我的答案中。但對於剩下的部分,你應該再考慮一下你的問題。大部分你所要求的都是簡單的邏輯。如果您能夠編寫您的原始代碼,那麼您應該能夠自行解決大部分新問題。提示 - 您只需對接受的答案進行微小的更改 - 修改DirCount值並移動「設置T =!T!../'行的位置。 – dbenham 2012-07-26 14:20:09

回答

3

你有3個問題:

1)主迴路後,您不退出程序,因此屬於通過進入子程序

2)你的/ L IN()子句是錯誤的,第一個數字應該是1,而不是2

3)您需要將T重置回外部循環中的undefined。

編輯
我相信你可以有另外一個問題。重定向輸出時,用%cd%作爲文件名的前綴。我不認爲這是給你想要的結果。如果當前目錄是C:\test,則>>%cd%see.log將導致輸出發送到根目錄C:\目錄中名爲testsee.log的文件。如果你想在當前目錄中輸出,那麼它應該是>>%cd%\see.log,但是路徑信息並不是真的需要,因爲默認是使用當前目錄。所以你真的需要的是>>see.log。既然我不知道你的意圖,我已經離開了原來寫的重定向。 編輯完

@echo Off 
SetLocal EnableDelayedExpansion 
SET mydir=D:\ 
SET DirCount=2 
For /F %%i In (qqq.txt) Do (
    SET T= 
    set fg=%%i 
    FOR /L %%G IN (1, 1, %DirCount%) DO (call :subroutine "%%i") 
) 
exit /b 

:subroutine 
Set T=!T!../ 
start /wait %mydir%program.exe %T%%fg% 
echo %t%%fg% >>%cd%see.log 

無需調用子程序你的情況,特別是因爲你已經啓用延遲擴展。下面的代碼給出了相同的結果,並且它更快,因爲它避免了相對較慢的CALL語句。(性能可能不是在這個小例子的問題,但如果使用循環與許多迭代它可以產生巨大的變化)

@echo Off 
SetLocal EnableDelayedExpansion 
SET mydir=D:\ 
SET DirCount=2 
For /F %%i In (qqq.txt) Do (
    SET "T=" 
    FOR /L %%G IN (1, 1, %DirCount%) DO (
    set "T=!T!../" 
    start /wait %mydir%program.exe !T!%%i 
    echo !T!%%i >>%cd%see.log 
) 
) 


部分回答更多的問題

你可以使用FOR/F來捕獲FIND/C的結果以獲得「qqq.txt」中的行數。

for /f %%N in ('find /c /v "" ^<qqq.txt') do set "rowCount=%%N" 

可以使用SET/A做基本的數學運算,從而使您能夠保留剩餘的行

首先初始化剩餘計數量的軌道:你進入主循環之前應該這樣做在進入主循環之前:

set "remainingLines=%rowCount%" 

然後在主循環內使用SET/A來遞減該值。

set /a remainingLines-=1 
+0

完美!非常感謝!!! – 2012-07-26 09:44:34

+0

@DmitrijHolkin - 我可能發現了一個額外的問題。在我的回答中看到標有* EDIT *的新章節。 – dbenham 2012-07-26 12:07:06

+0

@DmitrijHolkin - 我已經部分回答了您的其他問題。其餘的由你決定:-) – dbenham 2012-07-26 14:39:07