如何创建批处理文件来重命名文件夹中的大量文件?

19

我希望能使用一个批处理文件在WinXP系统中将一个文件夹中的大量文件进行重命名。

这些文件当前被命名为:

Vacation2010 001.jpg
Vacation2010 002.jpg
Vacation2010 003.jpg

我想将它们改为:

December 001.jpg
December 002.jpg
December 003.jpg

如何执行此操作?


你可能会喜欢XYplorer,我用了几年,直到我停止在家使用Windows。它有一个批量重命名界面,可以处理这种情况而无需编程,并且总体来说物超所值。 - Roger Pate
1
@Roger,Bulk Rename Utility(http://www.bulkrenameutility.co.uk)也是一个非常好的工具,而且它是免费的。 - bluish
5个回答

27
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET old=Vacation2010
SET new=December
for /f "tokens=*" %%f in ('dir /b *.jpg') do (
  SET newname=%%f
  SET newname=!newname:%old%=%new%!
  move "%%f" "!newname!"
)

这段代码的作用是循环遍历批处理文件所在文件夹中的所有 .jpg 文件,并将文件名中的 "Vacation2010" 替换为 "December"。


为了仅重命名选定的文件,我们可以像AB.jpg、ABC.jpg、ABCD.jpg那样指定文件名吗? - DeE DEe

11
dir /b *.jpg >file.bat

这将会给你如下的行:
Vacation2010 001.jpg Vacation2010 002.jpg Vacation2010 003.jpg
在你喜欢的Windows 文本编辑器中编辑file.bat文件,相当于执行以下操作:
s/Vacation2010(.+)/rename "&" "December \1"/

这是一个正则表达式; 许多编辑器支持它们,但是据我所知,没有任何默认附带Windows的编辑器支持。您还可以获取命令行工具,例如sed或perl,它可以接受我上面提到的精确语法,需要在命令行中进行转义。

生成的行将如下所示:

rename "Vacation2010 001.jpg" "December 001.jpg"
rename "Vacation2010 002.jpg" "December 002.jpg"
rename "Vacation2010 003.jpg" "December 003.jpg"

您可以将这些行识别为重命名命令,每个文件从原始列表重新命名一个。 ;) 在cmd.exe中运行批处理文件。


1
那个 dir 命令中的 /b 标志非常有用,不是吗? - Jim Mischel
@Jim:在cygwin下不如ls有用!:) dir /s也被低估了。 - Roger Pate
4
一个操作系统需要使用这样的技巧才能简单地重命名一组文件,这真是太可怕了,不是吗? - bluish

6

您可以轻松地完成此操作,无需手动编辑或使用高级文本编辑器。以下是一段VB脚本。

Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder="c:\test"
Set objFolder = objFS.GetFolder(strFolder)
For Each strFile In objFolder.Files
    If objFS.GetExtensionName(strFile) = "jpg" Then    
        strFileName = strFile.Name
        If InStr(strFileName,"Vacation2010") > 0 Then           
            strNewFileName = Replace(strFileName,"Vacation2010","December")
            strFile.Name = strNewFileName
        End If 
    End If  
Next 

将其另存为myscript.vbs并保存

C:\test> cscript //nologo myscript.vbs 

1
@ECHO off & SETLOCAL EnableDelayedExpansion

SET "_dir=" REM Must finish with '\'
SET "_ext=jpg"
SET "_toEdit=Vacation2010"
SET "_with=December"
FOR %%f IN ("%_dir%*.%_ext%") DO (
    CALL :modifyString "%_toEdit%" "%_with%" "%%~Nf" fileName 
    RENAME "%%f" "!fileName!%%~Xf"
)
GOTO end

:modifyString what with in toReturn
    SET "__in=%~3"
    SET "__in=!__in:%~1=%~2!"
    IF NOT "%~4" == "" (
        SET %~4=%__in%
    ) ELSE (
        ECHO %__in%
    )
    EXIT /B

:end

这个脚本允许你将所有包含Vacation2010的文件名更改为相同的名称,但是使用December代替Vacation2010
如果你复制并粘贴代码,你必须将.bat保存在照片所在的同一文件夹中。 如果你想将脚本保存在另一个目录中[例如你有一个喜欢的实用程序文件夹],你必须将_dir的值更改为照片的路径。
如果你需要对其他照片进行相同的操作[或者其他更改_ext的文件],你必须将_toEdit的值更改为你想要更改[或删除]的字符串,并将_with的值更改为你想要放置在_toEdit之前的字符串[如果你只想删除_toEdit中指定的字符串,则设置SET "_with="]。

1

您不需要批处理文件,只需从PowerShell执行以下操作:

powershell -C "gci | % {rni $_.Name ($_.Name -replace 'Vacation2010', 'December')}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接