You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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本质是命令执行参数错误,你的代码存在两个关键问题:

  1. 用错7-Zip程序:7zFM.exe是图形界面客户端,不支持命令行归档操作,必须使用命令行版本的7z.exe;
  2. 路径逻辑缺陷:所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:55:15