[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] BAT如何批量压缩文件夹的文件包括子目录下的文件?

把文件压缩到一个到临时一个文件,当临时文件体积大于20mb的时候,
要求删除要求删除压缩包里面最后一个文件,使其体积不大于20mb,
然后保存到001.zip或001.rar。然后把临时压缩包体积重置0,继续打包
后面的文件,当体积大于20mb的时候,也删掉临时压缩包的最后一个文件。
然后把临时文件改为002.zip或rar。不知道表达的清楚吗?

回复 35# xczxczxcz

可能我是机械硬盘的关系,或者我的cpu太慢。

TOP

回复 34# netdzb

偶测试了 1080个文件(主目录540个,子目录也540个,每个文件为1.89M),按每个压缩包不大于20M的最大文件,默认压缩率,处理用时 147秒。又测试按每个压缩包 100个文件的方式打包,采用极限压缩。用时48秒。不知道你的 1 个小时怎么来的。

TOP

回复 32# xczxczxcz

一个一个包压缩效率太低,打包405个文件用了一个小时。能否改成在门限下的尺寸,得到一个输出列表。
然后通过列表文件进行打包。

TOP

本帖最后由 smss 于 2019-6-19 21:36 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /a-d /b *.*') do (set n=001
  4. rar a temp.rar %%i
  5. for %%i in (temp.rar) do (
  6. if %%~zi leq 20971520 (copy temp.rar !n!.rar) else (del temp.rar
  7. n=n+1
  8. ))
  9. pause
复制代码
rar 为你电脑RAR绝对路径

TOP

本帖最后由 xczxczxcz 于 2019-6-19 17:22 编辑

回复 31# netdzb

一、肯定不能运行。
二、不会处理子目录。

再给你写个 带子目录的。用法同前。若嫌目录太长,可把工作文件夹放到磁盘根目录。这样简单,不需要过多处理。
下面的脚本不处理:当有一个文件大于设定值时,会无限循环。所以假设你的每一个文件都不会超过设定的值。
  1. $files =ls -rec |?{$_.Directory};
  2. $Size = 19.5; #自定义大小,
  3. $index, $n =0,1;
  4. While ( $index -lt $files.Count )
  5. {
  6. $name =$n.ToString().PadLeft(3,'0')+'.rar';
  7. & rar a $name $files[$index].FullName|Out-Null;
  8. if ((Get-Item $name).Length/1MB -gt $Size) {
  9. $del =$files[$index].FullName -replace '^\w:\\';
  10. & rar d $name $del | Out-Null;
  11. $n++;
  12. } else { $index++ }
  13. }
复制代码

TOP

回复 8# xczxczxcz


  我把代码改成这样,你看可以吗?

$files =ls |?{$_.Directory};

$Begin, $n =0,1,$Len=0;
While ( $Begin -lt $files.Count )
{
    $name =$n.ToString().PadLeft(3,'0')+'.rar';
     
    While ( $Len -lt 19.5MB)
    {
      Len=Len+Get-Item $name).Length;
      & rar
    }
     Len=0;
}

TOP

回复 29# netdzb


    echo on 改成 echo off 试试呢?如果还是不行,请把报错信息发出来看看。我数了一下,5个左括号、5个右括号,没发现多或少。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 28# Batcher

代码有错误,会在页面显示代码,好像是多了括号。

TOP

回复 22# netdzb


试试这样可以比较文件大小吗:
  1. @echo on
  2. setlocal enabledelayedexpansion
  3. set num=100
  4. for /f "delims=" %%i in ('dir /a-d /b /s *.*') do (
  5.     rar a I:\hand\temp.rar "%%i"
  6.     for %%a in ("I:\hand\temp.rar") do (
  7.         if %%~za leq 20971520 (
  8.             echo %%a 不大于20MB
  9.             REM 把你需要的操作放在这里
  10.         )
  11.     )
  12.     copy /y I:\hand\temp.rar I:\hand\!num:~-2!.rar
  13.     set /a num+=1
  14.     del /f I:\hand\temp.rar
  15. )
  16. pause
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

你自己根据需要 修改 RAR 参数吧。偶们也不明白你的最终需求。

TOP

回复 25# xczxczxcz

把ep去掉就文件夹了。

TOP

回复 24# netdzb


    是把文件夹内的文件一起提出来了,不建立文件夹。

TOP

回复 23# xczxczxcz

测试了,还是没有文件夹。

TOP

回复 22# netdzb

把  PS 脚本的第一行改成 $files =ls -rec|?{$_.Directory};
其它不变,看能不能满足你的要求。如果要保存原来文件的目录结构,自行删除 -EP 参数。

TOP

返回列表