不知道如何解释这个,所以这里是代码
@echo off
set test=0
for /f %%a in (textfile.txt) do (
rem loops five times(5 lines in textfile.txt)
set /a test=test+1
rem Adds 1 to Test
echo %%a
rem Echo's correct line in file
echo %test%
rem Echo's whatever X was before the loop
)
echo %test%
rem Displays the correct value of X
pause
这只是我发现问题的一个例子,txtfile.txt有5行,所以for循环变为5次,每次,test得到+1,而/ a显示正确的值X,但for循环的最后一个echo显示0,这是循环之前设置的测试。
在循环结束之前,测试的值不会改变...有什么方法可以解决这个问题吗?
这是我想要完成的事情,因为可能有一种更简单的方法:我想运行一个for循环,在一系列子文件夹中找到所有rtf的所有rtf,并将它们全部复制到具有新名称的所有目录, 1.rtf,2.rtf,3.rtf等。我需要在转移时重命名它们的原因是它们都有相同的名称。
答案 0 :(得分:4)
Lucero是对的。
示例代码:
@echo off
setlocal enabledelayedexpansion
echo.
set numLines=0
echo examining file '%~f0'
echo.
rem loop N times, once for each line in the file
for /f %%a in (%~f0) do (
rem add 1 to the numLines variable
set /a numLines=!numLines!+1
rem echo the first symbol from the line
echo line !numLines!: %%a
)
rem Display the number of lines in the file
echo.
echo The file '%~f0' has %numLines% lines.
echo.
pause
echo.
endlocal
答案 1 :(得分:2)
您可能需要使用延迟环境变量扩展。见CMD /?有关这方面的更多帮助:
/ V:ON启用延迟环境 变量扩展使用!作为 分隔符。例如,/ V:ON将允许!var!扩大 执行时变量var。 var语法扩展 变量 在输入时,这在FOR内部时是完全不同的 循环。
...
延迟环境变量扩展 默认情况下不启用。您可以 启用或禁用延迟环境 特定的可变扩展 使用/ V:ON调用CMD.EXE 或/ V:OFF开关。你可以启用或 禁用所有延迟扩展 在机器上调用CMD.EXE 和/或通过设置用户登录会话 以下任一或两者 注册表中的REG_DWORD值使用 REGEDIT.EXE:
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion
和/或
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion
到
0x1
或0x0
。用户 特定设置优先于 机器设置。命令行 交换机优先于 注册表设置。如果延迟环境变量 扩展已启用,然后是 感叹号可以用来 替换环境的价值 执行时变量。
答案 2 :(得分:0)
只是想补充一点,利用延迟扩展的关键是使用!var引用变量!语法与%var%。我可以告诉我在XP中延迟扩展是默认启用的,你只需要使用!来引用var。这修复了我的循环。在其他海报提到的帮助中找到了这个:
使用!启用延迟环境变量扩展!作为 分隔符。 例如,/ V:ON会允许!var!扩大 执行时变量var。 var语法扩展了变量 在输入时,这在FOR内部时是完全不同的 循环。
我忽视了!!咬了一下。