【问题标题】:Windows bat: files without extension (dot in name issue)Windows bat:没有扩展名的文件(名称中的点问题)
【发布时间】:2017-11-10 21:19:19
【问题描述】:

起初:这不是一个重复的问题(我希望如此)。我搜索了很多,发现了 How to find files with no file extension in directory tree with a batch file?Find and rename files with no extension? 等,但我还有一个“小”的额外问题。

我正在尝试在 Windows 10 上重命名多个(数千个)jpg 文件。名称格式为“名称 (ABC).jpg”或“多个名称 (ABC).jpg”。我需要“Some Name.jpg”。

你尝试过什么?很多事情,没有一个是真正的解决方案,直到这个:

for /f "tokens=1-3 delims=)(" %%a in ('dir /b *.jpg') do @rename "%%a(%%b)%%c" "%%a"
for /R %%x in (*.) do ren "%%x" *.png

它适用于大多数文件,除非名称中有一个点。如果名称类似于“A Name.Supercool (ABC).jpg”,则只有“A Name.Supercool”,没有扩展名。

我知道问题出在 (*.) 上,只是不知道如何解决...

【问题讨论】:

  • "你试过什么?这么多东西,没有一个是真正的解决方案" - 然而在 powershell 中,真正的解决方案只是gci *.jpg | ren -newname { ($_.basename -replace '\s+\(.*\)') + ".png"}。跨度>
  • 更好的解决方案,谢谢。这可能是公认的答案。

标签: batch-file


【解决方案1】:

Magoo 的回答更接近我的要求,但是文件名中的特殊字符存在问题。 TessellatingHeckler 发布了最好的方法作为评论,所以就在这里。批处理文件:

powershell -command "gci *.jpg | ren -newname { ($_.basename -replace '\s+\(.*\)') + '.jpg'};gci *.png | ren -newname { ($_.basename -replace '\s+\(.*\)') + '.png'}"

有了这个,我可以完美地同时处理 .jpg 和 .png。谢谢大家。

【讨论】:

    【解决方案2】:

    您的问题是,将文件重命名为“%%a”会产生“A Name.Supercool” - 而且它“没有扩展名”。

    啊——但确实如此。文件名为“A Name”,扩展名为“.Supercool”

    如果您将文件重命名为“%%a%%c”,那么名称将变为“A Name.Supercool.jpg”。

    现在为什么,在尝试将文件重命名为无扩展名之后,你又将它们重命名为 *.png 我不知道,不幸的是,你没有解释。您为什么不简单地将.png 添加到%%a - 如果这确实是您想要做的?

    (顺便说一句 - for /f ... dir... 方法会构建文件的内存列表,然后重命名它们,因此它们不会像 for %%x in (*.jpg)... 那样被重新处理)


    鉴于终端名称空间问题,

    for /f "tokens=1-3 delims=)(" %%a in ('dir /b *.jpg') do rename "%%a(%%b)%%c" "%%a%%c"
    SETLOCAL enabledelayedexpansion
    for /f "delims=" %%a in ('dir /b "* .jpg"') do (
     SET "name=%%a"
     REN "%%a" "!name:~0,-5!.jpg"
    )
    endlocal
    

    【讨论】:

    • "Multiple Names (ABC).jpg" 括号中的拆分在名称的末尾有一个空格,如果你加上.png,那么你会得到"Multiple Names .png",其中有一个空格。我推测这就是他们不这样做的原因。
    • 我试过“%%a(%%b)%%c”“%%a%%c”,但它在扩展名前放了一个空格,比如“A Name .jpg”(编辑: 更好的说法是,空间留在那里)。然后我做到了(首先使其无扩展名,然后重命名)。对于知道该怎么做的人来说可能是个坏主意......
    • %%a 传递给删除尾随空格的子例程不是更好吗?然后它可以只做一次ren "%%a(%%b)%%c" "!name!.png"
    • 版本测试。有一个小缺陷:如果名称类似于“Nice Name!(USA).jpg”,则不会删除空格。
    • 是的 - 当名称包含对批处理具有特殊含义的字符时,您可能会批量获得它 - % 无疑会遇到同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多