. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 回复
 
主题工具
muler2000
 
muler2000 的头像
热心会员
 
资 料:
注册日期: Mar 2002
帖子: 5,054 声望值: 3
精华: 0,解答: 6
#1 旧 2020-06-28, 23:32:16 默认 【求助】多个RAR文件自动解压批处理怎么写?
muler2000 当前离线  

有很多RAR文件要解压,找到的批处理文件不是很符合要求,大神帮看一下。
它可以递进把深层目录下的文件都解压了,但是那些主要内容所在的目录很深,能不能直接解到第一层目录上。求指点,下面这个是自动解压的批处理,附件有一个结构RAR例子:

@echo off
set "rar=C:\Program Files\WinRAR\WinRAR.exe"
for /r %%i in (*.rar *.zip) do "%rar%" x -ad -y %%i %%~dpi
pause


最后,最好再来一个删除第一层目录下,所有的空子目录,这样就省事多了。 本来想用RPA软件弄的。那些软件好象都是只支持zip文件的自动化,烦恼。
上传的图像
文件类型: jpg Snap107.jpg (272.3 KB, 155 次查看)
文件类型: jpg Snap108.jpg (521.3 KB, 156 次查看)
上传的附件
文件类型: rar 解压文件例子.rar (1.90 MB, 8 次查看)
文件类型: rar 自动解压批处理.rar (203 字节, 2 次查看)
回复时引用此帖
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,297 声望值: 3
精华: 18,解答: 80
#2 旧 2020-06-29, 22:12:54 默认
namejm 当前离线  

不知道“最后一层”是怎么定义的
如果“01 - Introduction”下还有子目录的话
那“最后一层”该怎么算呢?

此帖于 2020-06-30 00:12:20 被 namejm 编辑. .


TotalCommder、EveryThing、batch、AutoHotKey、EverEdit
精通Word、Excel、PPT的安装与卸载
熟练掌握VB、C++、SQL的缩写
回复时引用此帖
muler2000
 
muler2000 的头像
热心会员
 
资 料:
注册日期: Mar 2002
帖子: 5,054 声望值: 3
精华: 0,解答: 6
#3 旧 2020-06-30, 09:24:32 默认
muler2000 当前离线  

引用:
作者: namejm 查看帖子
不知道“最后一层”是怎么定义的
如果“01 - Introduction”下还有子目录的话
那“最后一层”该怎么算呢?
你这样一问,看了一下,感觉确实不好判断, 那是否可以保留最终文件的上层目录(比如它就几个.mp4的文件),不懂这个怎么实现。

或者目录结构不要了,就把最终文件解压出来放到第一层目录下也行,然后删除掉空目录,这样好像也能完整,就是如果子目录中的,文件重名也不好处理,那时会出提示,不好自动了
回复时引用此帖
riverqh
 
riverqh 的头像
终极会员
 
资 料:
注册日期: Mar 2002
帖子: 10,819 声望值: 3
精华: 1,解答: 55
#4 旧 2020-06-30, 09:47:47 默认
riverqh 当前离线  

rar e -r %RarArchiveName% %ExtractTargetDir%


学着做一些有益别人和社会的事情,不要讲回报,以此证明自己对别人和社会还有点用处。
回复时引用此帖
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,297 声望值: 3
精华: 18,解答: 80
#5 旧 2020-06-30, 14:31:04 默认
namejm 当前离线  

引用:
作者: muler2000 查看帖子
你这样一问,看了一下,感觉确实不好判断, 那是否可以保留最终文件的上层目录(比如它就几个.mp4的文件),不懂这个怎么实现。

或者目录结构不要了,就把最终文件解压出来放到第一层目录下也行,然后删除掉空目录,这样好像也能完整,就是如果子目录中的,文件重名也不好处理,那时会出提示,不好自动了
“最终文件”也不太好理解
是不是“层深最大的文件”才是你要的啊?
只有搞明白了真正需要的文件是哪个层上的,才好写代码
其它的保持文件结构、删掉空目录之类的都可以办到
回复时引用此帖
muler2000
 
muler2000 的头像
热心会员
 
资 料:
注册日期: Mar 2002
帖子: 5,054 声望值: 3
精华: 0,解答: 6
#6 旧 2020-07-01, 01:57:41 默认
muler2000 当前离线  

引用:
作者: namejm 查看帖子
“最终文件”也不太好理解
是不是“层深最大的文件”才是你要的啊?
只有搞明白了真正需要的文件是哪个层上的,才好写代码
其它的保持文件结构、删掉空目录之类的都可以办到
感谢兄弟解答
1楼图红色框框里的那些文件就是需要的,或者把这些文件都自动解压到另一个指定的目录下也行,比如D盘的study目录, 压缩包到时我直接手动删除。

它最终的文件,一般是几个带序列号的目录,每个目录里面又有一些带序列号的文件。
按层级的话,我感觉至少要最后两层目录, 最底层(最终文件mp4,字幕这些),倒数第一层(文件所在章节的子目录),倒数第二层(软件总目录大标题)

此帖于 2020-07-01 02:04:15 被 muler2000 编辑. .
回复时引用此帖
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,297 声望值: 3
精华: 18,解答: 80
#7 旧 2020-07-01, 18:18:28 默认
namejm 当前离线  

其实我现在还不是很明白你要的是哪些目录
你的需求是不是这样的:
假如A.rar内存在多级文件夹,并且内部可能还存在压缩文件
把A.rar内所有文件都解压完毕后(包括内部的压缩包)
如果压缩包内文件夹B下同时存在 *.mp4和*.srt文件
就要把所有与B文件夹同层的文件夹都移动到名为 A 的文件夹下
把所有类似文件夹B的父文件夹都这般处理后
剩余的文件直接删掉?

此帖于 2020-07-01 19:22:25 被 namejm 编辑. .
回复时引用此帖
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,297 声望值: 3
精华: 18,解答: 80
#8 旧 2020-07-01, 20:11:41 默认
namejm 当前离线  

以下代码具有这样的功能:
搜索当前文件夹下的*.rar和*.zip文件(假设文件名为A)
把这两类压缩包中所有文件都解开,包括其中任意层次上的*.rar和*.zip
在解开的文件中,若发现某文件夹下同时存在*.mp4和*.srt
则把与该文件夹同层的所有文件夹都提取出来
放到当前路径下名称为 A 的文件夹中
并保留这些文件夹的文件结构

因为是批量处理,为了避免数据损失,正式使用前请尽量多用测试数据进行测试
代码:
@echo off
set "rar=C:\Program Files\WinRAR\WinRAR.exe"
setlocal enabledelayedexpansion

for %%i in (*.rar  *.zip) do (
  echo 正在解压 "%%i"

  rem 解压当前目录下的压缩文件
  "%rar%" x -ad -y "%%i" "TmpDir\"
  rem 取消下一句的注释,可删除当前目录下已经解压过的压缩文件
  REM del /a /f /q "%%i"

  rem 为了删除释放出来的子压缩包文件,需要进入新创建的临时文件夹
  pushd "TmpDir"
  for /r %%j in (*.rar  *.zip) do (
    "%rar%" x -ad -y "%%j" "%%~dpj"
    rem 删除已经解压过的子压缩包
    del /a /f /q "%%j"
  )
  popd

  call :CopyDirToTopLayer "%%~ni"

  rem 删除解压出来的临时文件夹
  rd /q /s TmpDir
)

echo.
echo 解压完毕
pause
exit

rem 移动文件夹到顶层文件夹
:CopyDirToTopLayer
  for /f "delims=" %%i in ('dir /ad /b /s TmpDir') do (
    if exist "%%i\*.mp4" (
      if exist "%%i\*.srt" (
        for /f "delims=" %%j in ('dir /ad /b "%%~dpi"') do (
          xcopy /s /i /y "%%~dpi%%j" "%~1\%%j">nul
        )
      )
    )
  )
goto :eof
回复时引用此帖
muler2000
 
muler2000 的头像
热心会员
 
资 料:
注册日期: Mar 2002
帖子: 5,054 声望值: 3
精华: 0,解答: 6
#9 旧 2020-07-02, 00:22:29 默认
muler2000 当前离线  

好像不行,请调试一下bug, 我传了一个文件,你用附件试试。
上传的图像
文件类型: jpg mmexport1593620845262.jpg (467.2 KB, 52 次查看)
上传的附件
文件类型: rar Linkedin.Learning.Learning.Amazon.Web.Services.Lambda-ZH.rar (1.40 MB, 7 次查看)

此帖于 2020-07-02 00:29:33 被 muler2000 编辑. .
回复时引用此帖
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,297 声望值: 3
精华: 18,解答: 80
#10 旧 2020-07-02, 01:16:08 默认
namejm 当前离线  

WinRAR貌似不支持超过260字符的文件路径
请把压缩文件名改短,并放到尽可能短的路径下测试
回复时引用此帖
muler2000
 
muler2000 的头像
热心会员
 
资 料:
注册日期: Mar 2002
帖子: 5,054 声望值: 3
精华: 0,解答: 6
#11 旧 2020-07-02, 01:36:11 默认
muler2000 当前离线  

我录制了一个操作的视频,大概你看了就明白我的意思了。文件名不好改,因为压缩包文件下载后,原始文件名就是这么长的。 winrar应该可以支持,不然原作者怎么把文件打包呢? 还有就是1楼的那个批处理貌似很厉害,它什么都可以解出来,只是整理目录太麻烦。有些文件压缩到了深层的目录里,点进去移动很繁琐, 一般做得好的包,都是在两、三层左右。
上传的附件
文件类型: 7z 操作视频.7z (4.23 MB, 6 次查看)
回复时引用此帖
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,297 声望值: 3
精华: 18,解答: 80
#12 旧 2020-07-02, 09:32:51 默认
namejm 当前离线  

经过一番测试
发现并不是因为WinRAR不兼容超长路径
而是 dir 列路径时碰到超长路径会出错
把8楼的代码修改了一下,带层次的路径全部转为8.3格式的短路径
这样应该可以处理超长路径了
请测试:
代码:
@echo off
rem 为了兼容超长路径,所有带层次的路径都转为8.3格式的短路径(单层路径除外)

set "rar=C:\Program Files\WinRAR\WinRAR.exe"
for /f "delims=" %%i in ("%cd%\TmpDir\") do set "TmpDir=%%~si"

for %%i in (*.rar  *.zip) do (
  echo 正在解压 "%%i"

  rem 解压当前目录下的压缩文件
  "%rar%" x -ad -y "%%~si" "%TmpDir%"
  rem 取消下一句的注释,可删除当前目录下已经解压过的压缩文件
  REM del /a /f /q "%%i~si"

  rem 为了释放子压缩包文件并删除它们,需要进入新创建的临时文件夹
  pushd "%TmpDir%"
  for /r %%j in (*.rar  *.zip) do (
    "%rar%" x -ad -y "%%~sj" "%%~sdpj"
    rem 删除已经解压过的子压缩包
    del /a /f "%%~sj"
  )
  call :CopyDirToTopLayer "%%~sdpi" "%%~ni"
  popd

  rem 删除解压出来的临时文件夹
  rd /q /s "%TmpDir%"
)

echo.
echo 解压完毕
pause
exit

rem 复制文件夹到顶层文件夹
:CopyDirToTopLayer
  for /r %%i in (.) do (
    if exist "%%~si\*.mp4" (
      if exist "%%~si\*.srt" (
        for /f "delims=" %%j in ("%%~si") do (
          xcopy /s /i /y "%%~dpj*" "..\%~2">nul
        )
      )
    )
  )
goto :eof
回复时引用此帖
muler2000
 
muler2000 的头像
热心会员
 
资 料:
注册日期: Mar 2002
帖子: 5,054 声望值: 3
精华: 0,解答: 6
#13 旧 2020-07-02, 18:06:44 默认
muler2000 当前离线  

单层目录的解压不了,似乎无法智能判断目录结构,请修复一下,感觉快要大功告成了。附件这个解不出来

另外如果压缩包里的文件不是.mp4,.srt文件格式,我用*.*代替 任何文件,可以吗?
上传的附件
文件类型: rar Lynda.Digital.Transformation.Tips-APoLLo.rar (433.8 KB, 4 次查看)
回复时引用此帖
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,297 声望值: 3
精华: 18,解答: 80
#14 旧 2020-07-02, 18:40:37 默认
namejm 当前离线  

12楼的代码,是根据是否同时存在*.mp4和*.srt文件来判断要提取的文件夹在哪个位置
13楼的附件只有*.mp4文件,所以不会提取任何文件夹
请务必明确根据什么特征来判断要提取的文件夹在哪个位置
如果把*.mp4和*.srt替换成*.*,那就变成了提取任何文件夹
这恐怕不是你的本意
回复时引用此帖
Aspirant
 
Aspirant 的头像
核心会员
 
资 料:
注册日期: Feb 2002
帖子: 3,062 声望值: 3
精华: 5,解答: 10
#15 旧 2020-07-02, 19:00:59 默认
Aspirant 当前离线  

赞一下namejm兄弟,兄弟是个热心肠
回复时引用此帖
发表新主题 回复

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 17:00:30.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号