Windows 10下基于正则匹配文件名前缀的差异化文件复制需求
Windows 10下基于正则匹配文件名前缀的差异化文件复制需求
嗨,我来给你几个简单易上手的解决方案,都是Windows 10原生支持的,不用额外装软件,刚好匹配你的需求——只复制A文件夹里那些B文件夹没有相同前缀(最后一个下划线之前的部分)的文件。
方法一:PowerShell脚本(推荐,正则处理更灵活)
PowerShell是Windows自带的强大工具,处理文件名匹配非常方便。你可以按照以下步骤操作:
- 打开PowerShell:按下Win+X,选择“Windows PowerShell”或者“Windows终端(管理员)”(如果文件夹有权限限制的话)
- 复制下面的脚本,把其中的
C:\Path\To\FolderA和C:\Path\To\FolderB改成你实际的文件夹路径 - 粘贴到PowerShell里回车运行即可
# 设置源文件夹A和目标文件夹B的路径,请替换成你自己的路径 $sourceDir = "C:\Path\To\FolderA" $destDir = "C:\Path\To\FolderB" # 遍历源文件夹中所有.jpg格式的文件 Get-ChildItem -Path $sourceDir -Filter "*.jpg" | ForEach-Object { # 使用正则提取文件名前缀:去掉最后一个下划线及后面的所有内容 $prefix = $_.Name -replace "_[^_]+$", "" # 检查目标文件夹中是否存在相同前缀的文件 $hasMatch = Get-ChildItem -Path $destDir -Filter "$prefix_*.jpg" -ErrorAction SilentlyContinue if (-not $hasMatch) { # 如果没有匹配的前缀文件,就复制当前文件到目标文件夹 Copy-Item -Path $_.FullName -Destination $destDir Write-Host "已复制:$($_.Name)" } else { Write-Host "目标文件夹已有相同前缀文件,跳过:$($_.Name)" } }
脚本说明:
-replace "_[^_]+$", ""这段正则的意思是:找到最后一个下划线,然后删除它以及后面的所有字符,得到前缀部分- 如果你的文件不只是.jpg格式,可以把
-Filter "*.jpg"改成-Filter "*.*"来匹配所有文件
方法二:批处理脚本(适合习惯用CMD的用户)
如果你更习惯用CMD命令行,也可以用批处理来实现,虽然正则处理稍显麻烦,但也能完成需求:
- 打开记事本,复制下面的代码,替换文件夹路径
- 保存为
CopyDiffFiles.bat(注意保存类型选“所有文件”) - 双击这个批处理文件运行
@echo off :: 设置源文件夹和目标文件夹路径,请替换成实际路径 set "sourceDir=C:\Path\To\FolderA" set "destDir=C:\Path\To\FolderB" :: 遍历源文件夹中的所有jpg文件 for %%f in ("%sourceDir%\*.jpg") do ( :: 提取文件名(不含扩展名和路径) set "fileName=%%~nf" :: 启用延迟扩展,方便处理变量 setlocal enabledelayedexpansion :: 提取前缀:循环删除最后一个字符直到遇到下划线,再去掉下划线后面的内容 set "prefix=!fileName!" :trimLoop if "!prefix:~-1!"=="_" ( set "prefix=!prefix:~0,-1!" goto trimLoop ) :: 检查目标文件夹是否存在相同前缀的文件 if not exist "%destDir%\!prefix!_*.jpg" ( copy "%%f" "%destDir%" >nul echo 已复制:%%~nxf ) else ( echo 已存在相同前缀,跳过:%%~nxf ) endlocal ) pause
小提示:
- 如果运行时提示权限不足,右键点击批处理文件,选择“以管理员身份运行”
- 两种方法都会在控制台输出操作日志,方便你查看哪些文件被复制了,哪些被跳过了
备注:内容来源于stack exchange,提问作者maudit




