7zip архивирует только определенные файлы

7zip архивирует только определенные файлы

У меня есть скрипт для архивирования старых файлов и их удаления. Скрипт отлично работает во всех других каталогах, но один конкретный каталог не работает. Он попытается его архивировать, но в итоге создаст только пустой zip-файл с именем Program.7z. Это заставляет меня думать, что пробелы в скрипте не экранируются должным образом. Я использовал двойные и одинарные кавычки в своих путях и проверил конкатенацию путей к файлам. Я не нашел, что это может быть. Есть идеи?

Const fileZillaLogs = "C:\Program Files (x86)\Server\Logs"
Const zipProgram = """C:\Program Files\7-Zip\7zG.exe"""
Const zipArgs = "a -mx9"
Dim intZipAge
intZipAge = 7
Dim intDelAge
intDelAge = 90


Call DeleteLogFiles(fileZillaLogs, intZipAge, intDelAge)



Function DeleteLogFiles(strLogPath, intZipAge, intDelAge)
  Const bDEBUG = True
  Dim objFs
  Dim objFolder
  Dim objSubFolder
  Dim objFile
  Dim objWShell
  Dim strCommand
  Dim iResult
  Set objWShell = CreateObject("WScript.Shell")
  Set objFs = CreateObject("Scripting.FileSystemObject")
  If Right(strLogPath, 1) <> "\" Then
    strLogPath = strLogPath & "\"
  End If
  If objFs.FolderExists(strLogPath) Then
    Set objFolder = objFs.GetFolder(strLogPath)
      For Each objSubFolder in objFolder.subFolders
        DeleteLogFiles strLogPath & objSubFolder.Name, intZipAge, intDelAge
      Next
      For Each objFile in objFolder.Files
        If bDebug Then wscript.echo vbTab & "reviewing file = " & strLogPath & objFile.Name
        If DateDiff("d",objFile.DateLastModified,Date) > intDelAge Then
          If bDebug Then wscript.echo "Deleting because its old" End If
          objFs.DeleteFile(strLogPath & objFile.Name)
        Else If DateDiff("d",objFile.DateLastModified,Date) > intZipAge _
          And (Right(objFile.Name, 4) = ".log") Then
            If bDebug Then wscript.echo vbTab & "zipping file = " & objFile.Path
            strCommand = zipProgram & " " & zipArgs & " " & objFile.Path & ".7z" & " " & objFile.Path
            iResult = objWShell.Run(strCommand, 0, "false")
            If bDebug Then wscript.echo vbTab & "zipping result = " & iResult
            If bDebug Then wscript.echo vbTab & "deleting file = " & strLogPath & objFile.Name
            objFs.DeleteFile(strLogPath & objFile.Name)
            End If
        End If
      Next
    Set objFs = Nothing
    Set objFolder = Nothing
    Set objWShell = nothing
  End If
End Function

решение1

Ваша проблема находится на строке 41. ВашobjFile.Путьсодержит пробелы, но вы добавляете их в аргумент командной строки. Это означает, что пробелы должны быть заключены в кавычки, но вы не можете использовать кавычки, поскольку они используются для объединения строки. Затем вы должны экранировать кавычки, которые должны быть в конечной строке результата. В VBS экранирующим символом является символ двойной кавычки. Таким образом, ваша строка 41 должна выглядеть так:

strCommand = zipProgram & " " & zipArgs & " " & """" & objFile.Path & ".7z" & """" & " " & """" & objFile.Path & """"

Обратите внимание на последовательности """", которые в основном рассчитываются следующим образом:

  • Первая двойная кавычка: начало строки
  • Вторая двойная кавычка: экранирует следующий символ
  • Третья двойная кавычка: символ, который вы хотите видеть в финальной строке
  • Четвертая двойная кавычка: конец строки

Я проверил, и это работает отлично. Вам нужно выйти оба раза, когда вы используетеobjFile.Путьфункция.

Связанный контент