views:

219

answers:

2

I am looking to create a Windows batch script to move about 2,000 files and splitting them up so that there are 10 files per folder. I have attempted creating a batch script but the syntax really boggles my mind. Here is what I have so far

@echo off

:: Config parameters
set /a groupsize = 10
:: initial counter, everytime counter is 1, we create new folder
set /a n = 1
:: folder counter
set /a nf = 1

for %%f in (*.txt) do (
:: if counter is 1, create new folder
if %n% == 1 (
    md folder%nf%
    set /a n += 1
)

:: move file into folder
mv -Y %%f folder%nf%\%%f

:: reset counter if larger than group size
if %n% == %groupsize% (
    set /a n = 1
) else (
    set /a n += 1
)
)
pause

Basically what this script does is loop through each .txt file in the directory. It creates a new directory in the beginning and moves 10 files into that directory, then creates a new folder again and moves another 10 files into that directory, and so on. However, I'm having problems where the n variable is not being incremented in the loop? I'm sure there's other errors too since the CMD window closes on me even with pause. Any help or guidance is appreciated, thanks for your time!

A: 

you are not incrementing %nf%.

ghostdog74
+1  A: 

A few things you need to know:

  • SETLOCAL ENABLEDELAYEDEXPANSION is needed, since you are changing variables and using their changed values in a single parenthesized block. SET /? on the command line will give some info. Search the internet for this term and you will find a better explanation.
  • The places I use the !nf! format for variables is related to delayed expansion.
  • As ghostdog74 mentioned, you weren't incrementing %nf%.
  • I initialized nf to 0 instead of 1. This way, the folder number you want to move files to is the same as the folder number you just created. In your code, you create folderX, then increment X, and then try to move the file to X+1.
  • You have to use MOVE to move a file, MV is not valid.

This batch file works...but make sure you test! I only tested on a small amount of files.

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

:: Config parameters
SET groupsize=10
:: initial counter, everytime counter is 1, we create new folder
SET n=1
:: folder counter
SET nf=0

FOR %%f IN (*.txt) DO (
  :: if counter is 1, create new folder
  IF !n!==1 (
    SET /A nf+=1
    MD folder!nf!
  )

  :: move file into folder
  MOVE /Y "%%f" folder!nf!

  :: reset counter if larger than group size
  IF !n!==!groupsize! (
    SET n=1
  ) ELSE (
    SET /A n+=1
  )
)

ENDLOCAL

PAUSE
aphoria
Thanks for the edit Johannes. I oversimplified when I said ENABLEDELAYEDEXANSION was need for the math to work. That's not true. But, you do need it to access the value as it changes.
aphoria
Thanks, will take a look at this tomorrow before I accept this answer :)
Axsuul
This worked perfectly, thanks for your help :)
Axsuul