我写了以下脚本:
@echo off
setlocal EnableDelayedExpansion
REM Collect source filenames from C:\Files and load into C:\doc.txt
dir C:\sources\Sourcefiles /b /a-d > C:\sourcefilenames.txt
REM fetch count of source files and store into variable count
For /F %%I in ('call C:\count.bat ') Do Set count=%%I
REM loop "count" number of times and echo temp.txt value
FOR /L %%A IN (1,1,%count%) DO (
REM call line.bat to fetch line 1,line 2 and so on of sourcefilenames.txt for each loop
call line.bat %%A>C:\temp.txt
set /p var=<C:\temp.txt
echo var:%var% ----------> returns previous run value
type C:\temp.txt ----------. returns current value of temp.txt
)
基本上我想用以上脚本做的是: 我正在temp.txt的内容中创建一个变量(var)(temp.txt中的数据将在每次循环运行时更改)以在多个循环中使用。
但我面临的问题是: Echo var是:%var%命令返回我之前的运行值而不是temp.txt当前content.whereas命令“type C:\ temp.txt”返回temp.txt当前内容。 (注意:如果我从其他脚本调用/创建变量“var”,则返回前一个值,否则返回Null)
我们非常感谢您对上述问题的帮助/指导。 感谢
答案 0 :(得分:0)
我认为变量保留在内存中,没有被重新读取。试图限制变量的有效性。 SETLOCAL 回声...... ENDLOCAL 或者@echo off&amp; SETLOCAL
答案 1 :(得分:0)
当CMD.exe在括号中遇到一段代码时,它会在执行前读取并解析整个块。这可能会导致不直观的行为。在这种情况下,您的node
行将在循环开始时解析一次,而不会再次解析。
最简单的解决方法是将该行更改为
echo var:%var%
每次循环都会解析echo var:!var!
语法。这是有效的,因为您在脚本中设置了!var!
。
此类问题的另一种解决方法是删除括号,而是调用子例程。
enabledelayedexpansion
此循环与上面相同,但由于它不在括号内的块中,因此所有行都按顺序进行解析和执行。