我正在尝试将一个文件的输出格式化为命令行中的另一个文件。
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%
无法正常工作。
答案 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
如果你真的想要追加循环之前可能存在的任何现有数据,那么你可以恢复使用>>
,但是添加括号以强制只有一个重定向仍然更快。