使用VBScript+7-Zip创建TAR文件失败求助
问题:Altap Salamander VBScript打包TAR文件报错Shell error 1
我正在为Altap Salamander编写VBScript,希望将当前选中的文件分别打包为TAR格式。以下代码大部分可正常运行,但第27行的Shell命令返回Shell error 1,且未生成任何TAR文件。
Dim FSO, WshShell Set FSO = CreateObject("Scripting.FileSystemObject") Set WshShell = CreateObject("WScript.Shell") Dim Items, Item, result ' Pick the collection of items to make the list from. If Salamander.SourcePanel.SelectedItems.Count = 0 Then If Salamander.MsgBox("No items are selected. Do you want to make list from all items in the panel?", 4, "Question") = 6 Then Set Items = Salamander.SourcePanel.Items End If Else Set Items = Salamander.SourcePanel.SelectedItems End If ReDim args(Items.Count - 1) For i = 0 To Items.Count - 1 args(i) = Items.Item(i).Path Next tarFilePath = FSO.GetParentFolderName(args(0)) For i = 0 To UBound(args) objFile = args(i) tarFileName = FSO.GetFile(objFile).Name & ".tar" tarFile = tarFilePath & "\" & tarFileName result = WshShell.Run("cmd.exe /c ""C:\Program Files\7-Zip\7zFM.exe"" a -ttar -r """ & tarFile & """ """ & FSO.GetFile(objFile).Path & """", 0, True) Next If result = 0 Then result = "Shell ran successfully" Else result = "Shell error " & result End If MsgBox result, vbInformation, "Archiving Complete"
我尝试过将7z.exe更换为7zG.exe和7zFM.exe,添加或移除引号并进行调试,也试过Stack Overflow上的CMD方法,但均未奏效。请问该如何解决这个问题?
解决方案
核心问题定位
Shell error 1本质是命令执行参数错误,你的代码存在两个关键问题:
- 用错7-Zip程序:7zFM.exe是图形界面客户端,不支持命令行归档操作,必须使用命令行版本的
7z.exe; - 路径逻辑缺陷:所有TAR包都存在第一个文件的父目录,若选中跨目录文件,会触发权限或路径不存在的错误。
修复后的完整代码
Dim FSO, WshShell Set FSO = CreateObject("Scripting.FileSystemObject") Set WshShell = CreateObject("WScript.Shell") Dim Items, Item, result, lastResult ' 选择要处理的文件集合 If Salamander.SourcePanel.SelectedItems.Count = 0 Then If Salamander.MsgBox("未选中任何文件,是否处理面板中所有文件?", 4, "提示") = 6 Then Set Items = Salamander.SourcePanel.Items End If Else Set Items = Salamander.SourcePanel.SelectedItems End If ' 无文件时直接退出,避免后续报错 If IsEmpty(Items) Then Salamander.MsgBox("没有文件需要处理", vbInformation, "提示") WScript.Quit End If ReDim args(Items.Count - 1) For i = 0 To Items.Count - 1 args(i) = Items.Item(i).Path Next lastResult = 0 For i = 0 To UBound(args) objFile = args(i) ' 每个TAR包放在原文件的同目录下 tarFileName = FSO.GetFile(objFile).Name & ".tar" tarFile = FSO.GetParentFolderName(objFile) & "\" & tarFileName ' 使用命令行版7z.exe,移除多余的-r参数(单个文件不需要递归) cmd = "cmd.exe /c ""C:\Program Files\7-Zip\7z.exe"" a -ttar """ & tarFile & """ """ & objFile & """" result = WshShell.Run(cmd, 0, True) ' 记录最后一次错误,避免循环中被覆盖 If result <> 0 Then lastResult = result Next ' 输出最终结果 If lastResult = 0 Then resultText = "所有文件归档成功" Else resultText = "Shell错误 " & lastResult & ",部分文件可能未归档" End If MsgBox resultText, vbInformation, "归档完成"
关键修复说明
- 替换为7z.exe:这是7-Zip的命令行专用工具,支持通过参数执行归档操作;
- 调整TAR包路径:每个文件的TAR包放在自身所在目录,避免跨目录权限或路径问题;
- 移除-r参数:单个文件打包不需要递归目录,多余参数可能导致解析错误;
- 错误状态优化:记录最后一次错误,防止循环中错误被后续执行覆盖;
- 增加空集合判断:无文件时直接退出,避免后续代码触发无效操作报错。
调试技巧
如果仍然报错,可将WshShell.Run的第二个参数改为1,这样会弹出CMD窗口,直接查看7-Zip返回的具体错误信息,快速定位问题:
result = WshShell.Run(cmd, 1, True)
内容的提问来源于stack exchange,提问作者siliconlemon
相关产品推荐
相关产品推荐

