2

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

@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 循环上的最后一个回显显示 0,这是循环之前设置的测试。

test 的值在循环完成之前不会改变......有没有办法解决这个问题?

这是我想要完成的,因为可能有一个更简单的方法:我想运行一个 for 循环,在一系列子文件夹中 findstr 的所有 rtf,并将它们全部复制到一个新名称的 all 目录中,1.rtf ,2.rtf,3.rtf 等。我需要在传输时重命名它们的原因是它们都具有相同的名称。

4

3 回答 3

4

卢塞罗是对的。

示例代码:

@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
于 2009-06-11T13:19:21.727 回答
2

您可能需要使用延迟的环境变量扩展。见 CMD /? 如需更多帮助:

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

...

默认情况下不启用延迟环境变量扩展。您可以使用 /V:ON 或 /V:OFF 开关为 CMD.EXE 的特定调用启用或禁用延迟的环境变量扩展。通过使用 REGEDIT.EXE 在注册表中设置以下 REG_DWORD 值中的一个或两个,您可以为计算机和/或用户登录会话上的所有 CMD.EXE 调用启用或禁用延迟扩展:

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

和/或

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

要么0x1要么0x0。用户特定设置优先于机器设置。命令行开关优先于注册表设置。

如果启用了延迟环境变量扩展,则感叹号可用于在执行时替换环境变量的值。

于 2009-06-11T12:21:39.867 回答
0

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

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

我忽略了!!一开始有点。

于 2010-04-15T20:51:36.830 回答