开发者

batch file renaming "This.is.a.FIlename.mp3" to "tiaf.mp3"

okay so I have a dir with some files. I want to do a specific file-renamingscript i'm stuck with this part, taking only the first letter of each part of the filename:

if the filename would be

This.is.a.FIle.mp3

I would like to rename it to

tiaf.mp3

notice i want it to be all in lowercase.

The word length is variable so i cant take reference from it as a local variable !variable:~0,2!

anyone could help? thanx!

edit: i forggot to ask. If you have an idea to make a test if the filename is of the format i mentioned. Because if the file is called. 'file.mp3' then i wouldn't want it to be renamed to 'f.mp开发者_高级运维3'


This should work, but if you want to allow also "!" exclamation marks in your filenames, it have to be a little bit extended.

@echo off
setlocal EnableDelayedExpansion
for %%f in ("C:\temp\folder\*.*") do (
    call :createName "%%~f"
)
goto :eof


:: Compress a filename with more than one dot to only the first (lower) letters of each part
:: one.TWO.three.four.exe to ottf.exe
:createName <dot-filename>
setlocal
set "filename=#.%~n1"
set "ext=%~x1"
set "count=0"
set "short="

:createName.loop
for %%a in ("!filename!") do (
    set "part=%%~xa"
    set "filename=%%~na"

    if defined part (
        set /a count+=1
        set "char=!part:~1,1!"
        call :toLower char
        set "short=!char!!short!"
    ) ELSE (
        set "char="
    )   
    rem echo "%%~na"-"%%~xa" "!char!"  "!short!"
)
if defined part goto :createName.loop
set "short=!short!!ext!"
if !count! GTR 1 (
    echo ren "%~f1" "!short!"
)
(
    endlocal
    goto :eof
)


:: convert a char to the lower variant or leave it unchanged if it isn't a char
:: use the %var:*n=% syntax to remove the front of a string, to get the correct char
:toLower <variable to char>
setlocal EnableDelayedExpansion
(
set "char=!%~1!"
set "helper=##aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz"
set "lower=!helper:*%char%=!"
set "lower=!lower:~0,1!"
if "!lower!"=="#" set "lower=!char!"
)
(
    endlocal
    set "%~1=%lower%"
    goto :eof
)


Would this kind of logic work for you:

@echo off

for /f "delims=|" %%f in ('dir /b C:\temp') do call :runsub %%f
goto EOF

:runsub
for /f "tokens=1,2,3,4 delims=." %%a in ("%~n1") do set a=%%a&set b=%%b&set c=%%c&set d=%%d

if not "%a%"=="" echo %a%
if not "%b%"=="" echo %b%
if not "%c%"=="" echo %c%
if not "%d%"=="" echo %d%

:EOF

You can change the echo %a%, echo %b%, etc. to sets and get the substring from these. This also only gets the first 4 splits, you can add more if you need. Also change C:\temp to the appropriate directory.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜