中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]批量压缩解压XX_(CAB格式)文件及VBS问题求助
作者:
标题: [求助]批量压缩解压XX_(CAB格式)文件及VBS问题求助 上一主题 | 下一主题
wangjf
中级用户




积分 254
发帖 63
注册 2003-4-8
状态 离线
『楼 主』:  [求助]批量压缩解压XX_(CAB格式)文件及VBS问题求助

在压缩CAB格式文件时,发现使用MakeCAB.EXE压缩文件后,文件的时间属性都会改变,另外凡是基于MakeCAB.EXE的压缩程序都有这个改变时间属性的现象。后经试用发现CABARC.EXE和 Cabinet Manager2003 不会改变压缩后的文件时间属性。
      因为经常进行批量压缩操作,就在网上找到了这个软件ExMk_CAB.EXE。它是利用VBS调用CABARC.EXE来压缩和解压的,可以点击右键实现批量压缩和解压,并且在Win2003系统中可以压缩成包含目录的文件。可是前几天一下就无法使用了,窗口提示如图。那位大侠能帮小弟解惑,不胜感谢。
ExMk_CAB.EXE下载地址:
http://zhenlove.com.cn/cndos/fileup/files/ExMk_CAB.zip
出错截图:


===============================================
Cab_Make.VBS脚本:
If WScript.Arguments.Count <> 1 Then WScript.Quit
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSS = CreateObject("Wscript.Shell")
F = WScript.Arguments(0)
If FSO.FileExists(F) Then
        FileExt = UCase(FSO.GetExtensionName(F))
        If FileExt = "CAB" Or Right(FileExt,1) = "_" Then WScript.Quit
        FilePath = FSO.GetParentFolderName(F)
        FileFName = FSO.GetFileName(F)
        FileBName = FSO.GetBaseName(F)
        TEMP = WSS.ExpandEnvironmentStrings("%TEMP%")
        If FSO.FileExists(TEMP & "\modifype.tmp") Then FSO.DeleteFile TEMP & "\modifype.tmp",True
        MpeErr = WSS.Run("MODIFYPE.EXE " & UCase(FSO.GetFile(F).ShortPath) & " -c",0,True)
        If MpeErr <> 0 Then
                If FSO.FileExists(TEMP & "\modifype.tmp") Then
                        If FSO.FileExists(F) Then FSO.DeleteFile F,True
                        FSO.MoveFile TEMP & "\modifype.tmp",F
                End If
                Call MsgBox("MODIFYPE can't patch " & Chr(34) & FileFName & Chr(34),vbOKOnly,"Error")
                WScript.Quit
        End If
        If FileExt = "" Then
                FC = UCase(FilePath & "\" & FileBName & "._")
        Else
                FC = UCase(FilePath & "\" & FileBName & "." & Mid(FileExt,1,2) & "_")
        End If
        CabErr = WSS.Run("CABARC.EXE -m LZX:21 N " & Chr(34) & FC & Chr(34) & " " & Chr(34) & F & Chr(34),1,True)
        If CabErr <> 0 Then
                Call MsgBox("CABARC can't compress file " & Chr(34) & FileFName & Chr(34),vbOKOnly,"Error")
        Else
                If FSO.FileExists(F) Then FSO.DeleteFile F,True
        End If
End If
If FSO.FolderExists(F) Then
        WSS.CurrentDirectory = F
        CabErr = WSS.Run("CABARC.EXE -m LZX:21 -p -r N " & Chr(34) & UCase(F) & ".CAB" & Chr(34) & " *.*",1,True)
        If CabErr <> 0 Then
                Call MsgBox("CABARC can't compress folder " & Chr(34) & FSO.GetFolder(F).Name & Chr(34),vbOKOnly,"Error")
        End If
End If
==============================================
Cab_Exct.VBS脚本:
If WScript.Arguments.Count <> 1 Then WScript.Quit
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSS = CreateObject("Wscript.Shell")
F = WScript.Arguments(0)
If FSO.FileExists(F) Then
        FileExt = UCase(FSO.GetExtensionName(F))
        FilePFolder = FSO.GetFile(F).ParentFolder
        FileFName = FSO.GetFileName(F)
        If FileExt = "CAB" Then
                FileBName = FSO.GetBaseName(F)
                NewFolder = FilePFolder & "\" & FileBName
                If Not FSO.FolderExists(NewFolder) Then FSO.CreateFolder(NewFolder)
                WSS.CurrentDirectory = NewFolder
                CabErr = WSS.Run("CABARC.EXE -o -p X " & Chr(34) & F & Chr(34),1,True)
                If FSO.GetFolder(NewFolder).Size = 0 Then CabErr = 1
                If CabErr <> 0 Then
                        WSS.CurrentDirectory = FSO.GetFolder(NewFolder).ParentFolder
                        FSO.DeleteFolder NewFolder,True
                        Call MsgBox("CABARC can't decompress file " & Chr(34) & FileFName & Chr(34),vbOKOnly,"Error")
                End If
                WScript.Quit
        End If
        If Right(FileExt,1) = "_" Then
                WSS.CurrentDirectory = FilePFolder
                CabErr = WSS.Run("CABARC.EXE X " & Chr(34) & F & Chr(34),1,True)
                If CabErr <> 0 Then
                        Call MsgBox("CABARC can't decompress file " & Chr(34) & FileFName & Chr(34),vbOKOnly,"Error")
                Else
                        If FSO.FileExists(F) Then FSO.DeleteFile F,True
                End If
                WScript.Quit
        End If
End If
===============================================

另外有没有更好的使用右键调用CABARC.EXE批量压缩CAB的批处理程序。自己写了很简单的供大家参考。
===============================================

  Quote:

  1. REM Run @ NT/2000/WinXP/Win2003
  2. @ECHO OFF
  3. COLOR 21

  4. TITLE 批量压制当前目录中的所有文件为*.XX_(CAB格式)文件
  5. IF EXIST %CD%\XX_ RD /S /Q %CD%\XX_
  6. IF NOT EXIST %CD%\XX_ MD %CD%\XX_

  7. FOR /F %%i IN ('dir/B/O "%CD%"\*.*') DO CABARC -m LZX:21 N %CD%\XX_\%%i "%CD%"\%%i
  8. REN %CD%\XX_\*.* *.??_
  9. ::REG ADD HKCR\*\shell\压制为*.XX_文件(CAB格式)\Command /ve /d MAkeCABs /f
  10. goto :EOF
        无奈何发表于:  2007-05-15  00:01

===============================================


[ Last edited by wangjf on 2007-5-15 at 12:03 AM ]

2007-5-13 16:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 2 楼』:  

把Cab_Make.VBS 发上来看看



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-5-13 16:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wangjf
中级用户




积分 254
发帖 63
注册 2003-4-8
状态 离线
『第 3 楼』:  

已经上传了

[ Last edited by wangjf on 2007-5-15 at 12:02 AM ]

2007-5-13 16:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 4 楼』:  

看图的样子你要重新安装一下wsh了,或者是你的杀毒软件控制了FSO

在我这里运行很正常,只是压完的扩展名居然要手动改成cab,不过解压还是很顺利的。所以那个东西应该没问题啊。要考虑系统环境了。



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-5-13 16:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wangjf
中级用户




积分 254
发帖 63
注册 2003-4-8
状态 离线
『第 5 楼』:  

谢谢baomaboy兄,想要生成的就是*.XX_文件。我把标题改了一下。

我对VBS一点也不了解,所以不知道WSH和FSO指什么,还请仁兄多指点一二。:)

2007-5-13 18:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 6 楼』:  

WSH简说就是VBS所需的运行环境你可以搜一下这方面的帮助或教程看具体解释,FSO就是这个环境中被调用来操作文件的对象(Scripting.FileSystemObject)

看那出错提示是文件系统对象出错,所以后面所有用到FSO的语句都瘫痪。
你可以先关了杀毒软件再试试,如果你没装杀毒软件重装wsh或重注册DLL试试

[ Last edited by baomaboy on 2007-5-13 at 06:24 PM ]



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-5-13 18:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wangjf
中级用户




积分 254
发帖 63
注册 2003-4-8
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by baomaboy at 2007-5-13 06:18 PM:
WSH简说就是VBS所需的运行环境你可以搜一下这方面的帮助或教程看具体解释,FSO就是这个环境中被调用来操作文件的对象(Scripting.FileSystemObject)

看 ...

下载WindowsServer2003-Script56-KB917344-x86-chs.exe,安装后CAB_Make.VBS正常了(我的系统是Win2003)。
但这个VBS脚本:
Set objShell = CreateObject(“Wscript.Shell”)

objShell.Run “notepad”
出现下图的错误


2007-5-13 20:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wudixin96
银牌会员





积分 1928
发帖 931
注册 2007-1-6
状态 离线
『第 8 楼』:  


Set objShell = CreateObject("Wscript.Shell")

objShell.Run "notepad"
引号问题。

2007-5-13 20:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 9 楼』:  

不要用输入法状态的引号



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-5-13 21:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wangjf
中级用户




积分 254
发帖 63
注册 2003-4-8
状态 离线
『第 10 楼』:  

多谢楼上两位,的确是引号的问题。

2007-5-13 21:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: