回显多行并追加每一行

时间:2013-11-06 16:58:14

标签: for-loop cmd

我正在尝试将一个文件的输出格式化为命令行中的另一个文件。

FOR /F %i IN (list.txt) DO set num=%i && echo %num:~0,2% %num:~2,2% %num:~4,4% _  _____ >>temp.txt

list.txt的内容

41460729
41640140

期望的输出:

41 46 0729 _ ____
41 64 0140 _ ____

我第一次运行它时得到:

%num:~0,2% %num:~2,2% %num:~4,4% _  _____
%num:~0,2% %num:~2,2% %num:~4,4% _  _____ 

我第二次得到:

41 64 0140 _ ______ 
41 64 0140 _ ______

我无法弄清楚为什么%num%无法正常工作。

1 个答案:

答案 0 :(得分:1)

这是因为在解析行时会使用百分比进行正常扩展,并且在循环执行之前解析整个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

如果你真的想要追加循环之前可能存在的任何现有数据,那么你可以恢复使用>>,但是添加括号以强制只有一个重定向仍然更快。