Board logo

标题: [文件操作] [已解决]批处理如何将文件夹下主名相同的文件压缩为zip文件? [打印本页]

作者: marginal    时间: 2010-4-23 11:36     标题: [已解决]批处理如何将文件夹下主名相同的文件压缩为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")
复制代码

作者: x9tiancmd    时间: 2010-4-23 12:54

  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 编辑 ]
作者: marginal    时间: 2010-4-23 13:22

楼上的,多谢你的代码。
问题是,好像这个代码只能生成5535687894的打包文件,其它的号码都不能自动打包呀
作者: marginal    时间: 2010-4-23 15:14

原帖由 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等,只是举例。
作者: hanyeguxing    时间: 2010-4-23 15:49

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 编辑 ]
作者: x9tiancmd    时间: 2010-4-23 16:43

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

   rar.exe 看来压缩的不ZIP 格式而是相当于压缩成rar再重命名为ZIP了, 。
作者: marginal    时间: 2010-5-11 14:40

原帖由 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文件,该号码的所有相关文件都不打包。
作者: hanyeguxing    时间: 2010-5-11 16:05

  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"
复制代码

作者: marginal    时间: 2010-5-11 16:31

原帖由 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文件才执行打包,现在的代码没有实现判断。

寒侠,如果可能,我想把文件打包发到你邮箱,你帮忙测试一下,有时候截图也说不明不了问题。
作者: hanyeguxing    时间: 2010-5-11 16:53

为什么要把扩展名里的点都去掉呢?
作者: marginal    时间: 2010-5-11 22:55

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

事实上这些文件的拓展名为TIF,PDF之类的。HW,PL,或者IN只是表明这些代表什么文件,并不是扩展名来的。
作者: hanyeguxing    时间: 2010-5-11 23:36

把扩展名打上,或者通配扩展名
作者: marginal    时间: 2010-5-12 10:00

原帖由 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"
复制代码

作者: hanyeguxing    时间: 2010-5-12 10:52

* 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")
复制代码

作者: marginal    时间: 2010-5-12 12:22

原帖由 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 - ...

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




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