Проблемы с созданием файлов TAR с помощью 7-zip (VBScript+CMD)

Я пытаюсь сделать VBScript для Altap Salamander, который будет брать файлы из текущего выбора и отдельно архивировать их как TAR.

Большая часть приведенного ниже кода работает, но команда оболочки в строке 27 возвращает ошибку оболочки 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, добавляя и удаляя кавычки и выполняя отладку.

Я также пробовал методы CMD из здесь, но они не имели для меня особого смысла, и у меня ничего не получилось.

Что я должен сделать, чтобы это сработало?

Вы проверили свою строку .Run с помощью MsgBox? FSO.GetFile(objFile).Path это то же самое, что tarFilePath? Если да, то это то, что можно упростить. Также Cmd.exe /c не нужен. Просто запустите программу Zip напрямую.

LesFerch 09.02.2023 15:10

Я бы также создал версию кода .vbs для тестирования вне Altap Salamander. Это может помочь упростить отладку.

LesFerch 09.02.2023 16:04

Вы не учли пробел в Program Files. Попробуйте strRun = """C:\Program Files\7-Zip\7z.exe"" a -ttar -r " & tarFile & " " & FilePath & ""

LesFerch 10.02.2023 22:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновление и решение:

Я сделал очистку кода, как советовали, и все работает нормально!

Теперь цикл for выглядит так:

For i = 0 To UBound(args)
  objFile = args(i)
  FilePath = FSO.GetFile(objFile).Path
  tarFileName = FSO.GetFile(objFile).Name 
  tarFileName = Split(tarFileName, ".")(0) & ".tar"
  tarFilePath = tarFileFold & "\" & tarFileName
  strRun = """C:\Program Files\7-Zip\7z.exe"" a -ttar -r " & tarFilePath & " " & FilePath & ""
  Err.Clear
  On Error Resume Next
  result = WshShell.Run(strRun, 0, True)
  If Err Then
    MsgBox "Error " & Err.Number & " " & Err.Description
  End If
  On Error Goto 0
Next

Кому интересно, команда strRun выглядит так:

"C:\Program Files\7-Zip\7z.exe" a -ttar -r C:\Users\ondre\img123.tar C:\Users\ondre\img123.jpg

Это будет работать с любыми расширениями архивации, которые может предложить 7zip. Просто не забудьте изменить расширение файла и переключатель -txxx. Вы также можете добавить переключатель mx9, чтобы обеспечить максимальный уровень сжатия. Пример здесь:

"C:\Program Files\7-Zip\7z.exe" a -tzip -mx9 -r C:\Users\ondre\img123.zip C:\Users\ondre\img123.jpg

WshShell.Run теперь возвращает 1. Мне не удалось найти какую-либо документацию, из которой я мог бы сказать, нормально это или нет, поэтому, думаю, я просто полностью отключу проверку «результата» и буду в пути.

Кроме того, поскольку это скрипт для Altap Salamander, я нашел более простой способ получения файлов из одного места в другое, например:

tarFileFold = Salamander.TargetPanel.Path
'will output the archived files to the oposing panel of Salamander, both left -> right & right -> left

tarFileFold = Salamander.SourcePanel.Path
'will output the files to the same folder as the source files. Similar to the first version, but without the use of FSO

Всем спасибо!

Другие вопросы по теме