批量合并文件

时间:2013-04-09 13:53:29

标签: windows batch-file

我有很长的文件列表,我想合并到几个文件中。

part-m-00000 
part-m-00001 
part-m-00002 
part-m-00003
part-m-00004
part-m-00005
part-m-00006
part-m-00007
part-m-00008
part-m-00009
part-m-00010
part-m-00011
part-m-00012
...
part-m-01267

(注意文件名末尾的数字填充)

我想将每100个文件合并为10个单独的文件,最后剩下的67个文件合并到11个文件中。我无法填充这些数字来合并文件。

这是我能够达到的目标 -

@echo off
if exist merge.txt del merge.txt

echo. >merge.txt
for /l %%a in (0,1,3) do (
Set Number=00000%%a
Set Number=%Number:~-5%
copy/b merge.txt+"part-m-%number%.txt" merge.txt
)

我认为数字填充没有按预期工作。它在for循环中对我不起作用。如果我一般做这样的事情 -

Set Number=768
Set Number=00000%Number%
Set Number=%Number:~-5%
echo %Number%

它正确填充了数字。

我无法弄清楚我做错了什么。感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

%XXX%的变量仅针对for循环展开一次,而不是在每次迭代中展开。

您需要使用!XXX!语法进行延迟扩展,如下所示:

setlocal enableextensions enabledelayedexpansion

for /l %%a in (0,1,3) do (
Set Number=00000%%a
Set Number=!Number:~-5!
echo !Number!
)

有关详细信息,请参阅问题Batch file variables initialized in a for loop

答案 1 :(得分:1)

试试这个:

@echo off

setlocal enabledelayedexpansion

if exist merge.txt del merge.txt

echo. >merge.txt
for /l %%a in (0,1,3) do (
Set Number=00000%%a
Set Number=!Number:~-5!
copy /b merge.txt+"part-m-%number%.txt" merge.txt
)

如果不使用延迟扩展,变量%Number:~-5%将仅扩展一次 - 在处理整个for命令之前。使用延迟扩展时,变量!Number:~-5!将在每次运行时展开,因此每次数量都会不同。

答案 2 :(得分:0)

另一种(可能更简单,更快捷)的方法是:

@echo off

setlocal enabledelayedexpansion

if exist merge.txt del merge.txt

echo. >merge.txt
set Number=99999
for /l %%a in (0,1,3) do (
Set /A Number+=1
copy /b merge.txt+"part-m-!Number:~-5!.txt" merge.txt
)