Search code examples
variablesbatch-filedosfilenames

DOS Batch file - Copy file based on filename elements


I need to sort alot of files based on their filename. I would like to use a batch file to do it. I do know what I want but I am not sure of the correct syntax.

Example of filenames I work with: (They are all in the same directory originally)

2012_W34_Sales_Store001.pdf  
2012_W34_Sales_Store002.pdf  
2012_W34_Sales_Store003.pdf  

2012_November_Sales_Store001.pdf  
2012_November_Sales_Store002.pdf  
2012_November_Sales_Store003.pdf

I would like to extract the information that are located between the "_" signs and put them into a different variable each time. The lenght of the informations contained between the _ signs will be different everytime.

Example:
var1="2012"
var2="W34" (or November)
var3="Sales"
var4="001"

If I am able to do this, I could then copy the files to the appropriate directory using

move %var1%_%var2%_%var3%_%var4%.pdf z:\%var3%\%var4%\%var1%\%var2%

It would need to loop because I have Store001 to Store050. Also, there are not only Sales report, many others are available.

I hope I am clear.

Please help me realize this batchfile!


Solution

  • This script will make sure that it only attempts to move files that meet the pattern part1_part2_part3_part4.pdf

    @echo off
    for /f "eol=_ delims=" %%F in (
      'dir /b *^|findstr /ix "[^_]*_[^_]*_[^_]*_[^_]*[.]pdf'
    ) do for /f "eol=_ tokens=1-4 delims=_." %%A in ("%%F") do (
      move "%%F" "z:\%%C\%%D\%%A\%%B"
    )
    

    If needed, you could add md "z:\%%C\%%D\%%A\%%B" 2>nul before the MOVE in case the folders might not exist yet.