我有一堆文件,名称如下:
01. Filename.ext
02. Filename.ext
03. Filename.ext
etc.
我需要使用 PowerToys PowerRename 批量重命名它们,方法是将文件名开头的数字增加一个特定值,比如说 15,这样它们的名称就变成例如:
16. Filename.ext
17. Filename.ext
18. Filename.ext
etc.
据我所知,我应该使用正则表达式来完成这项任务。不幸的是,这是我对此事的全部理解。
因此,我请求您帮助我完成这个确切的任务:在“搜索:”和“替换为:”字段中输入什么?
答案1
答案2
这电源外壳选项:
$Increment = 15
Get-ChildItem | Where Name -match '^(\d+)(.+)$' |
Select FullName,
@{ N = 'Index' ; E = { [Int]$Matches[1] }},
@{ N = 'NameText' ; E = { $Matches[2] }} |
Sort Index -Descending | ForEach{
Rename-Item $_.FullName -NewName ( '{0:d2}{1}' -f ( $_.Index + $Increment ), $_.NameText ) }
具体来说:
- 这
-match
操作员用途正则表达式匹配,返回布尔值并填充$Matches
自动变量. 正则表达式'^(\d+)(.+)$'
将匹配以一个或多个数字开头且这些数字后跟至少一个字符的任何字符串,并生成两个捕获组,第一个捕获组包含前导数字,第二个捕获组包含所有后续文本:
PS C:\>>'01. FileName.txt' -match '^(\d+)(.+)$'
True
PS C:\> $matches
Name Value
---- -----
2 . FileName.txt
1 01
0 01. FileName.txt
PS C:\>'{0:d2}{1}' -f 7, '. FileNaem.txt'
07. FileNaem.txt
- 这重命名项目Cmdlet 的
-NewName
参数可以是字符串或脚本块,脚本块允许新名称基于当前$Matches
变量中的值:
{ '{0:d2}{1}' -f ( $Increment + $matches[1] ), $matches[2] }
答案3
// 编辑
灵感来自@Keith Miller 的在cmd/bat中使用降序/反向循环重命名文件的想法:
set "_n=" & set "_c=" & <nul (for /l %i in (99 -1 16)do set/a "_c=100%~i-15, _n=100%~i" && cmd/v/c "ren "!_c:~-2!.*.ext" "!_n:~-2!.*.ext"")
要在 PowerShell 中执行相同操作:
$i=(ls *.ext).count+16 ; For($i -eq 15; $i--) {
$old=($i-15).ToString("00") ; ls $($old+'. *.ext')|
% {ren $_ -new ($_.Name.Replace("$old. ","$i. "))}}
编辑 //
set "_n=" & for /l %i in (1 1 84)do @set "_n=00%~i" && @cmd/v/c "ren "!_n:~-2!.*.ext" "!_n:~-3!.*.ext""
set "_n=" & set "_c=" & >nul (for /l %i in (1 1 84)do @set/a "_c=1000%~i+15" && @set/a "_n=1000+%~i" && @cmd/v/c "ren "!_n:~-3!.*.ext" "!_c:~-2!.*.ext"")
您也可以在命令行中执行此操作:
观察:1.假设在重命名两位数时
观察:2。您的文件夹共有 84 个文件 = 100 - 16
观察:3。所有文件都有相同的扩展名。
1.首先,给每个文件添加一个数字,重命名16. file.ext
->016. file.ext
,从而避免重命名时发生冲突01. file.ext
以……的名义16. file.ext
(现有文件)
set "_n=" & for /l %i in (1 1 84)do @set "_n=00%~i" && @cmd/v/c "ren "!_n:~-2!.*.ext" "!_n:~-3!.*.ext""
观察:4。使用For /L
从 1 循环到 84,定义_n=001
,在前面变量中添加00时%i
,最大长度为 2 的子字符串(文件源"!_n:~-2!.*.ext"
)和最大长度为 3 的子字符串(文件目标"!_n:~-3!.*.ext"
)将用于ren
循环重命名文件:
2.再次使用For /L
从 1 循环到 84,定义_c=1000%~i+15
,当添加 1000 时,添加到变量中%i
,最大长度为 3 的子字符串(文件源"!_c:~-3!.*.ext"
)和最大长度为 3 的子字符串(文件目标"!_n:~-2!.*.ext"
)将用于ren
循环重命名文件:
for /l %i in (1 1 84)do @set/a "_c=1000%~i+15" && @set/a "_n=1000+%~i" && @cmd/v/c "ren "!_n:~-3!.*.ext" "!_c:~-2!.*.ext""
观察:5。循环中的结果将从 1 到 84:
ren 001.file.ext 16.file.ext
ren 002.file.ext 17.file.ext
ren 003.file.ext 18.file.ext
...
ren 084.file.ext 99.file.ext
观察:6。这可以轻松扩展到 1 到 840、1 到 8400,...:
for /l %i in (1 1 840)do ...
... set "_n=000%~i"
... cmd/v/c "ren "!_n:~-3!.*.ext" "!_n:~-4!.*.ext""
for /l %i in (1 1 840)do ...
... set/a "_c=10000%~i+15"
... set/a "_n=10000+%~i"
... cmd/v/c "ren "!_n:~-4!.*.ext" "!_c:~-3!.*.ext"")
Bat/CMD中也是一样:
@echo off && cd /d "%~dp0"
set "_n=" & for /l %%i in (1 1 84
)do set "_n=00%%~i" && cmd/v/c "ren "!_n:~-2!.*.ext" "!_n:~-3!.*.ext""
set "_n=" & set "_c=" & >nul (for /l %%i in (1 1 84
)do set/a "_c=1000%%~i+15, _n=1000+%%~i" && cmd/v/c "ren "!_n:~-3!.*.ext" "!_c:~-2!.*.ext"")