0

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

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%不能正常工作。

4

1 回答 1

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

如果您真的想附加到循环之前可能存在的任何现有数据,那么您可以恢复使用 using >>,但添加括号以强制仅进行一次重定向仍然更快。

于 2013-11-06T22:29:33.250 回答