使用 Windows 批处理脚本重命名目录中的所有文件

Posted

技术标签:

【中文标题】使用 Windows 批处理脚本重命名目录中的所有文件【英文标题】:Rename all files in a directory with a Windows batch script 【发布时间】:2012-03-12 02:04:31 【问题描述】:

如何编写批处理或 cmd 文件来重命名目录中的所有文件?我正在使用 Windows。

改变这个:

750_MOT_Forgiving_120x90.jpg
751_MOT_Persecution_1_120x90.jpg
752_MOT_Persecution_2_120x90.jpg
753_MOT_Hatred_120x90.jpg
754_MOT_Suffering_120x90.jpg
755_MOT_Freedom_of_Religion_120x90.jpg
756_MOT_Layla_Testimony_1_120x90.jpg
757_MOT_Layla_Testimony_2_120x90.jpg

到这里:

750_MOT_Forgiving_67x100.jpg
751_MOT_Persecution_1_67x100.jpg
752_MOT_Persecution_2_67x100.jpg
753_MOT_Hatred_67x100.jpg
754_MOT_Suffering_67x100.jpg
755_MOT_Freedom_of_Religion_67x100.jpg
756_MOT_Layla_Testimony_1_67x100.jpg
757_MOT_Layla_Testimony_2_67x100.jpg

【问题讨论】:

windows 和任何在 .bat 或 .cmd 文件中运行的东西? 伙计,如果你需要帮助,你不能指望每个人都是通灵者。 【参考方案1】:

用于遍历名称的 FOR 语句(键入 FOR /? 以获得帮助)以及字符串搜索和替换(键入 SET /? 以获得帮助)。

@echo off
setlocal enableDelayedExpansion
for %%F in (*120x90.jpg) do (
  set "name=%%F"
  ren "!name!" "!name:120x90=67x100!"
)

更新 - 2012-11-07

我研究了 RENAME 命令如何处理通配符:How does the Windows RENAME command interpret wildcards?

事实证明,使用 RENAME 命令可以非常轻松地解决这个特定问题,而无需任何批处理脚本。

ren *_120x90.jpg *_67x100.*

_ 之后的字符数无关紧要。如果120x90 变为xxxxxxxxxxx,重命名仍然可以正常工作。这个问题的重要方面是最后一个_. 之间的整个文本都被替换了。

【讨论】:

我不确定这是否是一个完整的示例。但是This 为我工作就像一个魅力:) @Anand - 我添加了一个更简单的解决方案,只使用 REN 命令。你评论里的链接和我原来的答案基本一样。 你能把你的两个答案分开吗?我会把ren 单线留在这个;这是最好的!【参考方案2】:

从 Windows 7 开始,您可以在一行 PowerShell 中执行此操作。

powershell -C "gci | % rni $_.Name ($_.Name -replace '120x90', '67x100')"

说明

powershell -C "..." 启动 PowerShell 会话以运行引用的命令。当命令完成时,它返回到外壳。 -C-Command 的缩写。

gci 返回当前目录下的所有文件。它是Get-ChildItem 的别名。

| % ... 建立一个管道来处理每个文件。 %Foreach-Object 的别名。

$_.Name 是管道中当前文件的名称。

($_.Name -replace '120x90', '67x100') 使用-replace 运算符来创建新文件名。每次出现的第一个子字符串都被第二个子字符串替换。

rni 更改每个文件的名称。第一个参数(称为-Path)标识文件。第二个参数(称为-NewName)指定新名称。 rni 是 Rename-Item 的别名。

示例

$ dir
 Volume in drive C has no label.
 Volume Serial Number is A817-E7CA

 Directory of C:\fakedir\test

11/09/2013  16:57    <DIR>          .
11/09/2013  16:57    <DIR>          ..
11/09/2013  16:56                 0 750_MOT_Forgiving_120x90.jpg
11/09/2013  16:57                 0 751_MOT_Persecution_1_120x90.jpg
11/09/2013  16:57                 0 752_MOT_Persecution_2_120x90.jpg
               3 File(s)              0 bytes
               2 Dir(s)  243,816,271,872 bytes free

$ powershell -C "gci | % rni $_.Name ($_.Name -replace '120x90', '67x100')"

$ dir
 Volume in drive C has no label.
 Volume Serial Number is A817-E7CA

 Directory of C:\fakedir\test

11/09/2013  16:57    <DIR>          .
11/09/2013  16:57    <DIR>          ..
11/09/2013  16:56                 0 750_MOT_Forgiving_67x100.jpg
11/09/2013  16:57                 0 751_MOT_Persecution_1_67x100.jpg
11/09/2013  16:57                 0 752_MOT_Persecution_2_67x100.jpg
               3 File(s)              0 bytes
               2 Dir(s)  243,816,271,872 bytes free

【讨论】:

@MethodMan 时间戳应该有什么值? 我通过弄乱 RobbCopy 脚本并在 bat 文件中创建一个 goto 函数来解决这个问题。谢谢我对 powershell 不太熟悉,但如果我必须有一个时间戳值,它会是yyyymmddss,其掩码将具有_1 _2 _3 etc...,具体取决于文件的数量。我可以使用robocopy在批处理文件中执行此操作..

以上是关于使用 Windows 批处理脚本重命名目录中的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

Windows 批处理脚本用它的第一行重命名 PDF 文件(循环可能)?

如何使用 bash 脚本重命名当前目录及其子目录中的文件?

Windows批处理脚本实现批量复制文件并重命名

Bat批处理:批量重命名包含指定名称文件夹里的指定文件

重命名目录中的所有文件?

递归批量重命名文件扩展名(Windows批处理)