2012-05-22 61 views
0

好吧,作爲循環的一部分,我正在讀取未知數量的文件名,並將其保存到名稱取決於數字的變量中文件夾中的文件。就像這樣:.bat文件 - 輸出變量的名稱作爲變量存儲的值

SET /a count=1 

DIR %rootFolder%> "fileList.txt" /b 

FOR /f "tokens=* delims= usebackq" %%a IN ("fileList.txt") DO CALL :LOOP %%a 
goto :LOOP2 
:Loop 
SET var=%1 
SET File%count%=%var% 
SET /a count=%count%+1 
GOTO:EOF 

這工作得很好

ECHO File1 
ECHO File2 

輸出

firstfile.txt 
secondfile.txt 

我在被讀出變量的內容在以後的循環,因爲這段代碼的問題:

SET fileName=File%count% 
ECHO %fileName%> temp.txt 

outputs

File1 

當我希望它通過該名稱輸出存儲在變量中的值。 所需輸出:

firstfile.txt 

有沒有辦法做到這一點?

回答

1

我相信這個代碼可以幫助您:

setlocal enabledelayedexpansion 
set /a count=0 
for /f "delims=" %%a in ('dir /b %rootFolder%') do (
    set /a count+=1 
    set File!count!=%%a 
) 

for /l %%a in (1,1,%count%) do (
    echo !File%%a! 
) 

如果你不喜歡使用快捷鍵的,你可以達到你的要求了,只有%的,如:!

set /a count=0 
for /f "delims=" %%a in ('dir /b %rootFolder%') do call :loop %%a 
call set var=%%File%count%%% 
echo %var% 

goto :eof 

:loop 
set /a count+=1 
set File%count%=%1 
goto :eof 
+0

+1,可能應該在DIR命令中添加/ a-d選項,以將輸出限制爲文件並消除文件夾。而且,如果文件名包含'!'字符,這將失敗。 – dbenham

+0

對於!你可以使用類似set的變通方法var =%var:!= ^!% –

+0

在這種情況下,有很多原因可以解決這個問題:該值不在環境變量中;爲了得到它,你必須展開%% a,並且你回到了你開始的地方。也不能在定義它的相同代碼塊中使用%var%,因此首先需要延遲擴展。 – dbenham

0

試試這個:

call echo %%fileName%% > temp.txt 
0

如果文件名包含!熊貓-34解決方案將失敗,因爲德鋪設擴張會破壞%% a的擴張。該解決方案可以通過在循環中打開和關閉延遲擴展來改進,以支持文件名中的!

setlocal disableDelayedExpansion 
set /a count=0 
for /f "delims=" %%a in ('dir /a-d /b %rootFolder%') do (
    set /a count+=1 
    setlocal enableDelayedExpansion 
    for /f %%b in ("!count!") do (
    endlocal 
    set "file%%b=%%a" 
) 
) 

setlocal enableDelayedExpansion 
for /l %%a in (1,1,%count%) do (
    echo !File%%a! 
) 

在我看來,延遲擴展解決方案是迄今爲止最好的方法。但還有另一種選擇。

setlocal disableDelayedExpansion 
set /a count=0 
for /f "delims=" %%a in ('dir /a-d /b %rootFolder%') do (
    set /a count+=1 
    call set "file%%count%%=%%a" 
) 

for /l %%a in (1,1,%count%) do (
    call echo %%File%%a%% 
) 

呼叫解決方案看起來簡單,但它是顯著慢,如果擴大變量包含像&特殊字符也可能會失敗。