1

好的,所以我有一个包含一些文件的目录。我想做一个特定的文件重命名脚本,我被这部分卡住了,只取文件名每个部分的第一个字母:

如果文件名是

This.is.a.FIle.mp3

我想将其重命名为

tiaf.mp3

请注意,我希望它全部小写。

字长是可变的,所以我不能将它作为局部变量引用!变量:~0,2!

有人可以帮忙吗?谢谢!

编辑:我忘了问。如果您有想法进行测试,如果文件名是我提到的格式。因为如果文件被调用。'file.mp3' 那么我不希望它被重命名为 'f.mp3'

4

2 回答 2

4

这应该可以,但是如果您还想允许“!” 文件名中的感叹号,它必须有点扩展。

@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
)
于 2011-01-20T22:45:25.533 回答
3

这种逻辑对你有用吗:

@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 更改为适当的目录。

于 2011-01-20T20:44:46.240 回答