Я пытаюсь сделать 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 из здесь, но они не имели для меня особого смысла, и у меня ничего не получилось.
Что я должен сделать, чтобы это сработало?
Я бы также создал версию кода .vbs для тестирования вне Altap Salamander. Это может помочь упростить отладку.
Вы не учли пробел в Program Files. Попробуйте strRun = """C:\Program Files\7-Zip\7z.exe"" a -ttar -r " & tarFile & " " & FilePath & ""





Я сделал очистку кода, как советовали, и все работает нормально!
Теперь цикл 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
Всем спасибо!
Вы проверили свою строку
.Runс помощьюMsgBox?FSO.GetFile(objFile).Pathэто то же самое, чтоtarFilePath? Если да, то это то, что можно упростить. ТакжеCmd.exe /cне нужен. Просто запустите программу Zip напрямую.