如何编写一个批处理或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
用于循环名称的 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
,重命名仍然可以正常工作。这个问题的重要方面是最后一个_
和.
之间的整个文本被替换。
从 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
我发现这个批处理脚本非常有用(见下文),它基本上是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 的版本使用“名称”而不是“文件名”,并结合删除有关扩展名的部分会更好。
我使用不同的文件(包括带有下划线的文件)运行了几次,到目前为止它按预期工作。
我不得不说 Iain Samuel McLean Elder 的解决方案对我来说非常有效!
powershell -C "gci | % {rni $.Name ($.Name -replace '120x90', '67x100')}"