在多个文件名末尾添加“文本”

在多个文件名末尾添加“文本”

使用下面的代码我在文件名末尾添加文本:

1.mp3
2.mp3

应该是:

1text.mp3
2text.mp3

但它变成了:

1.mp3text
2.mp3text

代码:

@ECHO ON

FOR %%A IN ("C:\Users\user123\Desktop\mp3\*.mp2") DO (
    CALL :RenameFiles "%%~A" "%%~NXA"
)
GOTO EOF

:RenameFiles

SET fname=%~2
SET renname=%fname=%
REN "%~1" "%renname%text%"
GOTO E

答案1

如何在多个文件名末尾添加“文本”。

之前: 1.mp3 2.mp3

之后:1text.mp3 2text.mp3

您的批处理文件中存在多个错误,例如:

  • *.mp2应该*.mp3
  • goto E- 标签:E缺失。
  • 你不需要做call任何事情。

简单的工作批处理文件

rem @echo off
setlocal
setlocal enabledelayedexpansion
for %%a in ("C:\Users\user123\Desktop\mp3\*.mp3") do (
    copy "%%a" "%%~dpnatext%%~xa"
    del "%%a" 
)
endlocal

笔记:

  • 批处理文件可以处理任意长度的文件名,例如,12345.mp3将重命名为12345text.mp3

cmd壳牌解决方案

您不需要使用批处理文件。您只需使用:

cd C:\Users\user123\Desktop\mp3\
ren ?.mp3 ?text.mp3

或者:

ren *.mp3 ?text.mp3

请注意以下才不是工作:

ren *.mp3 *text.mp3

您将获得类似1.mp3text.mp3该命令的文件名。

例子:

F:\test>dir *.mp3
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

29/11/2015  12:52                 0 1.mp3
29/11/2015  12:52                 0 2.mp3
               2 File(s)              0 bytes
               0 Dir(s)  1,777,665,769,472 bytes free

F:\test>ren ?.mp3 ?text.mp3

F:\test>dir *.mp3
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

29/11/2015  12:52                 0 1text.mp3
29/11/2015  12:52                 0 2text.mp3
               2 File(s)              0 bytes
               0 Dir(s)  1,777,665,769,472 bytes free

进一步阅读

答案2

?您可以使用至少与原始名称一样长的一系列文本添加到任何文件名的末尾(第一个点之前,通常是扩展名的开头) 。

ren "C:\Users\user123\Desktop\mp3\*.mp3" ??????????????????????text.*

贪婪?匹配并保留任何字符除了 .,如果字符用完,则可以自由地不匹配任何内容。然后附加您的文本,然后.*匹配并保留点和名称的其余部分。

您可以根据需要修改源文件掩码以匹配您想要的任何文件。源掩码完全独立于重命名掩码。

Windows RENAME 命令如何解释通配符?了解更多信息。

.如果某些文件的名称中包含多个,则不能单独使用简单的 REN 命令。一种选择是使用批处理脚本:

@echo off
pushd "C:\Users\user123\Desktop\mp3\*.mp3"
for /f "delims= eol=:" %%F in ('dir /b /a-d *.mp3') do ren "%%F" "%%~nFtext%%~xF"
popd

请注意,务必使用 FOR /F,而不是简单的 FOR。FOR /F 在开始迭代之前会收集 DIR 命令的整个结果,而简单的 FOR 在内部缓冲区已满后才开始迭代,这会增加多次重命名同一文件的风险。

我使用EOL=:来防范文件名以 开头的可能性;。默认 EOL 是;,它会忽略以 开头的行;。文件名不能包含:,因此它是用于 EOL 选项的安全字符。

FOR /F 和 DIR /B 的一个小缺点是它不保留路径信息,这就是我一开始使用 PUSHD 的原因。如果没有 PUSHD,您可以在 DIR 命令中包含路径信息,但您还需要在 REN 源掩码中包含路径。以下一行程序在命令行上运行(无批处理脚本):

for /f "delims= eol=:" %F in ('dir /b /a-d "C:\Users\user123\Desktop\mp3\*.mp3"') do @ren "C:\Users\user123\Desktop\mp3\%F" "%~nFtext%~xF"

另一种方法是使用 FINDSTR 命令列出文件,这样可以方便地保留路径信息:

for /f "delims=" %F in ('findstr /m "^" "C:\Users\user123\Desktop\mp3\*.mp3"') do @ren "%F" "%~nFtext%~xF"

由于列出的每个文件都以驱动器号开头,因此可以安全地使用默认值EOL=;

最后一个选择 - 你可以使用我的JREN.BAT 正则表达式重命名实用程序。它是纯脚本(混合 JScript/batch),可以在 XP 及以上版本的任何 Windows 机器上本地运行。

jren "(.*)(\.mp3)$" "$1text$2" /i /p "C:\Users\user123\Desktop\mp3"

由于 JREN 是一个批处理脚本,因此如果在另一个批处理脚本中使用该命令,则需要使用 CALL JREN。

答案3

在这种情况下,搜索文本中带有正则表达式的 PowerShell Rename-Item 命令将会起作用。

Get-ChildItem -Filter '*mp3' -Recurse | Rename-Item -NewName {$_.name -replace '(.*)\.mp3','$1text.mp3'}

(.*)一个正则表达式组,其中.匹配除换行符之外的任何字符,而*匹配 零次或多次。\.匹配 mp3 之前的句点。然后在替换文本中,$1插入在第一个组中匹配的文本(.*),后跟要结尾的其余文本。
这适用于可变长度的文件名以及包含空格、下划线和其他字符组合的文件名。

答案4

它必须在批处理文件中完成吗?高级重命名器是一款免费且功能强大的批量重命名文件或文件夹的程序。轻松解决您的问题。

相关内容