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

6

1

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?

billieh

Posted 2011-10-25T18:30:15.897

Reputation: 61

Answers

1

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.

Jens Erat

Posted 2011-10-25T18:30:15.897

Reputation: 14 141

Thank you for the answer, I am just not sure how to compile it together to make it work.
for %%a in (.) do ( set first5=%a:~0,5% md "T%%a" 2>nul move "%%a" "T%%a" )

 Doesn't seem to solve it.
 – billieh  – 2011-10-25T19:04:42.763

If you want to access some variable, use %varname%, not %%varname. Try echo %first5. You never used first5 after SETting it? – Jens Erat – 2011-10-25T19:10:13.380

Could you provide some explanation about what your code does? – Tamara Wijsman – 2011-10-31T21:42:09.830

Did so. As these are primarily very basic operations I recommend you to have a look at some batch-tutorials (can't reference any, sorry - have a look yourself, most look a lot like beepworld and 90's but are still fine). More information about set can be got by calling set help set /?. – Jens Erat – 2011-11-01T00:10:13.810

1

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

pixnion

Posted 2011-10-25T18:30:15.897

Reputation: 46

0

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

Jay Bazuzi

Posted 2011-10-25T18:30:15.897

Reputation: 3 780