Duplicate cleaner pro 的使用技巧

  • 前言
  • 文件去重
    • 基本介绍
    • 经验之谈
    • 目录结构
  • 修改盘符
    • 起因
    • 方法
      • 手动分配方法‌
      • 数据修改方法
        • 安装sqlite-web
        • 修改数据库
  • GPU加速
      • 安装驱动
        • 获取驱动和硬件信息
        • 安装CUDA
        • 配置环境变量(如果是自定义安装)
      • 创建程序
        • <1>获取参数和命令
        • <2>选择命令参数
        • <3>修改原来的ffmpeg.exe为其他名称
        • <4>要确认怎么将bat转换成exe
        • <5>编写bat脚本
        • <6>将bat转换成exe
      • 实际效果
      • 问题解答
  • DLL及其他软件文件误删除恢复

前言



很长时间没写文了,不写东西也成了习惯。我发现很多人推广软件,但是不详细介绍如何使用,只是在不断的发简介。因此我在这里就不介绍Duplicate cleaner pro是干嘛的了,因为查这篇文的应该是想要获取某种技巧。所以这篇文章,主要介绍的是使用Duplicate cleaner pro 进行去重的一些使用经验,其中包括一些官方文档和截止到今日全网都没有人去总结的技巧。

我发现写东西一直的确有点枯燥,很多Makedown语法没用到,尽量去搞的好看点



文件去重



基本介绍



‌Duplicate Cleaner Pro是一款专业的重复文件查找和清理工具‌,适用于Windows系统,能够通过多种方式(如文件内容、名称、大小、日期等)快速扫描并清理重复的图片、音乐、视频等文件,同时支持高级功能如硬链接处理和图像比较。‌‌‌‌

可清理的文件包括视频,图片,音频,文档,实际上也可用于其他格式文件的去重,例如模型文件,数据库.data文件等等,不过对于这些没有包含在内置设定中的格式的文件,需要进行如下操作:
1、内置设定中新建文件过滤器,也可直接使用任意类型
2、在扫描位置中,选择要扫描的硬盘和目录
3、在探索规则中选择常规模式,过滤器中勾选新建得文件过滤器或者所有文件类型
4、使用md5的方式,通过扫描和计算文件内容的md5,来确认文件是否重复。

这种通过md5确认文件是否重复的方式被广泛应用于某卫士和某电脑管家等电脑管理软件的重复文件清理中。而Duplicate Cleaner Pro的其中之一的优势在于可以灵活选择搜索范围‌,选择文件格式和选择其他条件(文件名,大小,日期等)进行扫描,并且对不同的文件格式有对应的搜索规则和模式,而系统或者电脑厂家自带的重复文件清理往往不能精确选择,要花费大量的时间扫描一整个硬盘的所有文件,其中电脑厂家自带的重复文件清理扫描文件通常最快,因为它在后台偷偷就在进行扫描和搜集一些信息,而不是当你点击重复文件清理才开始扫描。并且Duplicate Cleaner Pro界面也算舒服,的确能算优点,有一些很久之前试过的去重软件界面一点美学设计没有。

关于这个软件的下载,包括其他任何软件。建议找官方网站,而不是找第三方或者自称有代理权的网站,往往它们软件中总是夹带私货。当然如果你不在意这些,包括病毒,为了方便那就随意了。实际上包括有些博主或者某些网站提供的软件,部分情况都带有木马或后门,而且8成不是从官方下载的,某些网站你以为它提供了下载地址就会负责,实际它也只是从某些绿色网站下载,重新打包或者不做任何修改并进行传播。
https://www.duplicatecleaner.com/



经验之谈



关于它的具体功能还包括‌多维度扫描‌‌,灵活搜索范围‌,安全清理机制,通过百度等翻译或者把界面切换成你的语言,多试几次可以很自然的理解和掌握基础的使用,因此这里说一些小经验,官方文档在某些情况下读的确实有些模棱两可。

  1. 这个软件对不同的文件格式有对应的搜索规则和模式,通常还是建议:是什么文件,搜索规则就使用它的什么模式即可。因为它给不同的文件设置了对应这个文件格式的不同的算法或者匹配设置。例如:视频就使用视频模式,图片就使用图片模式,音频就使用音频文件即可,其中常规模式适配任何需要去对比md5的文件,md5是通过计算文件内容得到的。

  2. 当使用md5或者哈希值的时候,文件查找重复的精确度通常最高,可以在扫描结束后,选择不同的筛选方式来保留或者去除符合条件的某一组文件。普通文档或模型等文件,选择常规模式即可,使用常规模式- 相似内容(75%),常规模式- 相同内容 : MD5 都可以,它是把文件内容计算出哈希值进行对比。

  3. 关于图片和音频的对比,使用对应的模式和默认设置即可,也可根据需求调整设置。因为通常情况下都是小文件,对比的速度特别快。

  4. 视频模式常用的包含:哈希值 - 视频 ; 匹配视频抽样帧; 匹配缩略图 ;音频 - 近似比较(开头15秒)音频 - 近似比较(开头2分钟); 哈希值 - 视频+音频
    关于视频的去重,可以使用哈希值或者使用匹配视频抽样帧等方式,建议使用这2种,准确度最高,速度最快。其他方式不是算法越复杂需要的时间越多(例如:哈希值 - 视频+音频(要求的精确度最高,效率最慢,精确度低一点的视频内容未必不是需要去重的),
    就是精确的不高(例如:匹配缩略图,精确度最低,速度最快。因为即使同一个视频内容,封面未必都是配置的第一帧截图,而且大多数视频有片头。封面不同未必是同一个内容,封面相同未必其他内容一致。例如一个电视剧片头片头曲一致,缩略图大概率也是第一帧,那么用这个方法,第一集到第十二集都被认定为重复)

  5. 使用哈希值 - 视频,哈希值需要计算,占用内存和CPU,这个查找重复的精确度通常最高,找到的文件必然是重复的。但是对于视频内容是同一个,视频长度不同,分辨率不同,长宽不同,开头不同,水印不同的等情况下,使用md5方式并不能达到好的去重效果

  6. 使用匹配视频抽样帧的方式,它会调用ffmpeg,对每个视频文件抽取一定的帧,生成截图并进行对比,占用CPU资源。建议匹配时长配置30秒,因为10-15秒太短,从1-15秒匹配的帧大概率可能是个视频的广告开头,而广告开头可能大量的一致,这容易导致开头广告一致的会被扫描成重复视频。配置成几分钟需要等待的时间又太长。(实际上经过测试,它自带的ffmpeg是支持CUDA或者GPU的,但是官方没有做GPU的配置,因为使用cpu命令已经满足了几乎所有视频的转码和截图与适配大部分人的设备,人们不一定有显卡,显卡不一定好,厂商未必一致。因此引入GPU设置又可能会导致更多的问题,所以官方没做。但是由于我嫌效率太慢,GPU又处于闲置状态,于是后面有我对navida的适配做的插件或者说挟持脚本)

  7. 关于对视频的音频 - 近似比较,通常音频的计算比视频的计算快。如果配置开头15秒又可能是视频开头的op片头曲。配置2分钟,准确度提高了工作率下降。但是问题在于视频是哪种视频,是有明确台词的电影,电视剧,动漫还是半天不出声音的。在明确视频内容的情况下,这个推荐排在第三位。

  8. 如何节省去重的时间,这是对于视频的建议,因为图片和音乐等文件体积小速度快,用不着,一直换方法。可以先用系统自带的去重软件去除一遍重复文件或者duplicate cleaner pro跑一遍哈希值或者 音频 - 近似比较(开头2分钟), 先去重一些文件,再使用抽样帧等方式精准去重。也可以直接跳到GPU加速教程,使用GPU加速过程。



目录结构



在安装软件的时候要选择安装目录,由于很多人选择的位置不同,安装目录就不列出了。下面是在软件安装后其他默认的位置生成的目录和文件(通常是你的用户目录下,如果你的用户不是admin,换成你自己的用户名)。

软件的数据目录,存放软件产生的数据和缓存
C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner软件的配置的存储文件
C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner\DuplicateCleaner5_Pro_Settings.data软件数据缓存目录
C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner\Cache软件数据缓存目录下的截图目录,ffmpeg截出的图都输出到这个目录
C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner\Cache\VideoFrames软件的日志文件,记录扫描,删除与运行中的事件
C:\Users\admin\Documents\Duplicate Cleaner log file.txt
其中还包含着一些报错:
File skipped (IgnoreList) 跳过文件
Error generating video frames 生成视频帧时出错
Exitcode=1    常见的报错,代表失败
Exitcode=-1   常见的报错,代表失败
Exitcode=255  代表失败,可能是超时或者资源不足导致,前期正常,后期失败这种类型软件数据缓存目录下的数据文件,由文件内容可以看出是运行匹配视频抽样帧方式记录的文件
C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner\Cache\DuplicateCleaner5_Pro_Cache-VideoFrameMetrics-F6.data当获取的要扫描的目录中文件的数据,路径,文件名,md5等与这类data缓存文件对应上的时候,就不会再使用ffmpeg命令去进行生成截图,可以节省大量时间。

介绍这个是因为后面要用到,其中有一些data文件,存储的是配置和数据,可以sqlite-web打开和配置。



修改盘符



起因



在什么情况下会要修改盘符呢?

  1. Windows系统中的盘符分配自动分配流程‌:
    系统启动时,Windows会扫描所有连接的存储设备
    按照主分区优先、逻辑分区次后的顺序分配盘符

  2. 有时候会因为硬件变动,USB设备识别问题导致的盘符变化:
    ‌USB设备频繁插拔‌,每次插入USB设备时,系统可能分配不同的可用盘符‌;
    移动硬盘在不同USB端口插入后被分配不同盘符‌;
    插入多个移动硬盘的顺序产生了变化被依次分配不同盘符‌;
    安装增加硬盘后,系统可能重新调整原有盘符分配‌;
    过去直接插入的是移动硬盘,现在是插入了扩展坞,再插入移动硬盘
    这些都有可能导致盘符的变化

  3. Duplicate cleaner pro会因为硬件变动导致的盘符变化而导致问题。盘符变化对文件内容没什么影响,但是当使用Duplicate cleaner pro,在过去扫描并且记录过缓存,由于盘符产生变化,文件的路径也会变,过去的缓存内容也失效了,按照过去的路径找不到文件,新路径的文件会被当作未扫描过,而重新开始扫描,导致浪费了大量的时间。例如过去扫描了3万个文件,新增加了200个文件,如果盘符正常,缓存正常,软件会找到这200个新文件进行计算和工作,但是现在要重头开始。



方法



由于上面的原因,我们需要把盘符或者路径修改成原来的,选择任意一个方法即可。除非是有重新进行计算和扫描的需求。

建议第一个方法,第一个方法不可执行再选择第二个方法,因为较麻烦。



手动分配方法‌



搜索"磁盘管理",可手动修改盘符
选择要修改的硬盘的驱动器,右键目标驱动器,“更改驱动器号和路径”,选择新盘符‌(未被占用的或者你需要的盘符

注意:系统分区(C:)的盘符修改需谨慎,可能导致系统无法启动‌



数据修改方法



SQLite-Web是一个提供直观Web界面的工具,用于访问和管理SQLite数据库

安装sqlite-web

https://github.com/coleifer/sqlite-web
具有多种安装方式,可以docker或者pip安装,以及其他方式,根据需求选择。
实际上只是打开用一下,使用pip方式临时启动即可;
为了避免引入其他安全问题,不建议允许任何访问;
允许成功会打开浏览器或者复制提供的链接即可访问数据库



docker run --rm -d \
--name sqlite-web \
-p 9090:8080 \
-v $PWD:/data \
-e SQLITE_DATABASE="C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner\Cache\DuplicateCleaner5_Pro_Cache-VideoFrameMetrics-F6.data" \
coleifer/sqlite-webSQLITE_DATABASE指定的是你要打开的data文件,如果不存在会进行创建。这里我们应该打开你需要进行修改的数据库文件,示例展示的是计算抽样帧的数据库文件
pip install sqlite-web
or
pip3 install sqlite-websqlite_web.exe C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner\Cache\DuplicateCleaner5_Pro_Cache-VideoFrameMetrics-F6.data下面的示例的参数,用于开放访问和指定端口。上面的命令即可完成需求。
sqlite_web /path/to/your/database.db -H 0.0.0.0 -p 9090


修改数据库

数据库的基本语法和mysql相同,数据库命令如果不会或者是有其他想法,建议咨询AI数据库命令
如果不确定进行修改数据库的命令是否正确,先用where指定一个文件进行修改

<1>选择要修改的表,从上面可以看到有picinfo表
前两个选项是展示一些数据,Query提供picinfo表的结构和字段,下方的界面用于输入数据库命令

在这里插入图片描述



<2>自带一个查看命令,点击Execute即可执行,剩下两个选项是将sql命令查到的数据导出为文件
在这里插入图片描述

<3>由图可知,存在19367条数据,字段也好理解。
修改路径重点是修改file的字段
在这里插入图片描述

<4>修改数据库的示例

如果怕修改错了,sqlite-web执行前,把数据库文件备份
整体建议修改数据前,先使用where条件指定一个文件修改,查看修改结果后再确定命令是否有问题,是否需求整体执行

执行后,页面显示下面内容即为成功,意思是成功修改了多少条数据。
如果是0,代表命令有问题,没有成功
如果数量和你之前查询的数量不一致,证明命令还是有问题

Rows modified: 12788



SUBSTR用法
假设原路径为I:\目录\download\字母123.mp4:第1字符:I
第2字符::
第3字符:\(路径分隔符)
‌拼接结果差异‌'J:' || SUBSTR(file, 3):
J: + \目录\download\字母123.mp4 → J:\目录\download\字母123.mp4'J:' || SUBSTR(file, 2):
J: + :\目录\download\字母123.mp4 → J::\目录\download\字母123.mp4
产生了双冒号,因为包含了原路径的第2字符
处理 thumbs 路径,去除多余的字符\查看路径包含多少个字段
SELECT LENGTH('G:\thumbs\\\') AS prefix_length;
12将指定路径中的(G:\thumbs\\\),保留从第13字符开始的内容,前面的替换成G:\thumbs\
先使用where条件指定一个文件修改UPDATE picinfo 
SET file = 'G:\thumbs\' || SUBSTR(file, 13) 
WHERE file LIKE 'G:\thumbs\\\11991.mp4%';查看修改结果
SELECT * FROM "picinfo"  WHERE file LIKE '%11991.mp4%';没有问题后整体修改
UPDATE picinfo 
SET file = 'G:\thumbs\' || SUBSTR(file, 13) 
WHERE file LIKE 'G:\thumbs\\\%';确认最终修改结果
SELECT * FROM "picinfo"  WHERE file LIKE 'G:\thumbs%';
把目标路径 I:\目录\download\字母 的盘符进行修改成J:UPDATE picinfo 
SET file = 'J:' || SUBSTR(file, 3) 
WHERE file LIKE 'I:\目录\download\字母%';or
REPLACE把前面的替换成后面的UPDATE picinfo 
SET file = REPLACE(file, 'I:', 'J:')
WHERE file LIKE '%I:\目录\download\字母%';or也可用下面的方式去修改盘符,下面演示的是路径替换,自动算出了需要替换的路径中要保留的字符数UPDATE picinfo 
SET file = 'J:\thumbs\' || SUBSTR(file, LENGTH('I:\目录\thumbs\') + 1)
WHERE file LIKE 'I:\目录\thumbs\%';
路径替换
REPLACE把前面的替换成后面的,之前用这个方法替换了盘符UPDATE picinfo
SET file = REPLACE(file, 'I:\目录\thumbs\', 'G:\thumbs\')
WHERE file = 'I:\目录\thumbs\g874i.mp4';UPDATE picinfo
SET file = REPLACE(file, 'I:\目录\Te\', 'G:\Telegram\Video\')
WHERE file LIKE 'I:\目录\Te\%';UPDATE picinfo
SET file = REPLACE(file, 'I:\目录\thumbs', 'G:\thumbs')
WHERE file LIKE 'I:\目录\thumbs\%';在路径中替换盘符并增加一个目录
UPDATE picinfo 
SET file = REPLACE(file, 'I:\目录\download\', 'J:\目录\download\汉字\') 
WHERE file LIKE 'I:\目录\download\云顶天宫%';
常见报错UNIQUE constraint failed: picinfo.file该错误表明在执行路径更新时违反了 picinfo.file 字段的唯一性约束,即目标路径已存在于数据库中例如:
SELECT * FROM "picinfo" 
WHERE file LIKE '%video\1001464933947_132747.mp4%'结果由于多次扫描和盘符变更,导致一个文件记录了多次或者只是同名文件,数据不是一条。
D:\video\1001464933947_132747.mp4
K:\video\1001464933947_132747.mp4当进行更新的时候,将J:盘符替换满足条件的两条数据。数据库会先修改一条数据为J:\video\1001464933947_132747.mp4,接着替换第二条,发现这个路径已存在,就会报这个冲突错误,由于检测出命令存在的问题,这条命令不会执行成功。
UPDATE picinfo 
SET file = 'J:' || SUBSTR(file, 3) 
WHERE file LIKE '%video\1001464933947_132747.mp4%'以下是解决方案:
如果目标路径真的存在无需修改
如果目标路径不存在,修改一条数据为目标路径即可检查目标路径是否已存在
SELECT * FROM picinfo WHERE file = 'J:\video\1001464933947_132747.mp4';UPDATE picinfo 
SET file = 'J:' || SUBSTR(file, 3) 
WHERE file LIKE '%K:\video\1001464933947_132747.mp4%'or
仅当目标路径不存在时更新
UPDATE picinfo 
SET file = 'J:' || SUBSTR(file, LENGTH('K:') + 1)
WHERE file = 'K:\video\1001464933947_132747.mp4'
AND NOT EXISTS (SELECT 1 FROM picinfo WHERE file = 'J:\video\1001464933947_132747.mp4'
);SELECT * FROM picinfo WHERE file like '%1001464933947_132747.mp4%'


GPU加速



FFmpeg的核心功能(如解码、编码、转码等)过去主要在CPU上运行,而随着显卡的不断发展,于是开始支持利用显卡硬件加速器(如NVIDIA CUDA、Intel Quick Sync Video等)对视频进行解码,从而显著提高解码效率和性能。
与CPU的软件解码相比,GPU能通过其并行处理能力和更高的带宽,能够更高效地处理解码任务,降低CPU负载,更适合处理高分辨率视频(如4K/8K H.265)或需要实时解码的场景,适合高负载场景,但需硬件支持,且需优化内存管理以减少数据拷贝损耗
‌CPU适用于低分辨率或简单处理任务,但大规模数据处理时可能存在瓶颈

因此使用ffmpeg要使用GPU加速,需要ffmpeg的版本支持GPU,运行的平台要有硬件设备-显卡,并且有对应显卡的驱动。

使用GPU加速的优点在于:Duplicate cleaner pro用GPU加速,抽样帧或哈希方式,单个视频在30秒-1分钟完成工作;使用CPU单个视频在1分钟-3分钟完成工作。视频越小速度越快,CPU或GPU性能越好效率越高。建议GPU在4G以上,2G勉强能用。



前面已经说过了,经过测试和命令查看软件自带的ffmpeg是支持CUDA或者GPU的,因此不用再次安装新版本的ffmpeg了。

查看硬件加速的相关信息
ffmpeg -hwaccels
......省略了
Hardware acceleration methods:
cuda
dxva2
d3d11va编码器支持信息查看
ffmpeg.exe -encoders |findstr h264
......省略了V....D h264_amf             AMD AMF H.264 Encoder (codec h264)V....D h264_mf              H264 via MediaFoundation (codec h264)V....D h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)ffmpeg.exe -encoders |findstr nvenc
......省略了V....D h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)V....D hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)解码器支持信息查看
ffmpeg.exe -decoders |findstr h264VFS..D h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)ffmpeg.exe -decoders |findstr hevcVFS..D hevc                 HEVC (High Efficiency Video Coding)V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)


安装驱动


注意安装驱动的时候要看自己电脑是什么显卡,然后看显卡支持什么版本的驱动

获取驱动和硬件信息


1、打开显卡控制面板
在这里插入图片描述
2、打开帮助-系统信息
在这里插入图片描述
3、NVCUDA64.DLL查看支持版本
在这里插入图片描述

CUDA是英伟达NVIDIA的显卡驱动,编码的时候使用h264_nvenc
https://developer.nvidia.com/cuda-toolkit-archiveROCm是AMD显卡驱动,编码的时候使用h264_amf 
https://www.amd.com/en/developer/resources/rocm-hub/hip-sdk.html#tabs-ddafbba141-item-c6b9ce2aab-tab

4、下载和安装合适的版本
在这里插入图片描述



安装CUDA


下面点击安装也不用说了,基本上是中文能看懂(文字是跟随系统设置),点击同意和勾选即可,没什么截图,因为很久以前安的都快忘了

建议找别人的教程和这个对应着看

  1. 安装cuda时,第一次会让设置临时解压目录,第二次会让设置安装目录; 临时解压路径,建议默认即可,也可以自定义;安装目录,建议默认即可;

  2. 第一次安装的时候选择自定义(高级),尽量把能安装的安装上,避免以后再安装;

  3. 如果之前没有安装vs,需要把CUDA展开,把里面的Visual Studio Integration取消勾选,否则会安装不成功;如果你过去安装过,到了自定义那一步,发现你的驱动版本比它提供的高,就取消那项的勾选;如果出错

  4. 在许可协议,选项那一步,会展示安装位置,记住安装路径

此图实际不是我的,用于演示在哪里出这个提示,别的地方截的
在这里插入图片描述

注意:
使用软件提供的默认路径可以解决大部分问题,但为了节省空间尽量不安装到C盘。
只要注意临时解压目录千万不要和cuda的安装路径设置成一样的。因为安装结束后,临时解压文件夹会自动删除,如果一样会删除安装目录



配置环境变量(如果是自定义安装)


为什么很多教程或说法都不一样?多种因素叠加导致,环境不一样,安装目录不一样,版本不一样,对应版本的安装方法有变化,所以导致很多人配置和说法看着都不一样

可以配置用户变量也可以配置系统变量;
建议追哪个教程就使用哪个教程的配置,根据自己实际的安装目录进行配置,可以正常使用就是成功了
本教程适配12.5版本,配置系统变量方式

<1>安装CUDA后已经生成两条系统变量,多了CUDA_PATH和CUDA_PATH_V12_5两个环境变量。

<2>继续添加系统变量

还要系统变量位置继续添加以下内容:
CUDA_SDK_PATH =你的目录(默认路径,可根据自己路径调整)
CUDA_LIB_PATH = %CUDA_PATH%\lib\x64
CUDA_BIN_PATH = %CUDA_PATH%\binCUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64

在这里插入图片描述



<3>编辑系统变量Path,添加CUDA

在这里插入图片描述

过去的版本是配置4条变量
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\lib\x64;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin;
11.几的版本取消了CUDA Samples的目录,不需要下面的两个变量了
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.0\common\lib\x64;
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.0\bin\win64;

由于我的安装目录是D:\CUDA,最终目的是要系统能找到CUDA的一些命令,配置bin和libnvvp即可,所以我这里配置了D:\CUDA\bin D:\CUDA\libnvvp



<4>查看配置结果
有类似如下内容即为成功

C:\Users\admin> nvcc  -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Wed_Apr_17_19:36:51_Pacific_Daylight_Time_2024
Cuda compilation tools, release 12.5, V12.5.40
Build cuda_12.5.r12.5/compiler.34177558_0C:\Users\admin> set cuda
CUDA_BIN_PATH=D:\CUDA\bin
CUDA_LIB_PATH=D:\CUDA\lib\x64
CUDA_PATH=D:\CUDA
CUDA_PATH_V12_5=D:\CUDA
CUDA_SDK_BIN_PATH=%CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH=%CUDA_SDK_PATH%\common\lib\x64
CUDA_SKD_PATH=D:\CUDA到达你的安装目录,运行下方的软件
D:\CUDA\extras\demo_suite
bandwidthTest.exe,输出result=pass表示安装成功
deviceQuery.exe,同样输出result=pass表示安装成功


<5>cuDNN安装(如果未安装)
实际上不安装cuDNN,nvcc -V命令也可以正常使用,因为它是查看CUDA这个显卡驱动信息的,CUDA安装成功即可使用

cuDNN是基于CUDA的库,专为深度学习优化,通常用户会顺便与CUDA一起安装,也可不安装,不影响GPU使用

cuDNN不需要点击安装,将压缩包解压后得到三个文件夹bin、include、lib,将这三个文件里的内容依次复制到CUDA安装目录相同名称的文件夹里即可https://developer.nvidia.com/rdp/cudnn-archive
在这里插入图片描述

解压下载好的 cuDNN 文件 至 CUDA 安装目录,进行解压,对同名文件选择覆盖



创建程序



我们知道Duplicate cleaner pro在运行的时候会使用ffmpeg,但是我们很难逆向还原成源码,既违法道德和法律,技术又很难达到。于是想到了一个简单的方法,配置一个劫持脚本,劫持软件发送给ffmpeg.exe的参数,修改后再传给ffmpeg.exe

打包好的文件已上传,可直接使用。
将这些exe直接上传到Duplicate cleaner pro安装目录即可,运行解压缩视频过程时,会在此目录生成日志ffmpeg_log.txt



大致分成几个过程:

<1>获取参数和命令

首先在软件运行的时候查看,运行的命令

直接筛选 CommandLine 包含 "ffmpeg" 的进程‌
Get-WmiObject Win32_Process -Filter "Name = 'ffmpeg.exe'" | Select-Object Name, CommandLine | Format-Table -AutoSize -Wrap
or
Get-WmiObject Win32_Process | Where-Object { $_.CommandLine -like "*ffmpeg*" } | Select-Object Name, ProcessId, CommandLine | Format-Table -AutoSize -WrapWhere-Object { $_.CommandLine -like "*ffmpeg*" } 筛选所有 CommandLine 包含 ffmpeg 的进程
Select-Object Name, ProcessId, CommandLine       显示进程名、进程ID和完整命令行。
Format-Table -AutoSize -Wrap                     确保长命令行自动换行显示。
Name       CommandLine
----       -----------
ffmpeg.exe "D:\duplicatecleaner\ffmpeg.exe" -loglevel quiet -hide_banner -i "J:\目录\download\汉字\庆余年1.mp4" -y -filter_complex "select='isnan(prev_selected_t)+gte(t-prev_selected_t\,63.5066666666667)',yadif,scale=600:-1,tile=3x3" -vframes 1  "C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner\Cache\VideoFrames\725e1354655234dfww5r53s29b811f3ffa2856b376.jpg"


<2>选择命令参数
-loglevel quiet -hide_banner  用于静默模式,运行不产生输出
-filter_complex               通过指定滤镜图(filtergraph)实现多流处理,支持视频拼接、混合、旋转等复杂操作
vframes                       指定要输出的视频帧数 , 通过该参数可以控制视频处理的长度,在输出多少帧后停止处理视频流isnan(prev_selected_t)                     确保视频的第一帧被选中
gte(t-prev_selected_t\,63.5066666666667)   控制每隔63.506秒选择一帧
‌yadif滤镜‌                                   反交错处理滤镜,默认参数下会:自动检测输入视频的场序(top-field-first或bottom-field-first);对所有帧进行去隔行处理,消除交错视频的"拉丝"效果;输出逐行扫描的视频帧
‌scale滤镜‌                                   scale=600:-1 将视频宽度固定为600像素,高度设为-1,表示按原始宽高比自动计算,最终输出分辨率可能是600×338(假设原始为16:9比例)
‌tile滤镜‌                                    tile=3x3参数实现:将输入帧排列成3行3列的网格;默认按时间顺序从左到右、从上到下排列;最终输出图像包含9个子画面
要将命令修改成什么,既可以使用GPU,又能适配大部分视频呢?为什么不能适配所有视频呢?
官方没有做GPU的配置,因为使用cpu命令已经满足了几乎所有视频的转码和截图与适配大部分人的设备,人们不一定有显卡,显卡不一定好,厂商未必一致,还有显卡驱动版本等问题,所以官方没有考虑扫描视频使用GPU的参数。这就导致了GPU的参数需要自己劫持后修改,而且不一定能适配所有视频,例如有的视频带着旋转参数,GPU命令不支持,使用这个参数时就会报错。通常GPU使用的参数:
-hwaccel                      指定加速API(如CUDA、DXVA2)
-c:v                          匹配硬件解码器(如 h264_cuvid、hevc_qsv)
-hwaccel_output_format cuda   强制解码后的输出格式为CUDA内存,帧数据保留在GPU显存中,避免CPU-GPU间传输开销。如果不带这个参数,解码后的帧数据默认会转换为系统内存格式。
‌带-hwaccel_output_format cuda的参数组合‌:
截图功能受限,因为大多数截图操作需要CPU可访问的帧数据
需要显式添加-vf hwdownload,format=nv12将帧下载到系统内存才能截图。直接截图可能导致错误或黑屏;旋转滤镜(如transpose)支持有限,因为大多数滤镜需要CPU可访问的帧数据,若需使用旋转滤镜,也必须先用hwdownload将帧下载到系统内存
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i input.mp4 -vf "hwdownload,format=nv12,transpose=1" output.mp4‌不带-hwaccel_output_format cuda的参数组合‌:
更适合截图操作,因为帧数据会自动转换为系统内存格式,可直接使用-vframes 1或-ss参数捕获帧;更直接支持旋转滤镜,因为帧数据已在系统内存中,可直接应用transpose等旋转滤镜
ffmpeg -hwaccel cuda -c:v h264_cuvid -i input.mp4 -vf "transpose=1" output.mp4优缺点:
带-hwaccel_output_format cuda的组合性能更高,适合纯GPU处理流水线
若仅进行简单转码且无需滤镜,带-hwaccel_output_format cuda的组合更高效
不带该参数的组合因涉及内存传输,会有额外开销,若处理链中包含需要CPU访问的操作(如截图、复杂滤镜),建议不使用-hwaccel_output_format cuda方案:
一个是速度快,一个是支持功能多。由于使用GPU加速就是为了速度所以我这里选择了速度快的方案,并且配合下载到系统内存的参数,让它支持更多操作。如果CUDA命令报错就回退到CPU命令继续执行。-hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid %*  
[0:v]hwdownload,format=nv12  从第一个输入文件的视频流([0:v])下载硬件加速帧到系统内存,指定输出帧的像素格式为NV12,确保后续处理兼容性(如截图、滤镜操作)最终要修改成命令是:
"D:\duplicatecleaner\ffmpeg.exe" -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -loglevel quiet -hide_banner -i "J:\目录\download\汉字\庆余年1.mp4" -y -filter_complex "[0:v]hwdownload,format=nv12,select='isnan(prev_selected_t)+gte(t-prev_selected_t\,63.5066666666667)',yadif,scale=600:-1,tile=3x3" -vframes 1  "C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner\Cache\VideoFrames\725e1354655234dfww5r53s29b811f3ffa2856b376.jpg"如果是为了写脚本或者使用方便,需要天然的支持更多功能,也可以选择-hwaccel cuda -c:v h264_cuvid %*,这个报错更少


<3>修改原来的ffmpeg.exe为其他名称


找到安装目录,找到ffmpeg.exe,右键重命名为ffmpeg_orig.exe



<4>要确认怎么将bat转换成exe


首先bat转exe不是只是修改文件后缀就行了,它需要专门的软件进行转换

下面是一些软件的实际测试:



Quick Batch File Compiler

1. 安全机制冲突
Quick Batch File Compiler 默认启用严格的安全机制:
沙箱模式:阻止文件系统访问(包括日志写入)
内存保护:限制子进程创建(如 start /B)
资源限制:阻止访问系统工具(tasklist, taskkill)2. 路径处理缺陷
转换后的 EXE 运行时:
当前工作目录变为临时目录(非脚本原位置)
相对路径(如 "%log_file%")失效
环境变量(%date%, %time%)无法解析3. 异步操作不兼容
Quick BFC 对以下特性支持有限:
后台进程 (start /B)
进程监控 (tasklist)
强制终止 (taskkill)4. 日志重定向问题
转换后:
>> "!log_file!" 重定向被拦截
控制台输出被静默丢弃
错误流 (2>&1) 无法捕获


IExpress

IExpress 转换的 EXE 不会出现与 BatToExe 或 Quick BFC 相同高级语法应用的问题,但根本无法传递参数

即使把生成过程中,启动的命令更换成下面的方法,也不能成功传递参数‌,网上也没找到解决办法。在其他软件中转换后没有不能传递参数的问题。
cmd.exe /c test.bat %1

cmd.exe /c test.bat %*

特性BatToExe/QuickBFCIExpress
执行原理编译为二进制代码自解压包 + cmd.exe 原生执行
嵌套 if/goto❌ 兼容性差✅ 完美支持
日志生成❌ 常失败✅ 100% 正常
异步操作❌ 受限严重✅ 完全支持
路径处理❌ 工作目录问题⚠️ 临时目录需特殊处理
依赖文件❌ 需手动包含✅ 自动打包所有文件
安全防护✅ 代码混淆❌ 脚本可被提取


Bat to Exe Converter

1、处理多层嵌套 if 块存在缺陷当外层if块内嵌套另一个if块时,会无法执行,尤其是有goto和函数的情况
if !has_cuda! equ 1 ("%orig_exe%" -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -loglevel !cuda_cmd! >> "%log_file%" 2>&1set exec_status=!errorlevel!if !exec_status! equ 0 (goto :final_check)echo [%date% %time%] WARN: CUDA failed , falling back to CPU >> "%log_file%"
)当使用延迟扩展变量(!var!)在嵌套块中,会无法执行
echo [%date% %time%] [ERROR] (!code!) does not exist
正确的应该是
echo [%date% %time%] [ERROR] !code! does not existBatToExe 在转换过程中无法正确处理这种复杂嵌套结构,导致生成的 EXE 文件无法执行嵌套部分的代码,是工具本身的限制。2、goto 标签问题:
标签跳转在转换后可能失效
特别是当标签位于 if 块内部时

因此如果使用这个软件,要避免goto和函数,避免if多重嵌套。
相比于其他软件,它转换后的代码既支持传参,又可使用windows系统自带的命令,于是使用这个软件来进行编写bat和转换



<5>编写bat脚本


建议bat脚本中不使用中文,避免乱码;
if判断或者循环内部不写注释,避免转换出现问题;
如果是使用记事本编写,记得另存为ansi编码



由于要避免函数和嵌套与复杂写法,所以把异步的部分拆分了出去,写2个脚本,一个主程序,一个超时监控程序。
原来的程序运行只有1个ffmpeg.exe的进程。由于是劫持脚本,这样搞后,一个脚本运行时会产生3个进程(一个是劫持程序本身的进程ffmpeg.exe,一个使用cmd命令进程cmd /c ffmpeg.exe,一个劫持后转发参数给原来的程序运行的进程ffmpeg_orig.exe), 连超时监控程序,共计6个进程,运行时共计占用230M内存左右,其他进程没有占用cpu,只有工作的ffmpeg_orig.exe的进程占用cpu,比使用CPU命令时占用的cpu少很多,只是进程看着多。



基本思路:

CUDA命令正常完成:不执行CPU命令
CUDA命令执行错误:立即切换CPU命令
CUDA命令卡住超时:强制切换CPU命令

超时检测进程自动清理(GPU,4分钟内完全可完成单个文件的转码,如果超时证明程序卡住)
无残留进程或文件
临时文件自动删除



代码在下方可根据具体情况修改



ffmpeg.bat

@echo off
::moxiao_Gx
setlocal enabledelayedexpansion:: Set the directory where the script is located as the working directory
set "script_dir=%~dp0"
set "log_file=%script_dir%ffmpeg_log.txt"
set "orig_exe=%script_dir%ffmpeg_orig.exe"
set "has_cuda=0":: Enhance logging functionality
echo =========================================== >> "%log_file%"
echo [%date% %time%] INFO: script start          >> "%log_file%"
echo =========================================== >> "%log_file%":: Verify that the file exists and is executable
if not exist "%orig_exe%" (echo ========================================================== >> "%log_file%"echo [%date% %time%] [ERROR] ffmpeg_orig.exe does not exist     >> "%log_file%"echo ========================================================== >> "%log_file%"exit /b 1
):: CUDA detection
where nvidia-smi >nul 2>&1
if !errorlevel! equ 0 set "has_cuda=1":: initialize variable
set "input_cmd=%*"
set "new_filter="
set "original_filter="
set "filter_processed=0"
set "in_quote=0":: Improved extraction of raw filter parameters (handling quoted cases)
for %%a in (%input_cmd%) do (if "%%a"=="-filter_complex" (set "next_is_filter=1") else if defined next_is_filter (if "!original_filter!"=="" (set "original_filter=%%a") else (set "original_filter=!original_filter! %%a")if "%%a"==""*"" set /a "in_quote=!in_quote!^^1"if !in_quote! equ 0 set "next_is_filter=")
)::Remove quotation marks
set "original_filter=!original_filter:"=!"
echo "original_filter %original_filter%" >> "%log_file%":: Dynamically build new filter parameters (preserve complete structure)
if defined original_filter (:: Remove duplicate select sectionsset "temp2=!original_filter:select=!"if not "!temp2!"=="!original_filter!" (set "new_filter=[0:v]hwdownload,format=nv12,!original_filter!") else (set "new_filter=[0:v]hwdownload,format=nv12,!original_filter!"):: Fix escape characters and quotation marks:: set "new_filter=!new_filter:\=!"set "new_filter=!new_filter:""=!"
)echo "new_filter %new_filter%" >> "%log_file%":: Skip the original ffmpeg when refactoring CPU commands
set "cpu_cmd="
set "skip_first=0"
for %%a in (%input_cmd%) do (if "%%~a"=="%script_dir%ffmpeg.exe" (set "skip_first=1") else if !skip_first! equ 1 (set "skip_first=0") else (set "cpu_cmd=!cpu_cmd! %%a")
):: Skip original filter parameters when refactoring CUDA commands
set "new_cmd="
set "in_param_section=0"
set "skip_original_filter=0"for %%a in (%input_cmd%) do (if "%%a"=="%script_dir%ffmpeg.exe" (set "skip_next=1") else if !skip_next! equ 1 (set "skip_next=0") else if "%%a"=="-filter_complex" (if !filter_processed! equ 0 (set "new_cmd=!new_cmd! -filter_complex "!new_filter!""set "filter_processed=1"set "in_param_section=1"set "skip_original_filter=1")) else if !in_param_section! equ 1 (if "%%a"=="-filter_complex" (set "in_param_section=0") else if !skip_original_filter! equ 1 (:: Skip the original filter parametersset "skip_original_filter=0") else (set "new_cmd=!new_cmd! %%a")) else (set "new_cmd=!new_cmd! %%a")
)echo "new_cmd %new_cmd%" >> "%log_file%":: Build two command schemes
set "cuda_cmd=%new_cmd%"
set "cpu_cmd=%cpu_cmd%"
set exec_status=0
echo "cpu_cmd %cpu_cmd%" >> "%log_file%"
echo "has_cuda %has_cuda%" >> "%log_file%":: Execute logic with synchronous timeout detection and automatic rollback
if !has_cuda! equ 1 (echo ============================================================== >> "%log_file%"echo [%date% %time%] INFO: Using CUDA acceleration plan1 CUDA                                                        >> "%log_file%" echo "%orig_exe%" -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid  -loglevel !cuda_cmd! >> "%log_file%"echo ============================================================== >> "%log_file%"start "CUDA_Watchdog" /B cmd /c watchdog_ffmpeg.exe"%orig_exe%" -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -loglevel !cuda_cmd! >> "%log_file%" 2>&1set exec_status=!errorlevel!)
::moxiao_Gx
set STATE_FILE=%temp%\ffmpeg_state.lock
:: STATE_FILE
if exist "%STATE_FILE%" (echo [%date% %time%] WARN: CUDA timed out after 240s seconds >> "%log_file%"set /p exec_status=<"%STATE_FILE%"del %STATE_FILE%
):: CPU fallback execution branch
if !exec_status! neq 0 (echo [%date% %time%] WARN: CUDA failed !exec_status!, falling back to CPU  >> "%log_file%"echo [%date% %time%] INFO: Starting CPU execution       >> "%log_file%"echo "%orig_exe%" -loglevel !cpu_cmd!                   >> "%log_file%"echo ================================================== >> "%log_file%"taskkill /f /t /im watchdog_ffmpeg.exe >nul 2>&1del %STATE_FILE%"%orig_exe%" -loglevel !cpu_cmd! >> "%log_file%" 2>&1set exec_status=!errorlevel!
):: error handling
if  !exec_status! equ 0 (taskkill /f /t /im watchdog_ffmpeg.exe >nul 2>&1del %STATE_FILE%echo ============================================================ >> "%log_file%"echo  [%date% %time%] [INFO] Execution succeeded                  >> "%log_file%"echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> "%log_file%") else (taskkill /f /t /im watchdog_ffmpeg.exe >nul 2>&1del %STATE_FILE%echo ============================================================ >> "%log_file%"echo [%date% %time%] ERROR: Execution failed !exec_status!     >> "%log_file%"echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> "%log_file%"exit /b !exec_status!
)endlocal


watchdog_ffmpeg.bat

@echo off
setlocal enabledelayedexpansion
::moxiao_Gxset cuda_timeout=240
set "script_dir=%~dp0"
set "log_file=%script_dir%ffmpeg_log.txt"
set STATE_FILE=%temp%\ffmpeg_state.lockdel %STATE_FILE%timeout /t %cuda_timeout% /nobreak >nultasklist | findstr "ffmpeg_orig.exe" >nul
if %errorlevel% equ 0 (taskkill /f /im ffmpeg_orig.exe >nul 2>&1echo TIMEOUT_GPU > "%temp%\ffmpeg_state.lock"exit /b 1
) else (exit /b 0
)endlocal


<6>将bat转换成exe


1、将对应文件转换成下面的名字或者修改脚本后再修改程序名称
ffmpeg.exe
watchdog_ffmpeg.exe

2、放到Duplicate cleaner pro安装目录,原来的ffmpeg.exe重命名成ffmpeg_orig.exe
运行时会生成日志ffmpeg_log.txt



这个截图是之前写中文注释的时候截的图,发现后来乱码了,全改成英文
在这里插入图片描述

选择对应的系统,窗口建议隐形
在这里插入图片描述



实际效果



2G显卡

12小时53分41.43秒,扫描了1046个视频文件,切换cpu运行的是121个,其中16个文件GPU运行卡住超时240s,切换CPU命令
50/h 到 80/h ,速度提示了60%,意味着能节省过去大概3分之一的时间,过去72小时的量节省约27小时
卡住和缓慢主要是由于显卡内存不足导致,如果是使用4G以上显卡提升应该会更明显



问题解答



1、为什么软件的日志和这个程序生成的日志中有视频文件报错了?

C:\Users\admin\Documents\Duplicate Cleaner log file.txt
这个文件中包含着Duplicate cleaner pro执行扫描和去重时,记录的日志。只记录异常,错误,删除等详细日志,正常完成的任务只记录整体统计情况,而不记录每个正常文件的运行信息。这个软件在运行的时候,是不会在界面上显示哪个文件扫描或对比等工作出现异常的,并不是所有视频或文件都一定会成功,而是会记录到这个日志中,通过自带的报错提示,标记报错原因,因此Duplicate cleaner pro工作的成功率实际也不是100%,只是界面上没报错。因为总会有些视频本身出问题,不是兼容问题,就是下载了一部分的看似完整,实际残缺的文件(表现是通常看不到时长或者无封面或者无其他元数据这类文件),这种的无论用哪个命令都会报错,而不是命令问题。

2、是不是ffmpeg导致文件损坏的?

ffmpeg命令是通常不会导致作为输入的原文件损坏的,除非是你输入和输出的路径弄成同一个,文件名称也是同一个。ffmpeg -i input.mp4 -c:v libx264 input.mp4

因为异常中断处理,编解码参数冲突,特殊字符路径问题等原因,而出问题的是: 要么是命令执行失败,要么是输出文件出现问题,而不会影响输入文件。因此这个程序和软件的原程序是不会导致原文件异常的。注意一下存储设备或者保存时出现了问题。

3、日志某个视频为什么重复出现,然后报错?

Duplicate cleaner pro每次执行扫描和工作,异常的文件会在执行失败后进行跳过,而不会记录到数据库中。因此每次重新打开Duplicate cleaner pro,在数据库中的数据和获取指定要扫描的路径中的文件的信息会进行对比,已在数据库中且无变更的文件会对比后略过,数据对不上的(更新了文件的,路径变更的)和无记录的(过去报错跳过或新文件)会再次进行扫描和计算。因此,如果你的异常文件不处理,1月2日扫描有报错,1月3日扫描还是会有报错。

如果你扫描完了2万多个文件,你的异常文件没有处理,没有任何变动,当再次跑数据的时候,由于大致2万个文件成功的都记录在数据库,对比后会将数据对上的快速略过,不会执行ffmpeg或其他算法,把剩下需要扫描的排在后面,而这些都是之前失败的文件,会再次扫描和计算,但是因为大多数是文件本身问题,因此大部分都会失败,这时候ffmpeg_log.txt日志中基本全是运行报错,这个现象是正常的,并不是软件在某一时刻出现了异常导致的。



缺点:
在文件名是特殊字符,包含* !& ?| 时,参数分割会出错导致文件跳过。
I:\目录\download\923842930&023d-sfjom.mp4

不过已经满足了大部分正常的视频文件了,文件名乱七八糟带各种字符尤其是&还是比较少的,只能建议修改文件名。因为这种文件名不符合通常的命名格式,相比于修改代码,修改文件名相对简单。

之后的版本处理。



DLL及其他软件文件误删除恢复



这个主要在对这个软件安装目录中的文件,进行调整或者误删的时候的使用

1、如果文件误删除到回收站了还可以还原,如果回收站也清理了,只能想办法恢复了

2、发现问题第一时间,建议停止任何对硬盘的写入。使用360以及其他的数据恢复软件进行恢复

3、如果恢复软件也找不到删除的文件,去这个软件的设置中,找到更新按钮-检查更新,进行更新,更新后缺失的软件会恢复,已经缓存的数据和配置也不会丢失

在这里插入图片描述

4、如果是软件在之前已经是最新版本了,点击更新无用,只能重新安装。在安装之前进行备份。

<1>找到数据缓存目录,进行备份
C:\Users\admin\AppData\Roaming\DigitalVolcano\DuplicateCleaner\Cache

建议从前面的目录开始备份
C:\Users\admin\AppData\Roaming\DigitalVolcano\

如果你的缓存目录不是这个,运行软件后,使用powershell查看进程,观察输出的目录的在哪里

如果你的缓存目录不是这个,选择一个视频或目录进行扫描,运行软件后,使用powershell查看进程,观察输出的目录的在哪里。
或者直接使用任务管理器,找到duplicate cleaner进行查看,查看详细命令Get-WmiObject Win32_Process -Filter "Name = 'ffmpeg.exe'" | Select-Object Name, CommandLine | Format-Table -AutoSize -WrapGet-WmiObject Win32_Process | Where-Object { $_.CommandLine -like "*ffmpeg*" } | Select-Object Name, ProcessId, CommandLine | Format-Table -AutoSize -Wrap

<2>备份你的软件安装目录

如果不知道你的软件安装在什么地方
打开任务管理器,找到duplicate cleaner,右键打开文件所在位置

<3>官网进行下载或者使用你过去的安装包
https://www.duplicatecleaner.com/

关闭软件后,点击安装文件,选择uninstall之类的进行卸载,卸载时会自动删除安装目录和缓存目录。通常来说某些软件在已经安装后,再次点击安装包会提示进行卸载或者修复,但是这个软件其他的选项是灰色的无法选择,只能先卸载后再次进行安装。

<4>不要运行软件。将备份的内容全部复制到原来的位置,改回原来的目录名。其中安装目录将过去的文件复制到新的安装目录里,放心的将同名的跳过,软件的配置是在缓存目录里。

<5>打开软件。与之前使用的界面和配置等都一致。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88752.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88752.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88752.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生技术引领UI前端设计新趋势:增强现实与虚拟现实的融合应用

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;AR 与 VR 的 “割裂” 与数字孪生的 “融合” 契机增强现实&#xff08;AR&…

Qt使用dump文件记录并查找软件奔溃信息详细教程

Qt使用dump文件记录并查找软件奔溃信息一、dump文件概述1、dump文件的基本概念2、dump文件的常见类型3、dump文件的分析工具4、dump文件的应用场景二、具体实现步骤1、下载dbghelp库2、将库添加到自己的工程中3、main.cpp添加代码记录奔溃日志4、编写测试代码5、测试6、结果查看…

UI前端与数字孪生结合案例分享:智慧城市的智慧能源管理系统

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;能源管理的 “数字孪生革命”智慧城市的能源系统正面临 “供需失衡、损耗…

Android 16系统源码_SplashScreen窗口的创建流程(一)

一 点击桌面图标触发SplashScreen 1.1 点击桌面图标打开应用 点击桌面的短信图标&#xff0c;然后打开短信页面&#xff0c;使用winscope获取数据。从点击短信图标到应用内容完全展开&#xff0c;中间有出现一个标题带有“Splash Screen”字符串的窗口。 二 Splash Screen窗口创…

线性代数学习笔记

矩阵 矩阵是一种非常重要的数学对象,它通常由一个由数字排成的矩形阵列来定义。一个矩阵由若干行和若干列组成,被称为矩阵的行数和列数。一般情况下,矩阵的行数和列数分别用 n n n 和 m m m 表示。<

2025.7.13总结

每次写日记&#xff0c;总觉得自我感受不是很好&#xff0c;脑子总会有许多消极思想。在网上&#xff0c;我曾看到一个关于“人生是一场巨大的事与愿违”&#xff0c;可能&#xff0c;真的是这个样子吧。以前的我&#xff0c;有上进心&#xff0c;有目标感&#xff0c;脚踏实地…

linux-网络-网络管理发展历程

Linux 的网络管理机制经历了多个阶段的发展&#xff0c;从早期的静态配置到现代动态管理工具的出现&#xff0c;反映了 Linux 系统在网络连接、自动化和用户体验方面的不断演进。以下是 Linux 网络管理发展的主要阶段&#xff1a;1. 早期的静态网络配置&#xff08;传统方式&am…

华为 GaussDB :技术特性、应用局限与市场争议

3-5月间&#xff0c;老夫在某学校带了这门课&#xff0c;简单总结一下课程外的看法&#xff1a;华为 GaussDB 作为华为云生态中的核心数据库产品&#xff0c;自推出以来便承载着华为在数据基础设施领域的战略野心。其技术路线既延续了开源数据库的兼容性优势&#xff0c;又深度…

从零开始学习深度学习—水果分类之PyQt5App

一、项目背景⭐&#xff1a;本项目是“从零开始学习深度学习”系列中的第二个实战项目&#xff0c;旨在实现第一个简易App(图像分类任务——水果分类)&#xff0c;进一步地落地AI模型应用&#xff0c;帮助初学者初步了解模型落地。基于PyQt5图形界面的水果图像分类系统&#xf…

小架构step系列13:测试用例的加载

1 概述测试用例的编写要有一些基础的规范&#xff0c;在本文先定义文件名称和测试用例方法名的规范。2 文件加载原理先从源码来看一下测试用例的文件加载原理。2.1 文件的匹配主要是通过注解来扫描测试用例。// 在IDEA测试用例启动时&#xff0c;调用junit-platform-launcher-x…

K8S的CNI之calico插件升级至3.30.2

前言宿主机ping不通K8S的pod&#xff0c;一直存在丢包的现象&#xff0c;排查了防火墙、日志、详细信息等没发现什么问题&#xff0c;最后搜索发现&#xff0c;是因为把K8S的版本升级之后&#xff0c;旧版本的CNI插件不适配原因导致的&#xff0c;于是就把calico也一并升级并且…

Spring Boot RESTful API 设计指南:查询接口规范与最佳实践

Spring Boot RESTful API 设计指南&#xff1a;查询接口规范与最佳实践 引言 在 Spring Boot 开发中&#xff0c;查询接口的设计直接影响着系统的可用性、可维护性和性能。本文将深入探讨如何规范设计查询接口&#xff0c;包括 GET/POST 的选择、参数定义、校验规则等&#xff…

ctfshow萌新题集

记录一下前半部分是能自己写出来的&#xff0c;后半部分是需要提示的&#xff0c;感觉自己归来两年仍是萌新 misc部分 知识点 base家族密文特征 Base16 (Hex) 字符集&#xff1a;0-9, A-F&#xff08;不区分大小写&#xff09;。特征&#xff1a; 长度是 2 的倍数&#xff…

2025年语言处理、大数据与人机交互国际会议(DHCI 2025)

&#x1f310;&#x1f916;&#x1f9e0; 语言处理、大数据与人机交互&#xff1a;探索智能未来 —— DHCI 2025国际会议2025年语言处理、大数据与人机交互国际会议&#xff08;DHCI 2025&#xff09; 将于2025年在中国重庆市召开。这次盛会将汇聚全球顶尖专家、学者及行业领袖…

RIP实验以及核心原理

RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种内部网关协议&#xff0c;基于距离矢量算法&#xff0c;用于在自治系统内交换路由信息。RIP 核心原理距离矢量算法&#xff1a;RIP 使用跳数作为路径选择的唯一度量标准。每经过一个路由…

基于大数据的电力系统故障诊断技术研究

摘要本文提出了一种创新性的基于大数据技术的电力系统故障诊断方法&#xff0c;该方法通过整合先进的机器学习算法和交互式可视化技术&#xff0c;实现了对电力系统各类故障的智能化识别与深度分析。该系统采用随机森林算法作为核心分类器&#xff0c;构建了高精度的故障分类模…

MySQL 分区功能应用专门实现全方位详解与示例

MySQL 分区功能允许将表的数据分散存储在不同的物理分区中,同时保持逻辑上的单一表结构。下面我将从基础概念到高级应用,全面讲解 MySQL 分区实现。 一、分区核心作用 1. 性能提升 分区剪枝(Partition Pruning):查询时自动跳过不相关的分区,减少数据扫描量 并行处理:不…

汽车功能安全-嵌入式软件测试(软件合格性测试)【目的、验证输入、集成验证要求】11

文章目录1 嵌入式软件测试&#xff08;Testing of the embedded Software&#xff09;2 测试输入3 验证要求和建议3.1 测试环境3.2 测试方法3.2.1 基于需求的测试3.2.2 故障注入测试3.2.3 两种方法的区别与联系总结3.3 测试用例导出方法4 嵌入式软件的测试结果评价5 测试输出物…

【webrtc】gcc当前可用码率1:怎么决策的

【webrtc】当前最大码率是怎么决策的1 看日志,跟踪代码最大码率 是probe的上限 默认值很大 外部设置的较小,调用堆栈 无限大作为默认值 默认是无限大,所以使用预设值 【webrtc】码率设定中的 int64_t 的无限大

UE5 C++计时器

UE5 C计时器 计时器一&#xff1a; .h文件 FTimerHandle TimerHandle_BetweenShot;//定义时间句柄 void StartFire();void EndFire();.cpp文件 #include “TimerManager.h” void ASpaceShip::StartFire() {GetWorldTimerManager().SetTimer(TimerHandle_BetweenShot, this, &a…