中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [问题已解决]求助 分别压缩文件夹下个个文件的批处理.
作者:
标题: [问题已解决]求助 分别压缩文件夹下个个文件的批处理. 上一主题 | 下一主题
gcdj
初级用户





积分 64
发帖 57
注册 2010-2-25
状态 离线
『楼 主』:  [问题已解决]求助 分别压缩文件夹下个个文件的批处理.

假设 Z:盘里的文件夹"WORK" 里有5个文件大小不同的文件. 想做个批处理文件来实施, 压缩文件夹"WORK"里大于10MB的文件到Z盘的WORK_OK文件夹里. 要求每个文件要单独的压缩. 压缩的扩展名为最好是ZIP文件.如果麻烦的话CAB也可以. 条件是不能用任何软件.(`RAR`之类) windowsXP系统. 例 Z:盘里的文件夹"WORK" 文件 A 20MB B 8MB C 9MB D 12MB E 22MB 批处理实行后Z盘的WORK_OK文件夹里 A.ZIP D.ZIP E.ZIP 请哪为高手帮我做一个! 我试验过makecab命令,可是怎么弄也弄不好. dir Z:\work\log_work /b > Z:\work\log_work\b.txt makecab /F Z:\work\log_work\b.txt /d compressiontype=mszip /d compressionmemory=21 /d maxdisksize=1024000000 /d diskdirectorytemplate=dd* /d cabinetnametemplate=dd*.cab del Z:\work\log_work\setup.inf del Z:\work\log_work\setup.rpt del Z:\work\log_work\b.bat Pause [ Last edited by gcdj on 2010-7-1 at 07:50 ]


2010-3-1 15:12
查看资料  发送邮件  发短消息  网志  OICQ (12403198)  编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 2 楼』:  

不知道能否满足你的要求
@echo off&setlocal enabledelayedexpansion
set "source=z:\work"
set "destination=z:\work_ok"
if not exist %destionation% ( md %destionation% )

for /f "delims=" %%i in ('dir/b/s %source%') do (
set size=%%~zi
 if !size! gtr 10000000 (
      makecab  %%i %destination%\%%~ni.cab
)
)


2010-3-1 17:31
查看资料  发送邮件  访问主页  发短消息  网志   编辑帖子  回复  引用回复
gcdj
初级用户





积分 64
发帖 57
注册 2010-2-25
状态 离线
『第 3 楼』:  

Originally posted by huahua0919 at 2010-3-1 17:31: 不知道能否满足你的要求 [code] @echo off&setlocal enabledelayedexpansion set "source=z:\work" set "destination=z:\work_ok" if not exist %destionation% ( md %d ...
谢谢你的代码. 这个代码实行后为什么回多出一个 ")"的文件夹呢?


2010-3-2 07:44
查看资料  发送邮件  发短消息  网志  OICQ (12403198)  编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 4 楼』:  

仿照2楼给你写个 ZIP 的
@echo off
set "source=z:\work"
set "destination=z:\work_ok"
set "ching=%temp%\~$ching$.tmp"
set /a size=10*1024*1024

if not exist "%destination%" md "%destination%"
> "%ching%" echo s=WScript.Arguments(0):z=WScript.Arguments(1)
>>"%ching%" echo Set a=CreateObject("Shell.Application")
>>"%ching%" echo Set f=CreateObject("Scripting.FileSystemObject")
>>"%ching%" echo f.OpenTextFile(z,2,True).Write "PK"^&Chr(5)^&Chr(6)^&String(18,Chr(0))
>>"%ching%" echo a.NameSpace(z).CopyHere s
>>"%ching%" echo Do Until a.NameSpace(z).Items.Count^>0:WScript.Sleep 421:Loop
>>"%ching%" echo WScript.Echo s^&" ==> "^&z
for /f "delims=" %%i in ('dir/b/s "%source%"') do (
  if %%~zi gtr %size% (
        cscript -nologo -e:vbs "%ching%" "%%i" "%destination%\%%~nxi.zip"
  )
)
del /q "%ching%"
echo ================== 完 成 ==================
pause>nul




┏━━━━━━┓ ┃据说是李先生┃ ┠──────┨ ┃*ntRSS┃ ┗━━━━━━┛
2010-3-2 10:28
查看资料  发送邮件  发短消息  网志  OICQ (182484135)  编辑帖子  回复  引用回复
gcdj
初级用户





积分 64
发帖 57
注册 2010-2-25
状态 离线
『第 5 楼』:  

Originally posted by qinchun36 at 2010-3-2 10:28: 仿照2楼给你写个 ZIP 的 [code] @echo off set "source=z:\work" set "destination=z:\work_ok" set "ching=%temp%\~$ching$.tmp" set /a size=10*1024*1024 if ...
谢谢你写的代码.我实验了一下.出现错误了. C:\DOCUME~1\ddd\LOCALS~1\Temp\~$ching$.tmp(6,1) Microsoft VBScript error:There is no object. :'a.NameSpace(...)'


2010-3-2 12:28
查看资料  发送邮件  发短消息  网志  OICQ (12403198)  编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 6 楼』:  

。。。 没考虑到系统的性能,重新给你写一个
@echo off
set "source=E:\feiqRecieved\hemiao"
set "destination=E:\feiqRecieved_ok"
set "ching=%temp%\~$ching$.tmp"
set /a size=10*1024*1024

if not exist "%destination%" md "%destination%"
> "%ching%" echo s=WScript.Arguments(0):z=WScript.Arguments(1)
>>"%ching%" echo Set a=CreateObject("Shell.Application"):Set f=CreateObject("Scripting.FileSystemObject")
>>"%ching%" echo f.OpenTextFile(z,2,True).Write "PK"^&Chr(5)^&Chr(6)^&String(18,Chr(0)):a.NameSpace(z).CopyHere s
>>"%ching%" echo Do:If f.FileExists(z) Then:If a.NameSpace(z).Items.Count^>0 Then Exit Do:End If:End If:WScript.Sleep 421:Loop
>>"%ching%" echo WScript.Echo s^&" ==> "^&z
for /f "delims=" %%i in ('dir/b/s "%source%"') do (
  if %%~zi gtr %size% (
        cscript -nologo -e:vbs "%ching%" "%%i" "%destination%\%%~nxi.zip"
  )
)
del /q "%ching%"
echo ================== 完 成 ==================
pause>nul




┏━━━━━━┓ ┃据说是李先生┃ ┠──────┨ ┃*ntRSS┃ ┗━━━━━━┛
2010-3-2 14:15
查看资料  发送邮件  发短消息  网志  OICQ (182484135)  编辑帖子  回复  引用回复
gcdj
初级用户





积分 64
发帖 57
注册 2010-2-25
状态 离线
『第 7 楼』:  

Originally posted by qinchun36 at 2010-3-2 14:15: 。。。 没考虑到系统的性能,重新给你写一个 [code]@echo off set "source=E:\feiqRecieved\hemiao" set "destination=E:\feiqRecieved_ok" set "ching=%temp ...
厉害!~~~~~ 多谢~~~


2010-3-2 17:02
查看资料  发送邮件  发短消息  网志  OICQ (12403198)  编辑帖子  回复  引用回复
gcdj
初级用户





积分 64
发帖 57
注册 2010-2-25
状态 离线
『第 8 楼』:  

qinchun36 如果您有时间能不能吧每个命令都加上注释?我想学习一下您的代码。每一行都是干什么的,我弄不明白。 谢谢你!


2010-3-2 21:16
查看资料  发送邮件  发短消息  网志  OICQ (12403198)  编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 9 楼』:  

本来是两个文件
@echo off :: 这四行是定义变量的值,源文件夹、目标文件夹、临时文件、限制大小 set "source=E:\feiqRecieved\hemiao" set "destination=E:\feiqRecieved_ok" set "ching=%temp%\~$ching$.tmp" set /a size=10*1024*1024 :: 如果目标文件夹不存在则创建它 if not exist "%destination%" md "%destination%" ::下面5行是临时生成一个VBS文件,他才是真正进行压缩操作的 > "%ching%" echo s=WScript.Arguments(0):z=WScript.Arguments(1) >>"%ching%" echo Set a=CreateObject("Shell.Application"):Set f=CreateObject("Scripting.FileSystemObject") >>"%ching%" echo f.OpenTextFile(z,2,True).Write "PK"^&Chr(5)^&Chr(6)^&String(18,Chr(0)):a.NameSpace(z).CopyHere s >>"%ching%" echo Do:If f.FileExists(z) Then:If a.NameSpace(z).Items.Count^>0 Then Exit Do:End If:End If:WScript.Sleep 421:Loop >>"%ching%" echo WScript.Echo s^&" ==> "^&z ::通过DIR /B /S查出源文件夹下所有的文件,如果大小大于限制大小就调用VBS压缩它 for /f "delims=" %%i in ('dir/b/s "%source%"') do ( if %%~zi gtr %size% ( cscript -nologo -e:vbs "%ching%" "%%i" "%destination%\%%~nxi.zip" ) ) del /q "%ching%" echo ================== 完 成 ================== pause>nul 's为第一个参数,z为第二个参数 '分别是原文件和ZIP文件(必须是全路径) s=WScript.Arguments(0):z=WScript.Arguments(1) '创建需要的对象 Set a=CreateObject("Shell.Application"):Set f=CreateObject("Scripting.FileSystemObject") '创建一个空的ZIP文件,只有文件头,固定格式,不要问我为什么 f.OpenTextFile(z,2,True).Write "PK"&Chr(5)&Chr(6)&String(18,Chr(0)) '把一个用字符串s表示的路径指向的文件添加到zip文件z中 a.NameSpace(z).CopyHere s '由于脚本是执行完就退出,而你的文件比较大,压缩可能还没完成 '因此需要监视一下是否已经生成文件z,并且看看他里面是不是有东西 Do '如果存在文件(虽然之前已经创建,但是系统复制的时候会变成随机文件名,完成后再还原) If f.FileExists(z) Then '如果ZIP中文件数目大于0 If a.NameSpace(z).Items.Count>0 Then '退出循环,表示已经成功 Exit Do End If End If WScript.Sleep 421 Loop '完成后的提示信息 WScript.Echo s&" ==> "&z




┏━━━━━━┓ ┃据说是李先生┃ ┠──────┨ ┃*ntRSS┃ ┗━━━━━━┛
2010-3-3 09:43
查看资料  发送邮件  发短消息  网志  OICQ (182484135)  编辑帖子  回复  引用回复
gcdj
初级用户





积分 64
发帖 57
注册 2010-2-25
状态 离线
『第 10 楼』:  

弄明白拉,谢谢你详细说明。


2010-3-3 17:52
查看资料  发送邮件  发短消息  网志  OICQ (12403198)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: