winrar右键批量解压后套了一层重复名称的文件夹,ps1批处理向上移动解决A\A
用7z右键菜单批量解压就没这种现象,但是winrar不知道为什么会这样,看起来是把rar压缩包的文件名用来创建一个文件夹,然后就导致重复了
例如解压后变成了
D:\test\A\A\B\C
莫名其妙的多了一层A,需要移动改回去,消除重复的A
D:\test\A\B\C
创建一个ps1文件,放在D:\test目录,然后运行
自己先复制几个文件夹来测试,这一份批处理代码是ai写的,我自己试了下确实好使,也手动给ai代码修了几个bug,比如发生跳过后文件被删了,以下是修复后可用的最终版本
代码:
- # 设置要操作的根目录
- $rootDir = "D:\test"
- Write-Host "--- 目标根目录: $rootDir ---"
- Write-Host "开始处理重复层级 (结构: A\A...) - **已启用安全删除检查**"
- Write-Host ""
- # 遍历根目录下的所有一级子文件夹 (A)
- Get-ChildItem -LiteralPath $rootDir -Directory | ForEach-Object {
- $itemA = $_ # 当前处理的一级文件夹 A
- $pathA = $itemA.FullName
- $nameA = $itemA.Name
-
- Write-Host "----------------------------------------------------"
- Write-Host "正在检查父文件夹: '$nameA'"
-
- # 查找 A 内部是否存在一个与自身同名的子文件夹 (A/A)
- $duplicateFolderB = Get-ChildItem -LiteralPath $pathA -Directory | Where-Object { $_.Name -eq $nameA }
-
- if ($duplicateFolderB) {
- $pathB = $duplicateFolderB.FullName
- Write-Host "发现重复子文件夹 B: '$pathB'" -ForegroundColor Cyan
-
- # 目标:将子文件夹 B 内部的所有内容向上移动到 父文件夹 A
- $targetContents = Get-ChildItem -LiteralPath $pathB -Force
- $moveSuccessful = $true # 标记是否所有内容都已处理
-
- if ($targetContents.Count -gt 0) {
- Write-Host "发现 B 内部有 $($targetContents.Count) 项内容,准备向上移动..."
-
- try {
- # 1. 移动子文件夹 B 内部的所有内容到父文件夹 A
- foreach ($content in $targetContents) {
- $destinationPath = Join-Path -Path $pathA -ChildPath $content.Name
-
- # 检查目标文件夹 A 中是否已存在相同名称的文件/文件夹,防止冲突
- if (Test-Path -LiteralPath $destinationPath) {
- Write-Host "警告: 父文件夹 A 中已存在 '$($content.Name)',跳过移动此项。" -ForegroundColor Yellow
- $moveSuccessful = $false
- continue
- }
-
- # 移动操作
- Write-Host " - 移动: '$($content.Name)'"
- Move-Item -LiteralPath $content.FullName -Destination $pathA -Force -ErrorAction Stop
- }
-
- # 2. **修正后的安全删除:检查 B 是否为空并删除它**
- # 只有当 B 文件夹内部没有剩余内容时,才删除它
- $remainingContents = Get-ChildItem -LiteralPath $pathB -Force
- if ($remainingContents.Count -eq 0) {
- Remove-Item -LiteralPath $pathB -Recurse -Force -ErrorAction Stop
- Write-Host "成功消除重复层级 A\A,并删除空文件夹 B。" -ForegroundColor Green
- } else {
- Write-Host "错误: 重复子文件夹 B 中仍有 $($remainingContents.Count) 项内容,保留 B。" -ForegroundColor Red
- Write-Host "请手动检查 B 文件夹: '$pathB'" -ForegroundColor Red
- $remainingContents | ForEach-Object { Write-Host " - 保留项: $($_.Name)" -ForegroundColor Red }
- }
- }
- catch {
- Write-Host "严重错误: 移动或删除操作失败。" -ForegroundColor Red
- Write-Host "路径: '$pathA'" -ForegroundColor Red
- Write-Host "错误信息: $($_.Exception.Message)" -ForegroundColor Red
- }
- }
- else {
- # 文件夹 B 本身是空的,可以直接删除
- Remove-Item -LiteralPath $pathB -Recurse -Force -ErrorAction Stop
- Write-Host "发现重复子文件夹 B 为空,已直接删除。" -ForegroundColor Green
- }
- }
- else {
- Write-Host "未发现重复结构 A\A,跳过。"
- }
- }
- Write-Host ""
- Write-Host "所有文件夹处理完成。"
- Read-Host "按任意键退出..." # 确保窗口保持打开