.bat文件 - 输出名称存储为变量的变量的值

时间:2012-05-22 18:00:52

标签: variables loops batch-file echo

好吧,作为循环的一部分,我正在读取未知数量的文件名,并将它们保存到名称取决于文件夹中文件数的变量中。像这样:

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

输出

File1

当我希望它以该名称输出存储在变量中的值时。 期望的输出:

firstfile.txt

有没有办法做到这一点?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

试试这个:

call echo %%fileName%% > temp.txt

答案 2 :(得分:0)

如果文件名包含!,panda-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%%
)

调用解决方案看起来更简单,但速度明显变慢,如果扩展变量包含&这样的特殊字符,它可能会失败。

相关问题