Board logo

标题: [文件操作] [已解决]批处理解压目录下所有压缩包 [打印本页]

作者: gddsssko    时间: 2024-6-8 22:36     标题: [已解决]批处理解压目录下所有压缩包

解压 目录下,子文件夹和子子文件夹(和子子子...文件夹)所有压缩包在压缩包原位置,然后删除压缩包,并且压缩包解压出来的所有文件的文件名前 加上压缩包名字(变成:压缩包名字+"@"+文件名)。
      例如:
           操作前文件目录:
            Test/0001/你好.rar(其中包含001.txt,002.jpg和003.mp4)
            Test/0002/世界.rar(其中包含001.txt,002.jpg和003.mp4)
            Test/0003/你好世界/HelloWorld.rar(其中包含001.txt,002.jpg和003.mp4)
           操作后文件目录:
            Test/0001/你好/你好@001.txt
            Test/0001/你好/你好@002.jpg
            Test/0001/你好/你好@003.mp4

            Test/0002/世界/世界@001.txt
            Test/0002/世界/世界@002.jpg
            Test/0002/世界/世界@003.mp4

            Test/0003/你好世界/HelloWorld/HelloWorld@001.txt
            Test/0003/你好世界/HelloWorld/HelloWorld@002.jpg
            Test/0003/你好世界/HelloWorld/HelloWorld@003.mp4
作者: gddsssko    时间: 2024-6-9 08:05

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :: 设置要搜索的目录
  4. set "rootdir=C:\MyFile\Test"
  5. :: 遍历目录下的所有.rar和.zip文件
  6. for /r "%rootdir%" %%i in (*.rar, *.zip) do (
  7.     :: 获取压缩包的完整路径
  8.     set "fullpath=%%i"
  9.     :: 获取压缩包所在的目录
  10.     set "dir=%%~dpi"
  11.     :: 获取压缩包的文件名(不含扩展名)
  12.     set "filename=%%~ni"
  13.    
  14.     :: 使用7-Zip解压压缩包到原位置
  15.     7z x "!fullpath!" -o"!dir!" -y
  16.    
  17.     :: 创建一个临时目录用于存放解压出来的文件
  18.     md "!dir!!filename!"
  19.    
  20.     :: 遍历解压出来的文件并重命名
  21.     for /r "!dir!" %%f in (*) do (
  22.         if "%%~dpf"=="!dir!!filename!\" (
  23.             set "newname=!filename!@%%~nxf"
  24.             move "%%f" "!dir!!filename!\!newname!"
  25.         )
  26.     )
  27.    
  28.     :: 删除原压缩包
  29.     del "!fullpath!"
  30. )
  31. echo 处理完成。
  32. pause
复制代码
回复 1# gddsssko
我这个执行后压缩包不见了,也没有解压后的文件。
作者: newswan    时间: 2024-6-9 09:37

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 设置工作目录
  4. set "work=%temp%\%random%%random%%random%%random%"
  5. mkdir "%work%" || goto :eof
  6. rem 递归查找所有压缩包并解压
  7. for /r %%A in (*.zip *.rar) do (
  8.     "%ProgramFiles%\7-Zip\7z.exe" x -o"%%~dpA" "%%A"
  9.     rem 获取压缩包文件名(不带扩展名)
  10.     set "zipname=%%~nA"
  11.     rem 处理解压出的文件
  12.     for %%F in ("%%~dpA*") do (
  13.         rem 重命名解压出的文件
  14.         set "newname=%%~nF"
  15.         ren "%%F" "!zipname!@!newname!"
  16.     )
  17. )
  18. rem 删除临时工作目录
  19. rmdir "%work%" /s /q
复制代码

作者: gddsssko    时间: 2024-6-9 09:50

回复 3# newswan


    失败,变成了所有文件无扩展名,并且前缀加上了目录下第一个压缩包的名称,然后没有一个压缩包是解压成功的
作者: newswan    时间: 2024-6-9 11:26

本帖最后由 newswan 于 2024-6-9 13:40 编辑

是 ai 写的。。。。
重新写了下
  1. @echo off
  2. set "_folder_=D:\xyz\"
  3. pushd "%_folder_%"
  4. for /f "usebackq tokens=* delims=" %%a in (` dir /s /b /a-d *.zip *.rar `) do (
  5.     "C:\Program Files\WinRAR\Rar.exe" x "%%a" "%%~dpa\%%~na\"
  6.     rem del "%%a"
  7.     for %%b in ("%%~dpa\%%~na\*") do (
  8.         ren "%%~fb" "%%~na@%%~nxb"
  9.     )
  10. )
  11. popd
复制代码

作者: newswan    时间: 2024-6-9 11:42

本帖最后由 newswan 于 2024-6-9 13:33 编辑

powershell 简单些
for 语法 头疼了
  1. $folder = "D:\xyz\"
  2. Push-Location -Path $folder
  3. Get-ChildItem -Path "*.rar","*.zip" -Recurse | ForEach-Object {
  4.     Write-Host "--$_.FullName--"
  5.     Push-Location -Path $_.DirectoryName
  6.     Start-Process -Wait -FilePath "C:\Program Files\WinRAR\Rar.exe" -ArgumentList " x `"$($_.FullName)`" `"$($_.BaseName)\`""
  7.     Remove-Item -Path $_.FullName
  8.     $ff = $_.BaseName
  9.     Get-ChildItem -Path $ff | ForEach-Object {
  10.         Rename-Item -Path $_.Fullname -NewName ( $ff + "@" + $_.BaseName + $_.Extension )
  11.     }
  12.     Pop-Location
  13. }
复制代码

作者: newswan    时间: 2024-6-9 11:44

很少用7z,7z 应该也差不多
作者: 77七    时间: 2024-6-9 11:50

  1. @echo off
  2. set "_rar=C:\Program Files\WinRAR\Rar.exe"
  3. cd /d "%~dp0"
  4. for /f "delims=" %%i in ('dir /b /s /a-d *.rar *.zip') do (
  5. md "%%~dpni"
  6. "%_rar%" e "%%i" "%%~dpni" && del "%%i"
  7. for /f "delims=" %%j in ('dir /b "%%~dpni\*"') do (
  8. ren "%%~dpni\%%j" "%%~ni@%%j"
  9. )
  10. )
  11. pause
复制代码

作者: aloha20200628    时间: 2024-6-9 12:05

本帖最后由 aloha20200628 于 2024-6-9 12:17 编辑

回复 1# gddsssko

假设7z.exe可在命令行直接调用运行(路径已被预设)...
7z解压过程中可自动生成被指定的解压目录;代码第5行现状是保留源压缩包文件,抹去前缀REM即可删除源压缩包文件
  1. @echo off
  2. for /f "delims=" %%F in ('dir /b/s/a-d *.zip *.rar *.7z') do (
  3. 7z.exe x "%%F" -o"%%~dpnF" -y
  4. for /f "delims=" %%a in (' dir /b/s/a-d "%%~dpnF" ') do ren "%%a" "%%~nF@%%~na%%~xa"
  5. REM del /q "%%F"
  6. )
  7. pause&exit/b
复制代码

作者: dreamer    时间: 2024-6-9 15:09

看看是否適用,如沒問題可將echo 去除後測試使用.
  1. @Echo off
  2. Set rar="C:\Program Files\WinRAR\WinRAR.exe"
  3. For /r %%i in (*.rar) do Echo "%rar%" rn "%%~i" *.*" %%~ni@*.*
  4. For /r %%i in (.) do Echo "%rar%" e "%%~dpi*.rar" "%%~dpi*.*"&&Echo del "%%~dpi*.rar"
  5. pause
复制代码

作者: gddsssko    时间: 2024-6-9 16:53

回复 10# dreamer


    错误:被期望位于"C:\MySoft\WinRAR\WinRAR.exe(WinRAR的路径)"的开头
作者: gddsssko    时间: 2024-6-9 16:57

回复 9# aloha20200628


    经测试可行,感谢大佬
作者: gddsssko    时间: 2024-6-9 16:58

回复 8# 77七

经测试可行,感谢大佬,
作者: dreamer    时间: 2024-6-10 08:12

回复 11# gddsssko
我測試結果也是如此,但壓縮檔內的檔名確實也會被更改(winrar會,rar不會),不知是不是winrar的bug如果用直接輸入的不管是winrar或rar命令都能完成更名也不會出現錯誤.




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2