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

[文件操作] [已解决]批处理如何将文件夹下主名相同的文件压缩为zip文件?

在一个文件夹下,有很多以一个10个字符为主文件名的文件,比如5535687894 hw,5535687894 pl,5535687894 EOD;5535687916 pl;5535687916 in等等诸如此类的文件。

如果主文件名相同,就认为是同一套文件,比如5535687894 hw,5535687894 pl,5535687894 EOD三个文件就是5535687894的一套完整文件,需要将这三个文件压缩为5535687894.ZIP的文件,然后再删除压缩前的文件(即在文件夹下删除5535687894 hw,5535687894 pl,5535687894 EOD。对于没有被压缩的文件,不执行删除)

但是如果一套缺少以hw结尾的文件,则认为文件不完整,不能打包。比如,如果文件下只有5535687916 pl;5535687916 in文件,没有55355687916 hw文件,就不用打包,直接跳过。也不执行删除。

问题已解决:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
  3. for %%a in ("* hw.TIF") do (set a=%%a&set "a=!a:~0,10!"
  4. "%winrar%" m -afzip -inul -ibck "!a!" "!a! pl.PDF" "!a! eod.PDF" "%%a")
复制代码
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

  1. @echo off
  2. ::确保系统盘安装有WINRAR压缩软件
  3. for  /f "delims=" %%i in ('dir /a-d/b/s %systemdrive%rar.exe') do path=%%~dpi;%path%
  4. dir /a/b .|find "5535687894 hw" >nul||echo.不存在5535687894 hw文件,任意键退出...&&pause>nul&&exit
  5. rar a 5535687894.zip  5535687894* /m5
复制代码

另问下楼主: 5535687894 hw,5535687894 pl,5535687894 EOD   这三个文件是删除原始的文件,还是删除压缩了ZIP里面的, 这话说得不明不白不好猜呀
          由于刚才还是叫“5535687894” 后面又变在了 " 5535687916"   

我是看了三遍,就是没看懂你到底是压缩前者还是后者, 所以你自己改下吧,我晕了○( ̄﹏ ̄)○  

  虽然你写了是删除原始文件, 被你这么一转, 我都不敢猜压缩后的叫原始文件,还是原始文件叫原始文件

[ 本帖最后由 x9tiancmd 于 2010-4-23 13:22 编辑 ]
    ╭╩═╮
╭╯G O ╠ 雁过留声
╰⊙═⊙╯

TOP

楼上的,多谢你的代码。
问题是,好像这个代码只能生成5535687894的打包文件,其它的号码都不能自动打包呀

TOP

原帖由 x9tiancmd 于 2010-4-23 12:54 发表
@echo off
::确保系统盘安装有WINRAR压缩软件
for  /f "delims=" %%i in ('dir /a-d/b/s %systemdrive%rar.exe') do path=%%~dpi;%path%
dir /a/b .|find "5535687894 hw" >nul||echo.不存在5535687894 hw文件,任 ...

楼主,其实整个的意思就是:先判断文件下一套文件是否完整,完整的标准时有无形如5535678910 hw文件的存在,也就是只要有形如XXXXXXXXXX hw文件存在,就认为是完整的一套文件。

如果一套文件完整,就执行压缩;压缩后删除被压缩的文件(即删除hw,in,pl文件);如果文件不完整,不执行合并,也不执行删除。

上文提到的5535678910等,只是举例。

TOP

1,zip格式只能由winrar创建,控制台 RAR 不能创建 ZIP 压缩文件。
2,以所有文件均在批处理所在目录为准。压缩前推荐备份目录内所有文件。
3,示例1:检查文件名字符是否为10个,并检查三个文件是否都存在:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
  3. for /f "delims=" %%a in ('dir /a-d/b *.hw') do (
  4. call:hanye "%%a"
  5. if !n!==10 if exist "%%~na.pl" if exist "%%~na.eod" "%winrar%" m -afzip "%%~na" "%%~na.pl" "%%~na.eod" "%%a"
  6. )
  7. exit
  8. :hanye
  9. set "a=%~1"&set n=0
  10. :guxing
  11. if not "!a:~%n%,1!"=="" set/a n+=1&goto:guxing
复制代码
4,示例2:不检查文件名字符数,但检查三个文件是否同时存在
  1. @echo off
  2. set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
  3. for /f "delims=" %%a in ('dir /a-d/b *.hw') do if exist "%%~na.pl" if exist "%%~na.eod" "%winrar%" m -afzip "%%~na" "%%~na.pl" "%%~na.eod" "%%a"
复制代码
5,示例3:不检查文件名字符数,也不检查是否同时存在,只以.hw为基准
  1. @echo off
  2. set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
  3. for /f "delims=" %%a in ('dir /a-d/b *.hw') do "%winrar%" m -afzip "%%~na" "%%~na.pl" "%%~na.eod" "%%a"
复制代码
6,如果需要后台运行winrar,使用-IBCK开关。

[ 本帖最后由 hanyeguxing 于 2010-4-23 15:55 编辑 ]
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

才敲了下rar.exe 的帮助文档

   rar.exe 看来压缩的不ZIP 格式而是相当于压缩成rar再重命名为ZIP了, 。
    ╭╩═╮
╭╯G O ╠ 雁过留声
╰⊙═⊙╯

TOP

原帖由 hanyeguxing 于 2010-4-23 15:49 发表
5,示例3:不检查文件名字符数,也不检查是否同时存在,只以.hw为基准

@echo off
set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
for /f "delims=" %%a in ('dir /a-d/b * hw') do "%winrar%" m -afzip "%%~na" "%%~na pl" "%%~na eod" "%%a"


多谢你的代码,前段时间一直没有时间测试。我想以你提到的第三种代码来解决我的问题。稍微修改了一下,就是
@echo off
set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
for /f "delims=" %%a in ('dir /a-d/b * hw') do "%winrar%" m -afzip "%%~na" "%%~na pl" "%%~na eod" "%%a"


1.打包时总是弹出提示,要手工干预才能完成打包

2.现在的代码实践上将每一个文件都打包成了RAR文件了,并没有将相同HAWB合并到一个文件中,同时,BAT文件也被打包成了RAR文件。

请大侠继续帮忙:

1.请让WINRAR不需要人为干预,让它在后台运行。

2.BAT文件不要被打包

3.同一套文件打包到一个rar文件下,如果没有HW文件,该号码的所有相关文件都不打包。

TOP

  1. @echo off
  2. set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
  3. for /f "delims=" %%a in ('dir /a-d/b *.hw') do "%winrar%" m -afzip -inul -ibck "%%~na" "%%~na.pl" "%%~na.eod" "%%a"
复制代码
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 hanyeguxing 于 2010-5-11 16:05 发表
@echo off
set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
for /f "delims=" %%a in ('dir /a-d/b *.hw') do "%winrar%" m -afzip -inul -ibck "%%~na" "%%~na.pl" "%%~na.eod" "%%a"

非常感谢你的耐心,现在winrar不需要人为干预,但是打包的时候文件还是不能合并。
新的代码我修改为
  1. @echo off
  2. set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
  3. for /f "delims=" %%a in ('dir /a-d/b * hw') do "%winrar%" m -afzip -inul -ibck "%%~na" "%%~na pl" "%%~na eod" "%%a"
复制代码


同一套文件,还是没有合并,好奇怪。比如5535692536 hw.zip和5535692536.zip两个文件,其实应该为5535692536.zip一个文件中包含所有以5535692536开头的文件,而不是现在的每一个文件都自动打包。
另外,并没有实现判断,即当有形如xxxxxxxxxx hw文件才执行打包,现在的代码没有实现判断。

寒侠,如果可能,我想把文件打包发到你邮箱,你帮忙测试一下,有时候截图也说不明不了问题。

TOP

为什么要把扩展名里的点都去掉呢?
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 hanyeguxing 于 2010-5-11 16:53 发表
为什么要把扩展名里的点都去掉呢?

事实上这些文件的拓展名为TIF,PDF之类的。HW,PL,或者IN只是表明这些代表什么文件,并不是扩展名来的。

TOP

把扩展名打上,或者通配扩展名
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 hanyeguxing 于 2010-5-11 23:36 发表
把扩展名打上,或者通配扩展名

已经改为了
  1. @echo off
  2. set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
  3. for /f "delims=" %%a in ('dir /a-d/b * hw.TIF') do "%winrar%" m -afzip -inul -ibck "%%~na" "%%~na pl.PDF" "%%~na eod.PDF" "%%a"
复制代码

TOP

* hw.TIF必须用引号括起来
  1. @echo off&setlocal enabledelayedexpansion
  2. set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
  3. for %%a in ("* hw.TIF") do (set a=%%a&set "a=!a:~0,10!"
  4. "%winrar%" m -afzip -inul -ibck "!a!" "!a! pl.PDF" "!a! eod.PDF" "%%a")
复制代码
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 hanyeguxing 于 2010-5-12 10:52 发表
* hw.TIF必须用引号括起来@echo off&setlocal enabledelayedexpansion
set "winrar=C:\Program Files\WinRAR\WinRAR.exe"
for %%a in ("* hw.TIF") do (set a=%%a&set "a=!a:~0,10!"
"%winrar%" m -afzip -inul - ...

多谢寒大侠,问题解决。
非常感谢!

TOP

返回列表