如何从文件名中删除除括号内容之外的所有内容
Posted
技术标签:
【中文标题】如何从文件名中删除除括号内容之外的所有内容【英文标题】:How to remove everything EXCEPT contents of brackets from a filename 【发布时间】:2021-04-20 22:15:26 【问题描述】:我有一个包含大约 1700 个音频文件的文件夹,格式如下:
CybirdConanVoice2Cri#1 (AGA_SE1).wav
CybirdConanVoice2Cri#2 (AGA_SE10).wav
CybirdConanVoice2Cri#3 (AGA_SE11).wav
我想删除每个文件名的第一部分,只留下括号的内容。例如:
AGA_SE1.wav
AGA_SE10.wav
AGA_SE11.wav
我做了一些研究,似乎批处理可能是解决这个问题的最佳方法。我对批处理没有太多经验,但我想我会尝试自学足以解决这个问题。
我在 *** 上发现了许多问题,询问如何删除括号内的所有内容,但没有关于如何仅保留括号内的文本。摆弄了几个小时后,我整理了这段代码:
cd C:\Users\ etc etc
setlocal enabledelayedexpansion
for %%a in (*.wav) do (
set f=%%a
set g=%f:*(=%
ren "%%a" "!g!"
)
但是,当我在其中一个文件上尝试这个时,我得到了这个:CybirdConanVoice2Cri#1 (=
。我想知道是否有更多经验的人可以帮助我,或者指出我的代码哪里出错了?提前致谢!
【问题讨论】:
将第一个FOR
命令的输出放入FOR /F
命令中,该命令允许您使用DELIMS
选项拆分字符串。 FOR /F "tokens=2 delims=()" %%G in ("%%a") Do ....
谢谢@Squashman!我现在几乎可以正常工作了 - 感谢您的帮助!
【参考方案1】:
@ECHO OFF
SETLOCAL
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*(*)*" '
) DO (
FOR /f "tokens=2delims=()" %%r IN ("%%a") DO ECHO REN "%sourcedir%\%%a" "%%r%%~xa"
)
GOTO :EOF
第一个for
将源目录中每个匹配*(*)*
的文件名依次分配给%%a
。 delims=
确保分配了整个文件名。
内部for
分析%%a
中的文件名,使用(
和)
(分隔符)进行标记,并将第二个标记分配给%%r
。
然后重命名(Echo
ed 仅用于验证)
您的代码 - 可能有效,但由于 f
在循环中被更改,您需要使用 set g=!f:*(=!
,然后您仍然需要删除 )
。假设没有whatever (required)somethingelse.wav
模式的文件,那么重命名可能是!g:~0,-5!.wav
,其中-5
表示“除了最后5 个字符之外的所有字符,即).wav
。
dir
方法在内存中构建文件名列表,然后处理该列表。 for in (pattern)
方法可能会导致重命名文件可以重新处理的问题,因为名称是按遇到的顺序处理的。
语法SET "var=value"
(其中值可能为空;在这种情况下var
变为未定义)用于确保分配的值中不包含任何杂散的尾随空格。
【讨论】:
【参考方案2】:要修复您的代码,您只需将 f
变量更改为文件名,然后对新的 g
变量使用延迟扩展,同时删除最后一个字符,最后重新添加扩展名。
cd C:\Users\etc\etc
setlocal enabledelayedexpansion
for %%a in (*.wav) do (
set f=%%~na
set g=!f:*(=!
ren "%%a" "!g:~,-1!%%~xa"
)
您还可以使您的 cd
命令和文件 glob 更健壮一点,并为您的内容添加双引号以提高安全性。*
cd /d "C:\Users\etc\etc"
setlocal enabledelayedexpansion
for %%a in ("?*(*).wav") do (
set "f=%%~na"
set "g=!f:*(=!"
ren "%%a" "!g:~,-1!%%~xa"
)
【讨论】:
以上是关于如何从文件名中删除除括号内容之外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章
如何从工作区中删除除您要保留的文件之外的所有文件? [复制]