中国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 楼』:  



  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
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 楼』:  

本来是两个文件

  Quote:
@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)  编辑帖子  回复  引用回复

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


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



论坛跳转: