1

I have a long list of files that I want to merge into few files.

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

(Notice the padding of number at the end of the file name)

I want to merge every 100 files into 10 individual files and the last remaining 67 into the 11th. I'm having trouble padding those numbers to merge the files.

Here's what I was able to get to -

@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
)

I don't think the padding of numbers is working as expected. It just doesn't work for me in the for loop. If I do something like this in general -

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

it correctly pads the number.

I cant figure out what I'm doing wrong. Appreciate any help.

Pai
  • 85
  • 5

3 Answers3

2

The variables with the %XXX% are expanded only once for the for loop, not in every iteration.

You need to use delayed expansion with the !XXX! syntax like this:

setlocal enableextensions enabledelayedexpansion

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

For more details refer to question Batch file variables initialized in a for loop.

Community
  • 1
  • 1
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
1

Try this:

@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
)

If you do not use delayed expansion, the variable %Number:~-5% will be expanded only once - before the whole for command is processed. With delayed expansion used, the variable !Number:~-5! will be expanded each time it is run, so the number will be different each time.

user2033427
  • 853
  • 7
  • 8
0

Another (perhaps simpler and faster) approach is this:

@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
)
Aacini
  • 65,180
  • 12
  • 72
  • 108