Creating a folder from first 5 characters of filename in a batch file

Here's what I have:

C:\test\12345-test1.txt
C:\test\23456-test2.txt
C:\test\44444-test3.doc

I would like to have the script read the first 5 digits from the file, create a folder with those digits, and include the letter T before it.

The result after running should be like this:

C:\test\T12345\12345-test1.txt
C:\test\T23456\23456-test2.txt
C:\test\T44444\44444-test3.doc

Currently, I have this, which does the function; I just can't figure out where to put the SET command to extract the 5 characters.

@echo off
for %%a in (*.*) do (
md "T%%a" 2>nul
move "%%a" "T%%~a"  
)

I think this needs to be added to choose only the first 5 characters:

set first5=%%a:~5,1%

Thoughts?


@echo off

for /f %%a in ('dir /a-d /b') do (
  if not "%%~dpnxa"=="%~dpnx0" call :func "%%~a"
)

goto :EOF

:func
set file=%~1
set dir=%file:~0,5%
md "T%dir%" 2>nul
move "%file%" "T%dir%" 
goto :EOF

This will process files (= no dirs) in the working directory. I also added a check to prevent the script from moving the batch file itself in case it happens to be located in the wd.


As long as you're going through the trouble to learn something, why not learn something worthwhile? In PowerShell:

$x = gci ; $x | % { $d = 'T' + $_.Name.Substring(0,5) ; mkdir $d ; move $_ $d } | Out-Null

You can use this to get the first five characters:

set first5=%a:~0,5%

set assigns the value after the = to first5. %a% would return the value of variable a, by adding the following characters you reference the range starting at character 0 and the next five ones.