那是因为在解析行时会发生使用百分比的正常扩展,并且在循环执行之前解析了整个 FOR 语句,因此num
尚未设置变量。
第二次运行时,num
变量已经从上次运行的最后一次迭代中定义。所以每次迭代都会得到相同的值。
命令行有一种方便的解决方案:
CALL 引入了每次迭代都会发生的另一个级别的解析。每个变量扩展中都包含一个插入符号 ( ^
),以防止在初始解析阶段扩展任何预先存在的值。第一次解析删除插入符号,然后为每次迭代正确扩展该值。
FOR /F %i IN (list.txt) DO set num=%i & call echo %^num:~0,2% %^num:~2,2% %^num:~4,4% _ _____ >>temp.txt
如果您使用批处理文件,情况会发生变化。有两种方便的批处理解决方案:
1) 像以前一样使用 CALL,但语法会发生变化。在批处理中,您需要将百分比加倍以防止值在初始解析阶段扩展。
FOR /F %%i IN (list.txt) DO set num=%%i & call echo %%num:~0,2%% %%num:~2,2%% %%num:~4,4%% _ _____ >>temp.txt
2) 使用在执行时发生的延迟扩展。这明显更快,并且通常优于 CALL 方法。
setlocal enableDelayedExpansion
FOR /F %%i IN (list.txt) DO set num=%%i & call echo !num:~0,2! !num:~2,2! !num:~4,4! _ _____ >>temp.txt
注意 - 无论您使用什么方法,您都可以通过只执行一次重定向来提高性能。上面的代码为每次迭代执行重定向,这会减慢进程。只做一个重定向还允许您使用>
,以便您的文件开始为空。我将使用下面的延迟扩展方法,但其中任何一个都可以。
setlocal enableDelayedExpansion
(FOR /F %%i IN (list.txt) DO set num=%%i & call echo !num:~0,2! !num:~2,2! !num:~4,4! _ _____ ) >temp.txt
如果您真的想附加到循环之前可能存在的任何现有数据,那么您可以恢复使用 using >>
,但添加括号以强制仅进行一次重定向仍然更快。