пакетное переименование файла «This.is.a.FIlename.mp3» в «tiaf.mp3» - PullRequest
1 голос
/ 20 января 2011

хорошо, поэтому у меня есть каталог с некоторыми файлами. Я хочу сделать конкретный файл-переименование сценария я застрял с этой частью, принимая только первую букву каждой части имени файла:

если имя файла будет

This.is.a.FIle.mp3

Я бы хотел переименовать его в

tiaf.mp3

обратите внимание, я хочу, чтобы все было в нижнем регистре.

Длина слова является переменной, поэтому я не могу взять из нее ссылку как локальную переменную! Variable: ~ 0,2!

кто-нибудь может помочь? спасибо!

редактировать: я забыл спросить. Если у вас есть идея сделать тест, если имя файла имеет формат, который я упомянул. Потому что, если файл называется. 'file.mp3' тогда я бы не хотел, чтобы он был переименован в 'f.mp3'

Ответы [ 2 ]

4 голосов
/ 21 января 2011

Это должно работать, но если вы хотите разрешить также "!"восклицательные знаки в ваших именах файлов, они должны быть немного расширены.

@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
)
3 голосов
/ 20 января 2011

Подойдет ли вам такая логика:

@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

Вы можете изменить echo% a%, echo% b% и т. Д. На наборы и получить из них подстроку. Это также получает только первые 4 разделения, вы можете добавить больше, если вам нужно. Также измените C: \ temp на соответствующий каталог.

...