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

问题描述 投票:0回答:4

如何编写一个批处理或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 batch-file cmd rename
4个回答
40
投票

用于循环名称的 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 命令如何处理通配符:Windows RENAME 命令如何解释通配符?

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

ren *_120x90.jpg *_67x100.*

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


11
投票

从 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

0
投票

我发现这个批处理脚本非常有用(见下文),它基本上是dbenham解决方案的变体:

@echo off
setlocal enabledelayedexpansion

set "search=searchtext"
set "replace=replacetext"
set "extension=.jpg"

for %%F in (*%search%*) do (
 set "filename=%%~nF"
 set "newname=!filename:%search%=%replace%!"
 ren "%%F" "!newname!!extension!"
)

endlocal

您只需另存为 .bat 文件并在包含要重命名的文件的文件夹中运行它即可。首先,您切换出搜索文本并输入替换文本并在运行之前保存它。然后它只会重命名那些包含输入字符串的文件(现在是“searchtext”)。像这样使用通配符(即

*%search%*
),该字符串可以位于名称中的任意位置。

但是,此版本还将扩展名替换为输入的扩展名(.jpg)。对于我自己的使用,这就是我所寻找的,但如果您不想更改扩展名,则 dbenham 的版本使用“名称”而不是“文件名”,并结合删除有关扩展名的部分会更好。

我使用不同的文件(包括带有下划线的文件)运行了几次,到目前为止它按预期工作。


0
投票

我不得不说 Iain Samuel McLean Elder 的解决方案对我来说非常有效!

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

此目录有超过240个文件需要重命名

© www.soinside.com 2019 - 2024. All rights reserved.