返回列表 发帖

[文件操作] [已解决]批处理解压目录下所有压缩包

解压 目录下,子文件夹和子子文件夹(和子子子...文件夹)所有压缩包在压缩包原位置,然后删除压缩包,并且压缩包解压出来的所有文件的文件名前 加上压缩包名字(变成:压缩包名字+"@"+文件名)。
      例如:
           操作前文件目录:
            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

@echo off
setlocal enabledelayedexpansion
:: 设置要搜索的目录
set "rootdir=C:\MyFile\Test"
:: 遍历目录下的所有.rar和.zip文件
for /r "%rootdir%" %%i in (*.rar, *.zip) do (
    :: 获取压缩包的完整路径
    set "fullpath=%%i"
    :: 获取压缩包所在的目录
    set "dir=%%~dpi"
    :: 获取压缩包的文件名(不含扩展名)
    set "filename=%%~ni"
   
    :: 使用7-Zip解压压缩包到原位置
    7z x "!fullpath!" -o"!dir!" -y
   
    :: 创建一个临时目录用于存放解压出来的文件
    md "!dir!!filename!"
   
    :: 遍历解压出来的文件并重命名
    for /r "!dir!" %%f in (*) do (
        if "%%~dpf"=="!dir!!filename!\" (
            set "newname=!filename!@%%~nxf"
            move "%%f" "!dir!!filename!\!newname!"
        )
    )
   
    :: 删除原压缩包
    del "!fullpath!"
)
echo 处理完成。
pauseCOPY
回复 1# gddsssko
我这个执行后压缩包不见了,也没有解压后的文件。

TOP

@echo off
setlocal enabledelayedexpansion
rem 设置工作目录
set "work=%temp%\%random%%random%%random%%random%"
mkdir "%work%" || goto :eof
rem 递归查找所有压缩包并解压
for /r %%A in (*.zip *.rar) do (
    "%ProgramFiles%\7-Zip\7z.exe" x -o"%%~dpA" "%%A"
    rem 获取压缩包文件名(不带扩展名)
    set "zipname=%%~nA"
    rem 处理解压出的文件
    for %%F in ("%%~dpA*") do (
        rem 重命名解压出的文件
        set "newname=%%~nF"
        ren "%%F" "!zipname!@!newname!"
    )
)
rem 删除临时工作目录
rmdir "%work%" /s /qCOPY

TOP

回复 3# newswan


    失败,变成了所有文件无扩展名,并且前缀加上了目录下第一个压缩包的名称,然后没有一个压缩包是解压成功的

TOP

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

是 ai 写的。。。。
重新写了下
@echo off
set "_folder_=D:\xyz\"
pushd "%_folder_%"
for /f "usebackq tokens=* delims=" %%a in (` dir /s /b /a-d *.zip *.rar `) do (
    "C:\Program Files\WinRAR\Rar.exe" x "%%a" "%%~dpa\%%~na\"
    rem del "%%a"
    for %%b in ("%%~dpa\%%~na\*") do (
        ren "%%~fb" "%%~na@%%~nxb"
    )
)
popdCOPY

TOP

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

powershell 简单些
for 语法 头疼了
$folder = "D:\xyz\"
Push-Location -Path $folder
Get-ChildItem -Path "*.rar","*.zip" -Recurse | ForEach-Object {
    Write-Host "--$_.FullName--"
    Push-Location -Path $_.DirectoryName
    Start-Process -Wait -FilePath "C:\Program Files\WinRAR\Rar.exe" -ArgumentList " x `"$($_.FullName)`" `"$($_.BaseName)\`""
    Remove-Item -Path $_.FullName
    $ff = $_.BaseName
    Get-ChildItem -Path $ff | ForEach-Object {
        Rename-Item -Path $_.Fullname -NewName ( $ff + "@" + $_.BaseName + $_.Extension )
    }
    Pop-Location
}COPY

TOP

很少用7z,7z 应该也差不多

TOP

@echo off
set "_rar=C:\Program Files\WinRAR\Rar.exe"
cd /d "%~dp0"
for /f "delims=" %%i in ('dir /b /s /a-d *.rar *.zip') do (
md "%%~dpni"
"%_rar%" e "%%i" "%%~dpni" && del "%%i"
for /f "delims=" %%j in ('dir /b "%%~dpni\*"') do (
ren "%%~dpni\%%j" "%%~ni@%%j"
)
)
pauseCOPY
bat小白,请多指教!谢谢!

TOP

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

回复 1# gddsssko

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

TOP

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

TOP

回复 10# dreamer


    错误:被期望位于"C:\MySoft\WinRAR\WinRAR.exe(WinRAR的路径)"的开头

TOP

回复 9# aloha20200628


    经测试可行,感谢大佬

TOP

回复 8# 77七

经测试可行,感谢大佬,

TOP

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

TOP

返回列表