如何根据比较按大小排序的其他目录中的文件名来批量重命名目录中的文件

How to mass rename files in a directory based on comparing file names in other directories sorted by size

我正在尝试制作一个批处理脚本,以根据另一个目录中的匹配名称重命名文件列表。我对此的思考过程是这样的:

注意事项

  1. 遍历目录 3 中的所有文件并按大小分配给一个数组
  2. 遍历目录2中的所有文件并按大小分配给一个数组
  3. 将目录 1 中的名称与目录 2 中的名称进行比较,并将匹配的文件重命名为目录 3 中的名称

这是我能想到的(我对批处理很不熟悉所以请原谅):


@Echo off
setlocal enableextensions enabledelayedexpansion
set /a i = 0
set /a j = 0
set /a k = 0
set /a l = 0

for /f "delims=" %%f in ('dir "PATHtoDirectory3*extension" /o:s /b') do (
    set d3[%i%] = %%f
    set /a i += 1
)
for /f "delims=" %%g in ('dir "PATHtoDirectory2*extension" /o:s /b') do (
    set d2[%j%] = %%g
    set /a j += 1
)
for /f "delims=" %%h in ('dir "PATHtoDirectory1*extension" /o:s /b') do (
    set d1[%l%] = %%h
    for /l %%x in (1,1,100) do (
        if !d1[%l%]! == !d2[%k%]! (ren !d1[%l%]! !d3[%k%]!) else (set /a k += 1)
    )
    set /a l += 1
)
endlocal

一个例子就好了。

假设我们在 3 个目录中都有(文件名大小):

dir1  dir2  dir3
c  1  b  6  w  6
d  2  c  7  x  7
a  3  a  8  y  8
b  4  d  9  z  9

我知道任务是在 dir1 中将 c 重命名为 x, d,z a,y b,w。

所以 - 对于您的代码(请使用描述性名称 - one-letter 名称很难理解,可能会与代码中的 metavariables 混淆,例如 %%x

for /f "delims=" %%f in ('dir "PATHtoDirectory3*extension" /o:s /b /a-d') do (
    set /a i += 1
    set "d3[!i!]=%%f"
)

添加 /a-d 开关以防止 dir 报告目录名称(“良好做法”,即使您确定(目前)没有子目录)

增加索引,然后存储数据。这意味着您正在处理 d3[1..count] 而不是 d3[0..count-1]。这将使生活更轻松。

删除 = 周围的空格,因为这些空格将分配给 variable-name 和存储在 string-assignment 中的值。 “引用语句”以确保将行中任何杂散的尾随空格分配给该值。

您需要索引的修改值; !var!是修改后的值,%var%是遇到语句时的值(即parse-time)

重复所有 3 个循环。

请注意 ijl 现在应该各自包含遇到的文件名数。据推测,这些应该是相同的。

下一个问题是,如果 d3 中的文件名与 d1 中的 any 文件名相同,那么您可能会尝试将 d1\xyz 重命名为 abcd1\abc 已经存在时。

d1 数组构建完成后,将 %%x 循环从原来的位置移动到

请注意,您有 ijl 中的名称计数,因此您可以使用

for /L %%x in (1,1,%i%) do ...

要遍历数组,您不需要使用任意数字。您可以嵌套 for 语句:

for /L %%x in (1,1,%i%) do for /L %%y in (1,1,%i%) do ...

现在您可以使用

简单地比较 d1、d2 名称
if "d1[%%x]"=="d2[%%y]"

如果这是真的,那么 d3[%%y] 包含新名称。

要实现这一点,请尝试

pushd PATHtoDirectory1
md tempdirname
for /L %%x in (1,1,%i%) do for /L %%y in (1,1,%i%) do if "d1[%%x]"=="d2[%%y]" (
 move d1[%%x] .\tempname\d3[%%y]
)
move .\tempdirname\* .
rd tempdirname
popd

其中pushd将当前目录切换到PATHtoDirectory1;创建一个临时目录那里;匹配每个名称并将文件移动到子目录中的新名称;将具有新名称的文件移回主目录;删除子目录和popd returns 到批次所在的原始目录 运行.

由于dir3中的名字是唯一的,所以子目录的名字也是唯一的,rename to same or existing name问题就解决了。