7zip komprimiert nur bestimmte Dateien

7zip komprimiert nur bestimmte Dateien

Ich habe ein Skript zum Komprimieren und Löschen alter Dateien. Das Skript funktioniert in allen anderen Verzeichnissen einwandfrei, aber in einem bestimmten Verzeichnis funktioniert es nicht. Es versucht zwar, es zu komprimieren, erstellt aber am Ende nur eine leere Zip-Datei mit dem Namen Program.7z. Das lässt mich vermuten, dass die Leerzeichen im Skript nicht richtig maskiert werden. Ich habe in meinen Pfaden doppelte und einfache Anführungszeichen verwendet und die Verkettung der Dateipfade überprüft. Ich habe nicht herausgefunden, was es sein könnte. Irgendwelche Ideen?

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

Antwort1

Ihr Problem liegt in Zeile 41. IhrobjFile.Pfadenthält Leerzeichen, aber Sie fügen es einem Befehlszeilenargument hinzu. Das bedeutet, dass die Leerzeichen in Anführungszeichen eingeschlossen werden sollten, Sie können jedoch keine Anführungszeichen verwenden, da diese zum Verketten der Zeichenfolge verwendet werden. Sie müssen dann die Anführungszeichen maskieren, die in der Endergebniszeichenfolge enthalten sein sollten. In VBS ist das Escape-Zeichen das doppelte Anführungszeichen. Ihre Zeile 41 sollte also folgendermaßen aussehen:

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

Beachten Sie die """"-Sequenzen, die grundsätzlich wie folgt berechnet werden:

  • Erstes doppeltes Anführungszeichen: Anfang der Zeichenfolge
  • Zweites doppeltes Anführungszeichen: maskiert das nächste Zeichen
  • Drittes doppeltes Anführungszeichen: ist das Zeichen, das Sie in Ihrer endgültigen Zeichenfolge haben möchten
  • Viertes Anführungszeichen: Ende der Zeichenfolge

Ich habe es ausprobiert und es funktioniert gut. Sie müssen beide Male entkommen, wenn Sie dasobjFile.PfadFunktion.

verwandte Informationen