CMD For Loop不保持set / a值

时间:2009-06-11 12:07:24

标签: for-loop cmd set

不知道如何解释这个,所以这里是代码

@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等。我需要在转移时重命名它们的原因是它们都有相同的名称。

3 个答案:

答案 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
     

0x10x0。用户   特定设置优先于   机器设置。命令行   交换机优先于   注册表设置。

     

如果延迟环境变量   扩展已启用,然后是   感叹号可以用来   替换环境的价值   执行时变量。

答案 2 :(得分:0)

只是想补充一点,利用延迟扩展的关键是使用!var引用变量!语法与%var%。我可以告诉我在XP中延迟扩展是默认启用的,你只需要使用!来引用var。这修复了我的循环。在其他海报提到的帮助中找到了这个:

使用!启用延迟环境变量扩展!作为 分隔符。 例如,/ V:ON会允许!var!扩大 执行时变量var。 var语法扩展了变量 在输入时,这在FOR内部时是完全不同的 循环。

我忽视了!!咬了一下。