Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables .bat文件-输出名称存储为变量的变量的值_Variables_Loops_Batch File_Echo - Fatal编程技术网

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

Variables .bat文件-输出名称存储为变量的变量的值,variables,loops,batch-file,echo,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

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

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
File1
我遇到的问题是在后面的循环中读取变量的内容,因为以下代码:

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

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

firstfile.txt

有什么方法可以做到这一点吗?

我相信这段代码可以帮助您:

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!
)
如果你不喜欢捷径s、 您只需%即可实现您的要求,如:

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
试试这个:

call echo %%fileName%% > temp.txt

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

调用解决方案看起来更简单,但速度要慢得多,如果扩展变量包含一个特殊字符,如
&

+1,则调用可能会失败。可能应该在DIR命令中添加/a-d选项,以将输出限制为文件并消除文件夹。此外,如果文件名包含
,则此操作将失败字符。用于!字符您可以使用类似集合var=%var:!=^!%的变通方法在这种情况下,有很多原因说明这一点没有帮助:该值还不在环境变量中;要实现这一目标,您必须扩展%%a,现在您又回到了起点。也不能在定义它的同一代码块中使用%var%,因此首先需要延迟扩展。