Batch file Windows bat:不带扩展名的文件(名称中的点问题)

Batch file Windows bat:不带扩展名的文件(名称中的点问题),batch-file,Batch File,一开始:这不是一个重复的问题(我希望)。我已经搜索了很多,发现了很多,但我还有一个“小”问题 我正在尝试重命名Windows 10上的多个(数千个)jpg文件。名称格式为“名称(ABC).jpg”或“多个名称(ABC).jpg”。我需要“某个名字.jpg” 你尝试了什么?这么多东西,都不是真正的解决方案,直到: for /f "tokens=1-3 delims=)(" %%a in ('dir /b *.jpg') do @rename "%%a(%%b)%%c" "%%a" for /R %

一开始:这不是一个重复的问题(我希望)。我已经搜索了很多,发现了很多,但我还有一个“小”问题

我正在尝试重命名Windows 10上的多个(数千个)jpg文件。名称格式为“名称(ABC).jpg”或“多个名称(ABC).jpg”。我需要“某个名字.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”,没有扩展名


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

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

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

如果要将文件重命名为“%%a%%c”,则名称将变为“a name.Supercool.jpg”

现在,在尝试将文件重命名为无扩展名之后,为什么要将它们重命名为
*.png
我不知道,不幸的是,您没有解释。你为什么不干脆把
.png
添加到
%%a
——如果你真的想这么做的话

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


考虑到名称中的终端空间问题

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

Magoo的答案与我的要求更接近,但文件名中的特殊字符存在问题。Tessellingheckler将最佳方法作为评论发布,现在开始。批处理文件:

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

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

“多个名称(ABC).jpg”
在名称的末尾有一个空格,如果你加上
.png
,你会得到带有空格的
“多个名称.png”
。我推测这就是他们不这么做的原因。我尝试了“%%a(%%b)%%c”“%%a%%c”,但它在扩展名之前放了一个空格,比如“a Name.jpg”(编辑:更确切地说,空格就在那里)。然后我做了(首先使其无扩展,然后重命名)。对于知道该做什么的人来说,这可能是个坏主意……将
%%a
传递给删除尾随空格的子例程不是更好吗?然后它可以只执行一次
ren“%%a(%%b)%%c”“!name!.png”
。已测试版本。使用一个小缺陷:如果名称类似于“Nice name!(USA).jpg”,则不会删除空格。是的-当名称包含对批处理有特殊意义的字符时,很可能会在批处理中得到空格-
%
无疑会遇到同样的问题。“您尝试了什么?这么多东西,没有一个是真正的解决方案”-然而,在powershell中,真正的解决方案只是一个
gci*.jpg|ren-newname{($\.basename-replace'\s+\(.*))+“.png”}
away。更好的解决方案,谢谢。这可能是公认的答案。