【问题标题】:batch file renaming "This.is.a.FIlename.mp3" to "tiaf.mp3"将“This.is.a.FIlename.mp3”重命名为“tiaf.mp3”的批处理文件
【发布时间】:2011-06-12 17:10:29
【问题描述】:

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

如果文件名是

This.is.a.FIle.mp3

我想把它重命名为

tiaf.mp3

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

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

有人可以帮忙吗? 谢谢!

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

【问题讨论】:

  • 您使用的是什么操作系统和外壳?
  • 我想也许我可以提取文件名 %%~n,把它放在一个变量中,然后我必须搜索每个单词后面都有一个点(第一部分除外?? ) 如果我将这些放入变量中,我可以使用 !variable:~0,1! 调用它们!这可能吗?

标签: string batch-file filenames extract renaming


【解决方案1】:

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

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

【讨论】:

  • 这正是我所需要的!你能告诉我我可以在代码中的哪个位置进行测试吗?用于文件名部分的数量。如果它只由一个部分组成,我想调用另一个函数
  • 在 if !count! GTR 1 ...部分
【解决方案2】:

这种逻辑对你有用吗:

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

【讨论】:

  • thanx,但我确实得到了 2 次回声操作。所以它会打印所有单词,然后再打印一次。知道哪里出了问题吗? "%a%"=="" 测试是什么意思?
  • 我尝试添加一个 'e=%%e&set',但是当文件名包含少于 5 的部分时,我会出错。知道如何解决这个问题吗?
  • test %a%"=="" 在尝试在命令中使用变量之前检查变量是否为空。如果文件名中由 '.' 分隔的值较少,则变量将为空。比它分配给的变量(即,如果文件名是 qwe.rty.mp3,则只有变量 %a% 和 %a% 将具有值,而其他变量将为 "" 空。
  • 对于 e 它看起来像这样:对于 /f "tokens=1,2,3,4 delims=." %%a in ("%~n1") do set a=%%a&set b=%%b&set c=%%c&set d=%%d&set e=%%e
  • FOR-token 必须扩展为 FOR /f "tokens=1,2,3,4,5 delims=."因此这个解决方案不是很灵活
猜你喜欢
  • 2019-06-08
  • 2012-12-10
  • 2014-02-26
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
相关资源
最近更新 更多