尝试根据文件大小重命名文件

Trying to rename files based on file size

我正在尝试根据另一个目录中 mp4 文件的文件大小重命名一些 MP4 文件。我想将所有大小相同的文件命名为相同的名称。这意味着如果源文件的文件大小与比较目录中文件的大小匹配,则源文件将重命名为比较文件的名称。因为这两个目录都需要递归读取,所以我认为通过使用 DIR /s /b echo %%~zs>>filesizelist.txt 来制作一个列表以便与 2 列中的信息进行比较会更容易命令给我一个像

这样的列表

123456789 电影.mp4

987654321 电影2.mp4

然后将所有源 mp4 传递到批处理文件,如果 %%~za 与第一列中的值匹配,则将文件发送到 对应的文件名。这是最好的路径吗?我试图编写脚本让它在运行中运行,但这是行不通的,也是我 3 天头痛的根源(加上参考列表很少更改,而且显然很容易更新)。有人可以帮我写剧本吗?

我用我的 mp4 做了一些测试,代码有效,要执行测试,您需要 change/put 上面的这两行以及 folder/directory 的路径(一个保留另一个比较),通过替换行代码是这样的:

`set "_target_to_keeped=C:\Users\ecker\Videos\Target"`
`set "_target_to_rename=C:\Users\ecker\Videos\Ren_it"`

您需要在同一行添加要保留的文件和要重命名的文件(如果大小+名称匹配)的文件夹,这是该测试中两行代码所在的位置(抱歉无法用流利的英语解释,我的英语是帮不了我)。到现在,已经很晚了01:53,我需要睡觉了...是的!所以,有好的代码!

@echo off && setlocal enableextensions enabledelayedexpansion 

cd /d "%~dp0"

set /a _cnt_in_looping= 1 - 1
set /a _cnt_files_size= 1 - 1

set "_target_to_keeped=C:\Users\ecker\Videos\Target"
set "_target_to_rename=C:\Users\ecker\Videos\Ren_it"

cd /d "!_target_to_keeped!"

for /f "tokens=* delims=^ " %%i in ('^<nul dir /o-d /on /b "*.mp4" 2^> nul ^| find "" /v /c') do set _cnt_in_looping=%%i

for /f "tokens=* delims=^ " %%i in ('^<nul dir /o-d /on /b "*.mp4"') do (

     set "_file_now_keep=%%i"
     set "_file_now_keeped=%%~zi %%i"

     call :_to_compare_:

    )

set /a _total_files_renamed=!_cnt_in_looping! - !_cnt_files_size!
set /a _total_files_n_chang=!_total_files_renamed! - !_cnt_in_looping! * -1

echo/Total of files renamed = !_total_files_renamed!
echo/Total of files n chang = !_total_files_n_chang!

endlocal 

goto :_end_of_file_:

:_to_compare_:

if not exist "!_file_now_keep!" exit /b 

for /f "tokens=*" %%I in ('^<nul dir /o-d /on /b "!_file_now_keep!"') do (

     set "_file_now_compare=%%~zI %%I"
     set "_path_now_compare=%%~dpI"

     if "!_file_now_compare!" == "!_file_now_keeped!" ( 

         rename "!_path_now_compare!\%%I" "%%~zI %%I"
         echo/ rename "%%~I" "%%~zI %%I" 

         if ["!errorlevel!"]==["0"] call set /a _cnt_files_size=!_cnt_files_size! + 1
         timeout /t 10
        )

    )

exit /b

:_end_of_file_: